ember.js 修改加载ember-i18 n本地化的方式,从主app.js中拆分本地化字符串

inkz8wg9  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在尝试修改ember-i18 n本地化的加载方式。我想做的是将本地化放在一个独立于主应用程序javascript文件的文件中。
理想情况下,结构应该和现在一样,所以我会有app/locales/fr/translations.jsapp/locales/de/translations.js,每个都有类似于下面的内容:

export default {
 key: "value"
}

所以我想我需要写一个自定义的插件,它会改变构建过程。这个插件需要:
1.忽略最终生成中的app/locales
1.将所有翻译文件编译为一个
1.用babel传输新文件
1.将文件复制到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;
}
qv7cva1a

qv7cva1a1#

我不确定你是否真的问了一个问题;但是这里有一个答案。为什么要复杂呢?只要使用James罗森的i18n addon就可以了,很多项目都使用它。

相关问题