使用i18Next时,根据插值变量

时间:2017-04-08 00:30:28

标签: internationalization i18next

我正在使用i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换。

以下是一个示例本地化键:值对:

“错误”:“{{tagName}} html标记不能位于”p“标记内。”

有两种情况: 1)tagName可以是“a”(或者通常以元音开头的某个标签),在这种情况下,返回的本地化和插值字符串应为:

“h1”html标记不能位于“p”标记内。

OR:

2)tagName可以是“section”(或者某个以辅音开头的标签),在这种情况下,返回的本地化和插值字符串应为:

“section”html标记不能位于“p”标记内。

关于最佳方法的想法?

1 个答案:

答案 0 :(得分:1)

第一部分是这个" a vs."问题仅针对英语,因此i18next没有特定的答案是有道理的。

然而,i18next可以使用"格式"以下列方式处理它。作为i18n插值过程的一部分。

以下解决方案的文档如下: http://i18next.com/translate/formatting/

以下是您将用于此实现的关键:

"sample-key": "{{tag, en-handle-an-capitalized}} <{{tag}}> tag always needs a closing </{{tag}}> tag. Writing <{{tag}}/> is not allowed.",

&#34;烯手柄的&#34; /&#34;烯手柄的资本化&#34;意思是:

  • &#34; en&#34; - 这只适用于&#34; en&#34;区域设置字符串
  • &#34;处理 - &#34; - 它正在做什么
  • &#34;大写&#34; - A或An应该/不应该大写。

这是i18n初始化(包括格式键和语言匹配时插值过程格式步骤调用的辅助函数):

const getVariationOfAOrAn = function(value, capitalize) {
  const letters = ['a','e','i','o','u','h'];
  let firstLetter = value.substring(0,1);
  let correctWordForm = '';
  if (letters.find(function(l) {
    return firstLetter === l;
  })) {
    correctWordForm = capitalize ? 'An' : 'an';
  } else {
    correctWordForm = capitalize ? 'A' : 'a';
  }

  return correctWordForm;
}

export default function() {
  init({
    fallbackLng: 'en',
    resources,
    interpolation: {
      format: function(value, format, lng) {
        if (format === 'en-handle-an') return (!lng || lng === 'en') ? getVariationOfAOrAn(value, false) : '';
        if (format === 'en-handle-an-capitalized') return (!lng || lng === 'en') ? getVariationAOrAn(value, true) : '';
        return value;
      }
   }
  });
}