簡體   English   中英

修改 ember-i18n 本地化的加載方式,從主 app.js 拆分本地化字符串

[英]Modify how ember-i18n localizations are loaded, split localization strings from main app.js

我正在嘗試修改 ember-i18n 本地化的加載方式。 我想要做的是在與主應用程序 javascript 文件不同的文件中進行本地化。

理想情況下,結構將保持與現在相同。 所以我會有app/locales/fr/translations.jsapp/locales/de/translations.js ,每個都有類似的內容:

export default {
 key: "value"
}

所以我想我需要編寫一個自定義插件,這會改變構建過程。 這個插件需要:

  1. 忽略最終版本中的app/locales

  2. 將所有翻譯文件編譯為一個

  3. 使用 babel 轉譯新文件

  4. 復制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 插件即可

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM