使用 i18Next 时,根据插值变量中的第一个字母在 "a" 和 "an" 之间切换

When using i18Next, switch between "a" and "an" depending on the first letter in an interpolated variable

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

这是一个本地化的示例 key:value 对:

"error": "A {{tagName}} html tag cannot be within a "p" 标签。"

有两种情况: 1) tagName 可以是 "a"(或者一些以元音开头的标签,通常)在这种情况下返回的本地化和内插字符串应该是:

"h1"html 标签不能在 "p" 标签内。

或:

2) tagName 可以是 "section"(或某些以辅音开头的标签),在这种情况下返回的本地化和内插字符串应该是:

A "section" html 标签不能在 "p" 标签内。

关于执行此操作的最佳方法的想法?

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

但是,i18next 可以使用 "format" 函数作为 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.",

"en-handle-an"/"en-handle-an-capitalized"表示如下:

  • "en"-这仅适用于 "en" 语言环境字符串
  • "handle-an"-它在做什么
  • "capitalized"- A 或 An should/should 不被大写。

这里是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;
      }
   }
  });
}