Перейти к содержанию

Управление маркированным текстом с пользовательскими идентификаторами

📅 28.02.2022

Экстрактор Angular генерирует файл с записью единицы перевода в каждом из следующих случаев.

  • Каждый атрибут i18n в шаблоне компонента
  • Каждая $localize помеченная строка сообщения в коде компонента.

Как описано в How meanings control text extraction and merges, Angular присваивает каждой единице перевода уникальный идентификатор.

В следующем примере отображаются единицы перевода с уникальными идентификаторами.

1
<trans-unit id="ba0cc104d3d69bf669f97b8d96a4c5d8d9559aa3" datatype="html">

Когда вы изменяете переводимый текст, экстрактор генерирует новый идентификатор для этой единицы перевода. В большинстве случаев изменения в исходном тексте требуют изменений и в переводе.

Поэтому использование нового идентификатора позволяет синхронизировать изменение текста с переводом.

Однако некоторые системы перевода требуют особой формы или синтаксиса для идентификатора. Чтобы удовлетворить это требование, используйте пользовательский идентификатор для маркировки текста.

Большинству разработчиков нет необходимости использовать пользовательский идентификатор.

Если вы хотите использовать уникальный синтаксис для передачи дополнительных метаданных, используйте пользовательский идентификатор.

Дополнительные метаданные могут включать библиотеку, компонент или область приложения, в которой появляется текст.

Чтобы указать пользовательский ID в атрибуте i18n или $localize тегированной строки сообщения, используйте префикс @@. Следующий пример определяет пользовательский идентификатор introductionHeader в элементе заголовка.

1
<h1 i18n="@@introductionHeader">Hello i18n!</h1>

Следующий пример определяет пользовательский идентификатор introductionHeader для переменной.

1
variableText1 = $localize `:@@introductionHeader:Hello i18n!`;

Когда вы указываете пользовательский идентификатор, экстрактор генерирует единицу перевода с пользовательским идентификатором.

1
<trans-unit id="introductionHeader" datatype="html">

Если вы измените текст, экстрактор не изменит идентификатор. В результате вам не придется делать дополнительный шаг для обновления перевода.

Недостатком использования пользовательских идентификаторов является то, что при изменении текста перевод может не синхронизироваться с новым измененным исходным текстом.

Использование пользовательского идентификатора с описанием

Используйте пользовательский идентификатор в сочетании с описанием и значением, чтобы еще больше помочь переводчику.

Следующий пример включает описание, за которым следует пользовательский идентификатор.

1
2
3
4
5
<h1
    i18n="An introduction header for this sample@@introductionHeader"
>
    Hello i18n!
</h1>

Следующий пример определяет пользовательский идентификатор introductionHeader и описание для переменной.

1
variableText2 = $localize `:An introduction header for this sample@@introductionHeader:Hello i18n!`;

В следующем примере добавляется значение.

1
2
3
4
5
<h1
    i18n="site header|An introduction header for this sample@@introductionHeader"
>
    Hello i18n!
</h1>

Следующий пример определяет пользовательский идентификатор introductionHeader для переменной.

1
variableText3 = $localize `:site header|An introduction header for this sample@@introductionHeader:Hello i18n!`;

Определите уникальные пользовательские идентификаторы

Обязательно задавайте уникальные пользовательские идентификаторы. Если вы используете один и тот же идентификатор для двух разных текстовых элементов, инструмент извлечения извлечет только первый, а Angular использует перевод вместо обоих исходных текстовых элементов.

Например, в следующем фрагменте кода один и тот же пользовательский идентификатор myId определен для двух разных текстовых элементов.

1
2
3
<h3 i18n="@@myId">Hello</h3>
<!-- ... -->
<p i18n="@@myId">Good bye</p>

Ниже показан перевод на французский язык.

1
2
3
4
<trans-unit id="myId" datatype="html">
    <source>Hello</source>
    <target state="new">Bonjour</target>
</trans-unit>

Оба элемента теперь используют один и тот же перевод (Bonjour), потому что оба были определены с одним и тем же пользовательским идентификатором.

1
2
3
<h3>Bonjour</h3>
<!-- ... -->
<p>Bonjour</p>

Комментарии