ОШИБКА в несоответствии имени заполнителя предоставленному переводу

#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 .