Тема
I18n Bundle
I18n Bundle — отдельный доменный документ переводов. Он редактируется в собственной вкладке Configurator и содержит несколько locale trees в одном документе.
json
{
"ru": {
"title": "Расписание",
"columns": {
"status": "Статус"
}
},
"en": {
"title": "Schedule",
"columns": {
"status": "Status"
}
}
}Документ становится доступен компонентам только после явной регистрации в Composition:
ts
defineComposition({
resources: {
schedule: i18n('schedule-default'),
},
runtimes: {
page: component('schedule-page'),
},
})schedule — публичный alias, schedule-default — identity документа. SFC обращается к переводу через alias и dot-path:
vue
<Text>{{ t('schedule:columns.status') }}</Text>t() является встроенной функцией безопасных Component SFC template expressions. Её не нужно импортировать, получать через useI18n или объявлять в defineProps. В <script setup> она не выполняется как обычная JavaScript функция.
t(key, fallback?) сначала читает текущую locale из Endge.context, затем workspace fallback locale. Если значение отсутствует, возвращается переданный fallback, а без него — заметный маркер {{schedule:columns.status}}.
Вложенные Composition
Catalog накапливается от родительской Composition к дочерней и учитывает named lifecycle scopes. Полный публичный ключ состоит из alias и пути сообщения. Если descendant повторно объявляет уже доступный ключ, compiler публикует fatal diagnostic composition-i18n-key-collision; artifact получает статус error и Composition не запускается.
text
parent: schedule:columns.status
child: schedule:columns.status - compile error
child: details:columns.status - допустимоЭто правило не является override-механизмом. Specific override pattern для tenant-specific документов добавляется отдельным этапом.
Реактивность locale
Locale хранится в Endge.context. При её изменении runtime инвалидирует активные application scopes и повторно рендерит все renderable roots. Отдельные подписки useI18n внутри каждого SFC не требуются.