Используйте один и тот же ресурс для языков с разными языковыми тегами IETF в i18next.

У меня есть следующий код:

import i18n from 'i18next'

import { initReactI18next } from 'react-i18next'
import locales from 'locales'

const resources = {
  en: locales.en,
  no: locales.no,
  de: locales.de,
  se: locales.se
}

function getDefaultLocale() {
  const preferredLanguage = localStorage.getItem('preferredLanguage')
  const lng = locales.languages
    .map(({ code }) => code)
    .find(code =>
      code === preferredLanguage || // The user has set a preferred language
        code === '__DEFAULT_LOCALE__' || // Default locale set at build time.
        code === navigator.language
    )
  return lng
}

i18n
  .use(initReactI18next)
  .init({
    resources,
    lng: getDefaultLocale(),
    appendNamespaceToCIMode: true
  })

export default i18n

Моя проблема в том, что, скажем, когда английский язык определяется с помощью navigator.language, это может быть en, en-US, en-GB, или для норвежского языка это может быть nb, nb-NO, ny-NO и т. д.

Мы хотели бы использовать одни и те же переводы для всех кодов английского языка и для всех кодов норвежского языка.

Мое текущее решение состоит в том, чтобы определить ресурсы следующим образом:

const resources = {
  en: locales.en,
  'en-US': locales.en,
  'en-GB': locales.en,
  no: locales.no,
  'nb-NO': locales.no,
  'ny-NO': locales.no,
  de: locales.de,
  se: locales.se
}

Но должно быть лучшее решение для этого! Может ли кто-нибудь помочь?


person Balázs Orbán    schedule 10.09.2019    source источник


Ответы (1)


Поведение по умолчанию для локалей, содержащих регион, — откат к коду основного языка.

Например, мы обнаружили en-GB, но для этой локали не назначен файл перевода. Предполагая, что en переводы на месте, ожидаемое поведение будет продолжаться с ними, не вызывая никаких проблем.

Это практически означает, что вы можете удалить повторяющееся объявление из кода инициализации:

const resources = {
  en: locales.en,
  no: locales.no,
  de: locales.de,
  se: locales.se
}

Если хотите, это можно сделать более лаконично:

const resources = { ...locales }
person Pavel Ye    schedule 10.09.2019