@worthy-ventures/metaglotta-runtime
v1.0.1
Published
The Metaglotta translation runtime: cache, namespace and language fallback, CDN loading and ICU formatting. No framework, no DOM.
Readme
@worthy-ventures/metaglotta-runtime
The Metaglotta translation runtime. No framework, no DOM, no plugins.
import { Metaglotta } from '@worthy-ventures/metaglotta-runtime';
const i18n = Metaglotta({
language: 'el',
fallbackLanguage: 'en',
defaultNs: 'common',
ns: ['common', 'login'],
fallbackNs: ['common'],
backend: { prefix: 'https://cdn.example/langs/app' },
});
await i18n.run();
i18n.t('greeting', { name: 'Ada' });What it does
Holds translations per language and namespace, fetches the ones it needs as
{prefix}/{namespace}/{language}.json, falls back through namespaces and then languages when
a key is missing, formats ICU, and emits an event when any of that changes.
What it does not do
In-context editing. That needs every rendered string traced back to its key, which means
wrapping each one and watching the DOM - a different job, wanted only while authoring. The
authoring build runs on @worthy-ventures/metaglotta-ngx/authoring instead.
Behaviours worth knowing
- A miss echoes the key.
t('nope')returns'nope', so a missing string is visible on the page. PassorEmpty: truefor''instead - which is what the Angular pipe does. - Namespace before language. The lookup exhausts each namespace across every fallback
language before trying the next namespace. A key present in both
login/enandcommon/elresolves tologin/enwhen you asked forlogin. - A missing ICU parameter renders
'invalid'. Not the raw string, and not an empty one. - A file that fails to load costs its namespace, not the load. The record is remembered as
empty so it is not re-requested by every component on the page; the failure is reported on
the
errorevent and to the console. Passbackend.fallbackOnFail: falseto fail the whole load instead.
