1

我有以下代码:

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-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
}

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

4

1 回答 1

1

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

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

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

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

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

const resources = { ...locales }
于 2019-09-10T17:07:16.370 回答