首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在i18n中对同一语言环境使用两种语言代码

问在i18n中对同一语言环境使用两种语言代码
EN

Stack Overflow用户
提问于 2020-06-08 04:53:47
回答 1查看 865关注 0票数 0

我正在使用i18n来翻译英语/日语--我的默认语言是en中的英语。但最近意识到我的网站没有使用正确的ISO语言代码的日语。jp而不是ja。

我想知道在i18n中是否可能有两种语言代码引用相同的地区文件--并对如何做到这一点感到困惑。

例如,我希望/whatever?lng=jp和/whatever?lng=ja为日语文本工作。

以下是我的心声:

i18nConfig.js

代码语言:javascript
复制
const path = require("path");

module.exports = {
  fallbackLng: "en",
  preload: ["en", "ja", "jp"],
  ns: [
    "localefiles"
  ],
  backend: {
    loadPath: path.join(__dirname, "locales", "{{lng}}", "{{ns}}.json"),
    addPath: path.join(__dirname, "locales", "{{lng}}", "{{ns}}.missing.json"),
  },
};

i18n.js

代码语言:javascript
复制
const i18n = require("i18next");
const XHR = require("i18next-xhr-backend");
const LanguageDetector = require("i18next-browser-languagedetector");

const options = {
  fallbackLng: "en",
  load: "languageOnly",

  ns: ["common"],
  defaultNS: "common",

  debug: process.env.NODE_ENV !== "production" && false,
  saveMissing: true,

  interpolation: {
    escapeValue: false,
    formatSeparator: ",",
    format: (value, format) => {
      if (format === "uppercase") {
        return value.toUpperCase();
      }
      return value;
    },
  },
};

if (process.browser) {
  i18n.use(XHR).use(LanguageDetector);
}

if (!i18n.isInitialized) {
  i18n.init(options);
}

if (i18n.initialLanguage == "jp") {
  console.log({i18n})
  i18n.setLng("ja");
}

i18n.getInitialProps = (req, namespaces) => {
  if (!namespaces) {
    namespaces = i18n.options.defaultNS;
  }
  if (typeof namespaces === "string") {
    namespaces = [namespaces];
  }

  req.i18n.toJSON = () => null;

  const initialI18nStore = {};
  req.i18n.languages.forEach((lan) => {
    initialI18nStore[lan] = {};
    namespaces.forEach((ns) => {
      initialI18nStore[lan][ns] = req.i18n.services.resourceStore.data[lan]
        ? req.i18n.services.resourceStore.data[lan][ns] || {}
        : {};
    });
  });
  return {
    i18n: req.i18n,
    initialI18nStore,
    initialLanguage: req.i18n.language,
  };
};

module.exports = i18n;

非常感谢你在这个基本问题上的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 07:58:33

您可以将backend.loadPath定义为一个函数,它获取langs & namespace,并返回带有文件路径的字符串。

代码语言:javascript
复制
// i18next.js

const i18n = require('i18next');
const XHR = require('i18next-xhr-backend');
const LanguageDetector = require('i18next-browser-languagedetector');

const options = {
  fallbackLng: 'en',
  load: 'languageOnly',

  ns: ['common'],
  defaultNS: 'common',

  debug: process.env.NODE_ENV !== 'production' && false,
  saveMissing: true,
  backend: {
    loadPath(lng, ns) {
      if (lng === 'jp') {   // <---
        return '/locales/ja/{{ns}}.json';
      }
      return '/locales/{{lng}}/{{ns}}.json';
    },
    addPath: path.join(__dirname, 'locales', '{{lng}}', '{{ns}}.missing.json'),
  },
  interpolation: {
    escapeValue: false,
    formatSeparator: ',',
    format: (value, format) => {
      if (format === 'uppercase') {
        return value.toUpperCase();
      }
      return value;
    },
  },
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62255230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档