Внести вклад
Подробные руководства
Интернационализация

Подготовка компонента к переводу

Чтобы подготовить проект к переводу, выполните следующие действия.

  • Используйте атрибут 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:`;

Условный синтаксис для переводов

return this.show ? $localize`Show Tabs` : $localize`Hide tabs`;

Метаданные 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>

Что дальше