Javascript I18下一个最佳做法

Javascript I18下一个最佳做法,javascript,json,internationalization,multilingual,i18next,Javascript,Json,Internationalization,Multilingual,I18next,我已经成功地实现了i18next,顺便说一句,它是一个很棒的库!尽管我还在寻找“最佳实践”。这是我现在的设置,通常我喜欢: var userLanguage='en';//在运行时设置 i18n.init({ lng:用户语言, shortcutFunction:'defaultValue', 撤退:错, 加载:'非特定', resGetPath:'locales/\uuuuu lng\uuuuuuu/\uuuuuu ns\uuuuuuu.json' }); 在DOM中,我执行以下操作: 我的

我已经成功地实现了i18next,顺便说一句,它是一个很棒的库!尽管我还在寻找“最佳实践”。这是我现在的设置,通常我喜欢:

var userLanguage='en';//在运行时设置
i18n.init({
lng:用户语言,
shortcutFunction:'defaultValue',
撤退:错,
加载:'非特定',
resGetPath:'locales/\uuuuu lng\uuuuuuu/\uuuuuu ns\uuuuuuu.json'
});
在DOM中,我执行以下操作:

我的第一个例子
在JS中,我会做这样的事情:

返回i18n.t('demo.mySecondExample','My secondexample');
这意味着我在代码本身中维护英语翻译。但是,我使用单独的
translation.json
文件,使用i18next解析器维护其他语言:

gulp.task('i18next',function()
{
gulp.src('app/**'))
.管道(i18next)({
地区:['nl','de'],
输出:“../locales”
}))
.pipe(吞咽目的地('locales'));
});
一切都很好。唯一的问题是,当我将
'en'
设置为
用户语言时,
i18next
坚持获取
/locales/en/translation.json
文件,即使它不包含任何翻译。为了防止404,我目前在该文件中提供一个空的json对象
{}


有什么方法可以阻止加载空的.json文件吗?

也许我这里遗漏了一些东西,但你不能简单地这样做:

if (userLanguage != 'en') {

    i18n.init({
        lng                 : userLanguage,
        shortcutFunction    : 'defaultValue',
        fallbackLng         : false,
        load                : 'unspecific',
        resGetPath          : 'locales/__lng__/__ns__.json'
    });
}
这样你的脚本i18n就不会被初始化,除非你真的需要翻译服务

请参见“允许在init上使用的白名单语言”(无法对这些文档上的链接进行分段…)

只允许加载指定的语言


那应该能解决你的问题。虽然我认为黑名单会更好。

i18next解析器
作者在这里,我将解释如何使用
i18next
,希望它能帮助:

1/我没有在代码中使用
defaultTranslation
。原因是它不属于代码。我理解拥有实际文本的好处,但代码可能会很快膨胀。困难的部分在于定义可理解的翻译键。如果这样做,您就不再需要defaultTranslation文本了。翻译键是自我解释的

2/如果您在
/locales/en/translation.json
上有一个404,那么可能您的
public
目录或类似目录中没有该文件。使用gulp,您可以有多个目的地,例如执行
dest('locales')。dest('public/locales')


3/如果目录中没有翻译,请确保首先运行gulp任务。关于使用您拥有的defaultTranslation填充目录,使用正则表达式解决这是一个棘手的问题。考虑这种情况
默认翻译
。它需要能够解析内部html并提取所有内容。我只是从来没有花时间来实现它,因为我没有使用它。

这对DOM标签有效,但在这种情况下,我认为i18n.t(key,defaultString)方法无法正常处理。@RonaldHulshof:您也可以使用只返回defaultString的t方法创建一个伪i18n对象
var i18n={t:function(key,value){return value;}}
您考虑过使用自定义加载程序吗?或者允许使用404!不管怎样,当它通过后备方案级联时就会发生这种情况。预期的404不会破坏应用程序,除非您将某种全局处理程序设置为“在任何404错误上暂停执行”。这实际上会阻止在我将“en”定义为用户语言时加载i18next。或者更好地说,它甚至会在下一个18小时崩溃。@RonaldHulshof,这很奇怪。我无法想象这就是白名单选项的意图。您的init选项之一是否与之冲突?否,以上配置是我实际使用的配置。关于3/填充目录:语义良好的HTML文本标签不应包含
标记,仅包含
等标记。如果有人打算使用非语义HTML,他/她最好不要使用自动填充功能。对其他任何人来说,这可能是一个非常非常非常棒的功能。现在,我已经像描述的那样使用内联文本大约9个月了,我仍然对我当时所做的选择感到非常满意。在我的开发团队中,这种处理翻译的方式非常有效。我理解,尽管我不认为“良好的语义HTML”可以证明不解析所有场景是合理的。如果你做了一个涵盖所有场景(div中的div)的公关,我会检查它,但目前我不能花时间在这个库上。
i18n.init({ lngWhitelist: ['de-DE', 'de', 'fr'] });