在i18n中为相同的语言环境使用两种语言代码

问题描述 投票:0回答:1

我正在使用i18n来翻译英语/日语-我的默认语言是en中的英语。但是最近发现我的网站未使用日语的正确ISO语言代码。 jp代替ja

我想知道在i18n中是否可能有两个语言代码引用相同的语言环境文件-以及如何做到这一点感到困惑。

例如,我想将/whatever?lng=jp/whatever?lng=ja用于日语文本。

这是我的配置:

i18nConfig.js

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

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;

非常感谢您提供有关此基本问题的帮助。

javascript reactjs internationalization next.js i18next
1个回答
0
投票

您可以将backend.loadPath定义为function,它获得langsnamespace并返回带有文件路径的字符串。

// 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;
    },
  },
};

© www.soinside.com 2019 - 2024. All rights reserved.