Чтобы подготовить проект к переводу, выполните следующие действия.
- Используйте атрибут
i18nдля пометки текста в шаблонах компонентов - Используйте атрибут
i18n-для пометки текстовых строк атрибутов в шаблонах компонентов - Используйте tagged message string
$localizeдля пометки текстовых строк в коде компонентов
Пометка текста в шаблоне компонента
В шаблоне компонента метаданные i18n — это значение атрибута i18n.
<element i18n="{i18n_metadata}">{string_to_translate}</element>
Используйте атрибут i18n, чтобы пометить статическое текстовое сообщение в шаблонах компонентов для перевода.
Размещайте его на каждом теге элемента, который содержит фиксированный текст, который вы хотите перевести.
ПОЛЕЗНО: Атрибут i18n — это пользовательский атрибут, который распознают инструменты и компиляторы Angular.
Пример i18n
Следующий тег <h1> отображает простое приветствие на английском языке, "Hello i18n!".
app.component.html
<h1>Hello i18n!</h1>
Чтобы пометить приветствие для перевода, добавьте атрибут i18n к тегу <h1>.
app.component.html
<h1 i18n>Hello i18n!</h1>
использование условного оператора с i18n
Следующий тег <div> будет отображать переведённый текст как часть div и aria-label в зависимости от статуса переключателя
Перевод inline-текста без HTML-элемента
Используйте элемент <ng-container>, чтобы связать поведение перевода с конкретным текстом, не меняя способ отображения текста.
ПОЛЕЗНО: Каждый HTML-элемент создаёт новый DOM-элемент.
Чтобы избежать создания нового DOM-элемента, оберните текст в элемент <ng-container>.
Следующий пример показывает элемент <ng-container>, преобразованный в не отображаемый HTML-комментарий.
<ng-container i18n>I don't output any element</ng-container>
Именование placeholder интерполяции
По умолчанию Angular генерирует имя placeholder для каждой интерполяции в переводимом сообщении. Чтобы дать ему осмысленное имя, которое помогает переводчикам понять контекст, добавьте комментарий //i18n(ph="name") внутри интерполяции.
<element i18n>{{ expression //i18n(ph="placeholder_name") }}</element>
Например:
<p i18n>Hello, {{ username //i18n(ph="name") }}!</p>
Это эквивалент в шаблоне именования placeholder в коде компонента с $localize:
$localize`Hello, ${username}:name:!`;
Пометка атрибутов элементов для перевода
В шаблоне компонента метаданные i18n — это значение атрибута i18n-{attribute_name}.
<element i18n-{attribute_name}="{i18n_metadata}" {attribute_name}="{attribute_value}" />
Атрибуты HTML-элементов включают текст, который следует переводить вместе с остальным отображаемым текстом в шаблоне компонента.
Используйте i18n-{attribute_name} с любым атрибутом любого элемента и замените {attribute_name} на имя атрибута.
Используйте следующий синтаксис, чтобы назначить meaning, description и пользовательский ID.
i18n-{attribute_name}="{meaning}|{description}@@{id}"
Пример i18n-title
Чтобы перевести title изображения, рассмотрите этот пример.
Следующий пример отображает изображение с атрибутом title.
app.component.html
<img [src]="logo" title="Angular logo" alt="Angular logo" />
Чтобы пометить атрибут title для перевода, выполните следующее действие.
Добавьте атрибут i18n-title
Следующий пример показывает, как пометить атрибут title на теге img, добавив i18n-title.
app.component.html
<img [src]="logo" i18n-title title="Angular logo" alt="Angular logo" />
Пометка текста в коде компонента
В коде компонента исходный текст перевода и метаданные окружены символами backtick (`).
Используйте tagged message string $localize, чтобы пометить строку в коде для перевода.
$localize`string_to_translate`;
Метаданные i18n окружены символами двоеточия (:) и предшествуют исходному тексту перевода.
$localize`:{i18n_metadata}:string_to_translate`;
Включение интерполированного текста
Включайте интерполяции в tagged message string $localize.
$localize`string_to_translate ${variable_name}`;
Именование placeholder интерполяции
$localize`string_to_translate ${variable_name}:placeholder_name:`;
Условный синтаксис для переводов
Метаданные i18n для перевода
{meaning}|{description}@@{custom_id}
Следующие параметры предоставляют контекст и дополнительную информацию, чтобы уменьшить путаницу для переводчика.
| Параметр метаданных | Подробности |
|---|---|
| Custom ID | Предоставить пользовательский идентификатор |
| Description | Предоставить дополнительную информацию или контекст |
| Meaning | Предоставить смысл или намерение текста в конкретном контексте |
Для дополнительной информации о пользовательских ID см. Управление помеченным текстом с пользовательскими ID.
Добавление полезных описаний и смыслов
Чтобы точно перевести текстовое сообщение, предоставьте дополнительную информацию или контекст для переводчика.
Добавьте description текстового сообщения как значение атрибута i18n или tagged message string $localize.
Следующий пример показывает значение атрибута i18n.
app.component.html
<h1 i18n="An introduction header for this sample">Hello i18n!</h1>
Следующий пример показывает значение tagged message string $localize с описанием.
$localize`:An introduction header for this sample:Hello i18n!`;
Переводчику также может понадобиться знать смысл или намерение текстового сообщения в этом конкретном контексте приложения, чтобы перевести его так же, как другой текст с тем же смыслом.
Начните значение атрибута i18n с meaning и отделите его от description символом |: {meaning}|{description}.
Пример h1
Например, может понадобиться указать, что тег <h1> — это заголовок сайта, который нужно переводить одинаково, используется ли он как заголовок или на него ссылаются в другом разделе текста.
Следующий пример показывает, как указать, что тег <h1> должен переводиться как заголовок или на него ссылаются в другом месте.
app.component.html
<h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1>
В результате любой текст, помеченный как site header, как meaning переводится точно так же.
Следующий пример кода показывает значение tagged message string $localize с meaning и description.
$localize`:site header|An introduction header for this sample:Hello i18n!`;
How meanings control text extraction and merges
Инструмент извлечения Angular генерирует запись translation unit для каждого атрибута i18n в шаблоне.
Инструмент извлечения Angular назначает каждой translation unit уникальный ID на основе meaning и description.
ПОЛЕЗНО: Для дополнительной информации об инструменте извлечения Angular см. Работа с файлами перевода.
Одинаковые текстовые элементы с разными meanings извлекаются с разными ID. Например, если слово "right" использует следующие два определения в двух разных местах, слово переводится по-разному и объединяется обратно в приложение как разные записи перевода.
correctкак в "you are right"directionкак в "turn right"
Если одинаковые текстовые элементы соответствуют следующим условиям, текстовые элементы извлекаются только один раз и используют один и тот же ID.
- Тот же смысл или определение
- Разные описания
Эта одна запись перевода объединяется обратно в приложение везде, где появляются одинаковые текстовые элементы.
Выражения ICU
Выражения ICU помогают помечать альтернативный текст в шаблонах компонентов для соответствия условиям.
Выражение ICU включает свойство компонента, ICU clause и case statements, окружённые символами открывающей фигурной скобки ({) и закрывающей фигурной скобки (}).
{ component_property, icu_clause, case_statements }
Свойство компонента определяет переменную. ICU clause определяет тип условного текста.
| ICU clause | Подробности |
|---|---|
plural |
Пометить использование множественных чисел |
select |
Пометить выборы альтернативного текста на основе определённых строковых значений |
Чтобы упростить перевод, используйте International Components for Unicode clauses (ICU clauses) с регулярными выражениями.
ПОЛЕЗНО: ICU clauses соответствуют ICU Message Format, указанному в правилах плюрализации CLDR.
Пометка множественных чисел
В разных языках разные правила плюрализации, что увеличивает сложность перевода.
Поскольку другие локали выражают кардинальность по-разному, может понадобиться задать категории плюрализации, которые не совпадают с английским.
Используйте clause plural, чтобы пометить выражения, которые могут быть бессмысленными при дословном переводе.
{ component_property, plural, pluralization_categories }
После категории плюрализации введите текст по умолчанию (английский), окружённый символами открывающей фигурной скобки ({) и закрывающей фигурной скобки (}).
pluralization_category { }
Следующие категории плюрализации доступны для английского и могут меняться в зависимости от локали.
| Категория плюрализации | Подробности | Пример |
|---|---|---|
zero |
Количество равно нулю | =0 { } zero { } |
one |
Количество равно 1 | =1 { } one { } |
two |
Количество равно 2 | =2 { } two { } |
few |
Количество 2 или больше | few { } |
many |
Количество — большое число | many { } |
other |
Количество по умолчанию | other { } |
Если ни одна из категорий плюрализации не совпадает, Angular использует other для соответствия стандартному fallback для отсутствующей категории.
other { default_quantity }
ПОЛЕЗНО: Для дополнительной информации о категориях плюрализации см. Choosing plural category names в CLDR - Unicode Common Locale Data Repository.
Многие локали не поддерживают некоторые категории плюрализации.
Локаль по умолчанию (en-US) использует очень простую функцию plural(), которая не поддерживает категорию плюрализации few.
Другая локаль с простой функцией plural() — es.
Следующий пример кода показывает функцию en-US plural().
function plural(n: number): number {
let i = Math.floor(Math.abs(n)),
v = n.toString().replace(/^[^.]*\.?/, '').length;
if (i === 1 && v === 0) return 1;
return 5;
}
Функция plural() возвращает только 1 (one) или 5 (other).
Категория few никогда не совпадает.
Пример minutes
Если нужно отобразить следующую фразу на английском, где x — число.
updated x minutes ago
И также нужно отобразить следующие фразы на основе кардинальности x.
updated just now
updated one minute ago
Используйте HTML-разметку и интерполяции.
Следующий пример кода показывает, как использовать clause plural для выражения предыдущих трёх ситуаций в элементе <span>.
app.component.html
<span i18n
>Updated
{minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span
>
Рассмотрите следующие детали в предыдущем примере кода.
| Параметры | Подробности |
|---|---|
minutes |
Первый параметр указывает, что свойство компонента — minutes, и определяет количество минут. |
plural |
Второй параметр указывает, что ICU clause — plural. |
=0 {just now} |
Для нуля минут категория плюрализации — =0. Значение — just now. |
=1 {one minute} |
Для одной минуты категория плюрализации — =1. Значение — one minute. |
other {{{minutes}} minutes ago} |
Для любой несовпавшей кардинальности категория плюрализации по умолчанию — other. Значение — {{minutes}} minutes ago. |
{{minutes}} — это интерполяция.
Пометка альтернатив и вложенных выражений
Clause select помечает выборы альтернативного текста на основе определённых вами строковых значений.
{ component_property, select, selection_categories }
Переведите все альтернативы, чтобы отображать альтернативный текст на основе значения переменной.
После категории выбора введите текст (английский), окружённый символами открывающей фигурной скобки ({) и закрывающей фигурной скобки (}).
selection_category { text }
В разных локалях разные грамматические конструкции, что увеличивает сложность перевода.
Используйте HTML-разметку.
Если ни одна из категорий выбора не совпадает, Angular использует other для соответствия стандартному fallback для отсутствующей категории.
other { default_value }
Пример gender
Если нужно отобразить следующую фразу на английском.
The author is other
И также нужно отобразить следующие фразы на основе свойства gender компонента.
The author is female
The author is male
Следующий пример кода показывает, как привязать свойство gender компонента и использовать clause select для выражения предыдущих трёх ситуаций в элементе <span>.
Свойство gender привязывает выводы к каждому из следующих строковых значений.
| Значение | Английское значение |
|---|---|
| female | female |
| male | male |
| other | other |
Clause select сопоставляет значения с соответствующими переводами.
Следующий пример кода показывает свойство gender, использованное с clause select.
app.component.html
<span i18n>The author is {gender, select, male {male} female {female} other {other}}</span>
Пример gender и minutes
Объединяйте разные clauses вместе, например clauses plural и select.
Следующий пример кода показывает вложенные clauses на основе примеров gender и minutes.
app.component.html
<span i18n
>Updated:
{minutes, plural,
=0 {just now}
=1 {one minute ago}
other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}
}
</span>