#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>
. Соответствует ли это вашим потребностям?