Как перевести пользовательские каналы в angular с использованием i18n?

#angular #localization #internationalization

#angular #локализация #интернационализация

Вопрос:

Я перевожу свое приложение Angular 7 с использованием i18n, и у меня есть пользовательские каналы, которые создают текст. Как я могу перевести текст, созданный каналами?

Я придерживаюсь руководства по i18n, предоставленного angular docs, я использую эту стратегию слияния xliff для разработки, и я использую это руководство для своих сборок в зависимости от локали.

Например, я пытаюсь перевести этот канал time ago, в котором числа преобразуются в текст.

На данный момент я понятия не имею, как перевести пользовательские каналы. Я знаю только, как переводить html-теги, используя i18n атрибут, который, похоже, не применим к пользовательским каналам, которые я использую.

В этом параграфе angular i18n предлагается установить какую-то глобальную переменную в main app.module.ts , но примеров немного мало, и (а) я не знаю, как установить локаль в зависимости от сборки для каждого языка, как я делаю после этого руководства, (б) я не знаю, как получить глобальную локаль в моем пользовательском канале и (в) возможно ли перевести содержимое канала в messages.<locale>.xlf файлы, а не внутри канала?

Ответ №1:

Обычно в этой ситуации вы можете добавить TranslateService в качестве зависимости в свой канал и просто перевести из кода.

Итак, ваш конструктор в канале будет выглядеть так:

 constructor(private changeDetectorRef: ChangeDetectorRef, private ngZone: NgZone, private tr: TranslateService) {}
  

И в вашей функции преобразования вы можете вернуть текстовое значение с помощью этого:

 // [...]
} else if (days <= 545) {
  return this.tr.instant('time.one-year-ago');
} else { // (days > 545)
  return this.tr.instant('time.years-ago', { years });
}
// [...]

  

Комментарии:

1. Спасибо за ответ, главный операционный директор! Я думаю, что использование службы перевода каналов будет неизбежным. Тем не менее, я предпочитаю иметь все переводы в одном месте, но это не кажется практичным. Сообщу вам об этом как можно скорее.

2. Предложенное мной решение позволяет вам по-прежнему сохранять ваши переводы в одном месте!

3. TranslateService, похоже, не является решением, поскольку этот сервис не является частью Angular, а является сторонним модулем (ngx-translate). Я еще не нашел решения.

4. Вы могли бы заставить свои каналы возвращать обычный текст или строки перевода и при этом иметь атрибут i18 в вашем шаблоне. например: <h1 i18n>{{ some.data | myCustomPipe }}</h1> . Соответствует ли это вашим потребностям?