修改 ember-i18n 本地化的加载方式,从主应用程序.js拆分本地化字符串



我正在尝试修改 ember-i18n 本地化的加载方式。我想做的是将本地化放在与主应用程序 javascript 文件不同的文件中。

理想情况下,结构将保持与现在相同。所以我会有app/locales/fr/translations.jsapp/locales/de/translations.js,每个内容都类似于以下内容:

export default {
key: "value"
}

所以我认为我需要编写一个自定义插件,这将改变构建过程。此插件需要:

  1. 忽略最终构建中的app/locales

  2. 将所有
  3. 翻译文件编译为一个

  4. 使用 babel 转译新文件

  5. 复制dist/assets/translations.js中的文件

合并的翻译文件如下所示:

export default {
fr: {
key: "value"
},
de: {
key: "value"
}

这样,我将能够使用 和实例初始值设定项,并简单地导入和使用此模块:

import Translations from 'my-translations';
export function initialize(instance) {
const i18n = instance.lookup('service:i18n');
for(let lang in Translations) {
if(Translations.hasOwnProperty(tag)) {
i18n.addTranslations(tag, Translations[tag]);
}
}
}

此外,index.html将是:

<script src="assets/vendor.js"></script>
<script src="assets/translations.js"></script>
<script src="assets/my-app.js"></script>

好吧,我开始编写自定义插件,但我卡住了。我设法忽略了语言环境,并编写了解析所有本地化的代码,但我不知道如何在dist中编写新的翻译文件。我必须使用什么钩子,以便能够写入dist?有什么帮助吗?非常感谢。

这是我写的代码:

我使用的东西

var Funnel = require('broccoli-funnel');
var stew = require('broccoli-stew');
var fs = require('fs');
var writeFile = require('broccoli-file-creator');
var mergeTrees = require('broccoli-merge-trees');

preprocessTree: function(type, tree) {
if(type !== 'js') {return tree;}
var treeWithoutLocales = new Funnel(tree, {
exclude: ['**/locales/*/translations.js']
});
var translations = {};
var files = fs.readdirSync('app/locales');
files.forEach((tag) => {
if(tag !== 'fr') {return;}
let contents = fs.readFileSync('app/locales/' + tag + '/translations.js', 'utf8');
contents = contents.replace(/^export default /, '');
contents = contents.replace(/;$/, '');
contents = JSON.parse(contents);
translations[tag] = contents;
});
// Should do something with this .. how to write in dist? and when? I need it compiled with babel
var fileTree = writeFile('/my-app/locales/translations.js', 'export default ' + JSON.stringify(translations) + ';');
return treeWithoutLocales;
}

我不确定你是否真的问了一个问题;但这里有某种答案。 为什么要复杂化?只需使用许多项目使用的James Rosen的i18n插件即可。

最新更新