Угловая локализация для нескольких клиентов и резервных копий

#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, если хотите, я обновил ответ