#angular-i18n
#angular-i18n
Вопрос:
Мы используем @angular/localize (версия 9.1.12) и имеем проблему с заполнителями в локализованном тексте.
Например. у нас есть:
$localize`:@@form.hint:Some text ${name} in service.`;
или
$localize`:@@form.hint:Some text ${name}:name: in service.`;
Поскольку текстовые строки локализации в файлах typescript не извлекаются, мы помещаем их в шаблон компонента.
Например.:
<p i18n="@@form.hint">Some text {{ name }} in service.</p>
После выполнения xi18n мы получаем файлы messages.xlf (и messages.de.xlf), которые содержат следующее:
<trans-unit id="form.hint" datatype="html">
<source>Some text <x id="INTERPOLATION" equiv-text="{{ name }}"/> in service.</source>
<target state="new">Some text <x id="INTERPOLATION" equiv-text="{{ name }}"/> in service.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/translation/translation.component.html</context>
<context context-type="linenumber">207</context>
</context-group>
</trans-unit>
Когда мы запускаем приложение с помощью ng serve, мы получаем следующую ошибку:
ERROR in There is a placeholder name mismatch with the translation provided for the message "form.hint" ("Some text {$PH} in service.").
The translation contains a placeholder with name INTERPOLATION, which does not exist in the message.
Приложение не работает. После перезагрузки ошибка не возникает, и приложение работает. Перед перезапуском ничего не изменилось.
Мы можем работать с локальным перезапуском, но после каждого изменения файлов messages.xlf ошибка возникает снова, и нам нужны две ci-сборки на нашем сервере сборки, чтобы получить рабочую установку на нашей тестовой машине.
Есть идеи, что может быть причиной несоответствия заполнителя?
Ответ №1:
Для текущей версии angular (10.1.3) вам необходимо выбрать извлечение токенов перевода через ivy:
ng xi18n --ivy
Результат будет включать тексты из $localize
.