i18n,javascript-是否可以使用第二个文件来处理差异?

时间:2020-07-07 12:31:26

标签: javascript internationalization i18next

我想像现在一样使用一个主要语言文件,另一个使用英语文件。 效果很好。

现在,我想再添加两个文件。与主要语言相比只是一个变化,而另一种语言只有一个变化。

换句话说,..第一个文件是包含所有词典的大文件,但对于特定客户,我需要对某些词进行不同的翻译。我不想写另一个与原始文件相等的文件,而是只写不同的单词。

我该怎么做?

这是我的代码:

var i18nextInstance = i18next
  .use(i18nextXHRBackend)
  .use(i18nextBrowserLanguageDetector)
  .init(
    {
      detection: {
        // Escludo localStorage. Praticamente ricorda l'ultima lingua usata.
        //order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag'],
        order: ['querystring', 'cookie', 'navigator', 'htmlTag'],
      },
      fallbackLng: 'en',
      lng: lingua_attiva,
      debug: false,
      ns: ['common'],
      defaultNS: 'common',
      backend: {
        loadPath: './i18n/{{lng}}/{{ns}}.json',
        crossDomain: true,
        parse: function (data) {
          // queste 3 righe sotto mi fanno utilizzare il json che include anche la lingua.
          // infatti, nel caso di un file per lingua, la lingua non andrebbe messa. Solo che ci sono delle estensioni
          // come quella di PHP che la vogliono lo stesso. Per questo la lascio e la escludo.
          try {
            var json = JSON.parse(data); // --> { en: {  ... } }
            var m = Object.keys(json); // --> ['en']
            return json[m[0]]; // --> { common: { ... } }
          } catch (e) {
            alert(e); // error in the above string (in this case, yes)!
          }
        },
      },
    },
    function (err, t) {
      // initialized and ready to go!

      // Se in ingresso non avevo passato nessuna lingua, la imposto adesso con quella rilevata
      if (lingua_attiva == undefined) {
        lingua_attiva = i18nextInstance.language.substr(0, 2);
      }

      // Se la lingua non è tra quelle abilitate, forzo inglese
      if (lingua_attiva != 'it' && lingua_attiva != 'en') {
        lingua_attiva = 'en';
      }

      ConfiguraMainWebsite();
      AggiornaTraduzioni();
    }
  );

// Configuro le opzioni per utilizzare jquery nelle traduzioni
jqueryI18next.init(i18nextInstance, $, {
  tName: 't', // --> appends $.t = i18next.t
  i18nName: 'i18n', // --> appends $.i18n = i18next
  handleName: 'localize', // --> appends $(selector).localize(opts);
  selectorAttr: 'data-i18n', // selector for translating elements
  targetAttr: 'i18n-target', // data-() attribute to grab target element to translate (if diffrent then itself)
  optionsAttr: 'i18n-options', // data-() attribute that contains options, will load/set if useOptionsAttr = true
  useOptionsAttr: true, // see optionsAttr
  parseDefaultValueFromContent: true, // parses default values from content ele.val or ele.text
});

1 个答案:

答案 0 :(得分:1)

您只能使用差异创建一个新文件(这意味着密钥与common文件中的密钥相同),我们将其称为diffs并使用i18next namespace fallback功能。

在特定位置,您可以使用diffs名称空间(将加载diffs.json文件)并回退到common名称空间以查找缺少的密钥。

由于您的配置已被common定义为defaultNS,因此您只需要为特定用户将名称空间更改为diffs

<div class="outer" data-i18n="diffs:key"></div>
// -----------------------------^

$(".outer").localize();

您可以为特定翻译区域定义名称空间

$(".outer").localize({ns: 'diffs'});
// this will call translation on the `.outer` div with a specific namespace without the need to attach it as I've showed before