angular-translate — резервный язык для определенияPreferredLanguage()

Я использую angular-translate в своем приложении. Как я могу зарегистрировать резервный язык, если determinePreferredLanguage() возвращает ключ языка, которого мой код не знает?

Я хочу вернуться к английскому языку, если кто-то из, например. Швеция посещает мой сайт (ключ языка: sv). Но поскольку я не указал sv в своей функции registerAvailableLanguageKeys, она не работает, и вместо перевода пользователю отображаются языковые ключи.

$translateProvider
    .registerAvailableLanguageKeys(['da-dk','en-us'], {
        'en_US': 'en-us',
        'en_UK': 'en-us',
        'da': 'da-dk',
    })
    .determinePreferredLanguage();

person swenedo    schedule 29.08.2014    source источник
comment
$translateProvider.fallbackLanguage(['en-us'])? angular-translate.github.io/docs/#/api /   -  person Philipp Gayret    schedule 29.08.2014
comment
@Philipp fallbackLanguage() решает еще одну проблему. Если таблица перевода не имеет определенного ключа, будет использоваться перевод с резервного языка. Моя проблема в том, что я хочу иметь запасной вариант, если пользователь с неизвестной локалью посещает мой сайт, английский язык должен быть выбран в качестве предпочтительного языка.   -  person swenedo    schedule 29.08.2014
comment
Привет @swenedo, примешь ли ты мой ответ? через 2 года я считаю, что это был правильный выбор.   -  person Adriano Spadoni    schedule 15.03.2017
comment
@Drix Конечно :-) Спасибо!   -  person swenedo    schedule 15.03.2017


Ответы (3)


Использование подстановочных знаков — лучшее решение, вы можете просто установить en_* следующим образом:

    $translateProvider.useStaticFilesLoader({
       prefix: 'locales/locale-',
       suffix: '.json'
    })   

    .registerAvailableLanguageKeys(['en','fr','pt'], {
       'en_*': 'en',
       'fr_*': 'fr',
       'pt_*': 'pt',
       '*': 'en'
    })

    .determinePreferredLanguage()

    .fallbackLanguage('en');

для файлов:

locales/locale-en.json
locales/locale-fr.json
locales/locale-pt.json
person Adriano Spadoni    schedule 27.05.2015
comment
Потрясающий! У меня также есть подстановочный знак «*», чтобы вернуться к «en» - person Rbjz; 22.03.2016

Привет, у меня была похожая проблема с твоей, как я ее решил:

Я добавил это в свой app.config

  $translateProvider.useStaticFilesLoader({
      prefix: 'the/directory/locale-',
      suffix: '.json'
    })

  .registerAvailableLanguageKeys(['en'])

  .determinePreferredLanguage()

  .fallbackLanguage('en');

и это для моего app.run:

$rootScope.changeLanguage = function() {
  if(/[a-z]{2}_[A-Z]{2}/.test($translate.use())) {
    $translate.fallbackLanguage($translate.use().split('_')[0]);
  }
}

таким образом, если браузер обнаружит такой язык, как fr_BE, он попытается вернуться к fr, а затем еще раз к en, в вашем случае вам понадобится sv. Кроме того, наличие registerAvailableLanguageKeys, по-видимому, останавливает определениеPreferredLanguage(), вызывая ошибку с несуществующей проблемой файла. Я надеюсь, что это поможет кому-то.

person Ciaran George    schedule 13.02.2015
comment
Порядок .determinePreferredLanguage() и .fallbackLanguage('en') имеет существенное значение. У меня они были наоборот, и это не сработало. - person JNissi; 20.03.2015

Вы можете использовать $translateProvider.fallbackLanguage(['en-us']), чтобы определить резервный язык, и $translateProvider.preferredLanguage(langKey), чтобы установить предпочитаемый язык.

Также обратите внимание, что fallbackLanguage() может иметь в качестве параметра массив языков, что означает, что у вас может быть несколько упорядоченных резервных языков.

person alcfeoh    schedule 16.01.2015