簡體   English   中英

在 i18n 中為同一語言環境使用兩種語言代碼

[英]Using two language codes for same locale in i18n

我正在使用 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;

非常感謝您對這個基本問題的幫助。

您可以將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;
    },
  },
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM