Skip to content

Translations

This is a guide, not the contract. What the platform guarantees is specified under openspec/specs/. For this page: i18n. Where this page and a specification disagree, the specification is right, and that is a defect in this page: change the behaviour there, then explain it here.

Titles/labels are translation keys resolved by the host’s Transloco. Ship your weaver’s strings as a namespace: the distribution registers provideTranslationNamespaces('notes') and serves /i18n/notes/{lang}.json; your keys then live under notes.* and can never collide with host keys. The file itself does not repeat the namespace, because the loader nests it under the name:

// /i18n/notes/en.json resolved keys
{
"list": "Notes", // → notes.list
"admin": "Admin tools" // → notes.admin
}

A literal string with no matching key renders as-is, so you can start with literals and add i18n later. (See building a distribution for the wiring.)

Body text is yours. The host resolves keys only for contribution metadata (view/command/item titles, settings labels, the tagline), so ctx deliberately has no translate function for the free text inside your views and dialogs. Keep that text as literals, or import @jsverse/transloco directly if you need runtime language switching inside the body. That import is the one documented exception to “a weaver imports only @loomweaver/plugin-sdk”: Transloco is a third-party library you depend on yourself, not a LoomWeaver API. The platform contract stays exactly the SDK’s exports.

Where next