#angular #localization #internationalization #locale #translation
#угловая #локализация #интернационализация #перевод
Вопрос:
У меня есть приложение Angular 10, которое будет обслуживаться нескольким клиентам. У каждого клиента может быть (это не обязательно) свой собственный набор переведенного текста. Как я могу реализовать такой множественный резервный вариант? Полный сценарий резервного копирования должен выглядеть следующим образом:
[client.fr-CA]-> [client.fr ] -> [client.ru] -> (global-fr-CA) -> (global-fr) -> global-ru
Итак, если текст не найден в client.fr-CA, тогда он будет найден в client.fr , и так далее, пока он не достигнет global-en, который содержит весь текст в приложении.
Я также пытался использовать Angular для собственной реализации i18n, а также пробовал использовать ngx-translate. У обоих из них есть только один запасной вариант. Я даже не нахожу способа реализовать различные варианты локали, подобные этому: (fr-CA) -> (fr) -> en.
Должен ли я реализовать свой собственный механизм перевода? 🙂
Заранее спасибо!
Комментарии:
1. вы имеете в виду, что если перевод не существует в fr-CA.json, вы ищете его в следующем файле?
2. Да, это верно. И если он не найден в следующем файле, искать дальше, пока не будет достигнут global-en, который содержит все тексты. Другие файлы (fr-CA, fr, client.fr , и т.д.) содержит только локализацию, основанную на клиенте и локали, и может содержать несколько (или ни одного) переведенного текста.
Ответ №1:
Нет хорошего способа сделать это, но я предложу вам кое-что, где вы можете получить значение вашего перевода, используя асинхронный канал
представьте, что у вас есть это
<p>{{ 'name' | translate }}</p>
вы должны изменить его на
<p>{{name$ | async }}</>
и получите значение перевода в вашем контроллере на основе ваших условий, допустим, порядок fr -> en -> de
name$: Observable<string> = this.translate.getTranslation(fr).pipe(
switchMap(frTranslations=>
iif(() => !!frTranslations['name'] // check here if exist
, of(frTranslations['name'])
, this.translate.getTranslation(en).pipe(
switchMap(enTranslations=>
iif(() => !!enTranslations['name'] // check here if exist
, of(enTranslations['name'])
, this.translate.getTranslation(de) ...
)
)
)
)
)
);
требуется больше рефакторинга, но я желаю, чтобы вы поняли идею, идея состоит в том, чтобы проверить перевод, если он существует, если да, вы получаете значение, если нет, вы переходите к следующему вызову
Комментарии:
1. Спасибо! Все работает так, как ожидалось. Мне нужно было только изменить значение с null на undefined.
2. я думаю, вы можете изменить условие на () => !!frTranslations[‘name’], чтобы проверить как null, так и undefined, если хотите, я обновил ответ