在i18next中对具有不同IETF语言标签的语言使用相同的资源

时间:2019-09-10 06:48:19

标签: i18next react-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检测到英语时,它可能是enen-USen-GB,或者对于挪威语,可能是是nbnb-NOny-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
}

但是必须对此有更好的解决方案!有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

包含区域的语言环境的默认行为是回退到主要语言代码。

例如,我们检测到en-GB,但是没有分配给该语言环境的翻译文件。假设en翻译已经到位,则预期的行为是继续进行翻译,不会造成任何麻烦。

这实际上意味着您可以从初始化代码中删除重复的声明:

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

如果您愿意,可以用更简洁的方式完成:

const resources = { ...locales }