2018-12-29

H5對接多語言平臺

首先定庵,對接多語言平臺我們需要將本地的多語言給到多語言平臺西篓,但是多語言平臺那邊識別不了我們本地文件的格式,我們首先需要將格式轉(zhuǎn)換炉爆。類似如下:

代碼塊

menu: {
        'homePage': '首頁',
        'message': '消息',
        'me': '我的',
        'work': '工作',
  },

平臺需要我們將如上代碼轉(zhuǎn)換成類似如下的格式

    "menu.homePage": "首頁",
    "menu.message": "消息",
    "menu.me": "我的",
    "menu.work": "工作",

由于考慮到我們需要將組件庫的多語言和本項目多語言進(jìn)行轉(zhuǎn)換然后生成轉(zhuǎn)換后的文件堕虹,我這里我們可以通過如下js代碼進(jìn)行操作

function getLanguage(obj, map, preKey) {
    preKey = preKey || '';
    for (var key in obj) {
        let temp = preKey ? preKey + '.' + key : key;
        if (typeof obj[key] === 'string') {
            map[temp] = obj[key];
        } else {
            getLanguage(obj[key], map, temp);
        }
    }
    return map;
}

如上是將對象轉(zhuǎn)換的邏輯,緊接著需要將生成的文件寫入文件

let convertPath = path.resolve(__dirname, './i18n/all-zh-CN.json');
var convertFile = getLanguage(_.merge(require('./i18n/walle-zh-CN.js'), require('./i18n/zh-CN.js')), convertMap);

這里我暫時將文件寫入文件i8n下面名為all-zh-CN.json的文件中芬首,convertFile是組件庫文件和本地的文件赴捞,經(jīng)getLanguage函數(shù)轉(zhuǎn)化后數(shù)據(jù)。接下來就是要把此文件寫入郁稍。起初文件寫入成功赦政,但并不是我想要的文件格式,嘗試很多寫法耀怜,文件內(nèi)容總顯示[object objec]或者顯示因文件過大等等的文字很郁悶恢着。

path.resolve(_dirname,filename) __dirname變量
在任何模塊文件內(nèi)部掸屡,可以使用__dirname變量獲取當(dāng)前模塊文件所在目錄的完整絕對路徑
最初的寫法(參照別的項目)

fs.open(convertPath, 'w+', function(e){
    if(e) throw e;
    fs.writeFile(convertPath, md, function(e){
        if(e) throw e;
        console.log('轉(zhuǎn)換成功');
    })
})

查fs用法如下

node 操作文件流 fs
在node中通過fs模塊來和系統(tǒng)中的文件進(jìn)行交互
通過fs模塊可以對磁盤中的文件做各種增刪改查的操作

1、同步寫入

1.打開要寫入的文件
fs.openSync(path, flags[, mode])
該方法用來打開一個文件
參數(shù):
path:路徑然评,要打開文件的路徑
flags:操作的類型仅财,要對文件做什么操作
需要字符串作為參數(shù)
"w" 寫
"r" 讀
"a" 追加
mode:可選參數(shù),一般不傳,用來設(shè)置文件的權(quán)限
返回值:
fd 文件的描述符
2.寫入并保存
fs.writeSync(fd, string[, position[, encoding]])
該方法用于向文件中寫入內(nèi)容
參數(shù):
fd: 文件的描述符碗淌,需要指定要寫入文件的描述符
string: 要寫入的內(nèi)容
position: 開始寫入的位置
encoding: 寫入內(nèi)容的字符編碼盏求,默認(rèn)utf-8
3.關(guān)閉文件
fs.closeSync(fd):: 該方法用來關(guān)閉文件
參數(shù):
fd 文件的描述符
實例
//引入fs模塊
var fs=require('fs');
var fd=fs.openSync('gzl.txt','w');
fs.writeSync(fd,'1111',10,'utf-8');
fs.closeSync(fd);

3.異步寫入

1.打開文件
fs.open(path, flags[, mode], callback)
參數(shù):callback
回調(diào)函數(shù),會在文件打開以后執(zhí)行
回調(diào)函數(shù)中會有兩個參數(shù):
err: 錯誤信息亿眠,如果操作過程中出現(xiàn)了錯誤碎罚,則該對象存在,如果沒有出現(xiàn)錯誤纳像,則該參數(shù)的值為null
錯誤優(yōu)先
fd: 文件的描述符

2.寫入文件
fs.write(fd, string[, position[, encoding]], callback)
callback 回調(diào)函數(shù)會在寫入完畢以后執(zhí)行
參數(shù):
err 錯誤對象
byte 寫入的字節(jié)數(shù)
data 寫入的數(shù)據(jù)

3.關(guān)閉文件
fs.close(fd, callback)
按照上述描述嘗試修改并沒有解決我的問題荆烈,然后自己瞎看項目時忽然就想著把寫入的文件用JSON.stringify做下轉(zhuǎn)換真的好了!竟趾!寫入的文件沒有換行符憔购,看起來一團(tuán)亂,格式化文件就好了岔帽。
接著就是獲取平臺的多語言數(shù)據(jù)了玫鸟,在template.esj文件中寫入如下代碼

<script>
        window.LanguageData = {};
        var xhr = new XMLHttpRequest();
        xhr.open("GET",'/api/common/language',false);
        xhr.send();
        if (xhr.status == 200){
            var result = xhr.response;
            result = JSON.parse(result);
            window.LanguageData = result.data;
        }
    </script>

在項目的i8n項目中寫入如下代碼:

let language = 'zh-CN' || globalConfig.language;

i18next.init({
    debug: true,
    lng: language,
    returnObjects: true,//
    keySeparator: '@',//很重要
    resources: {
        [language]: {
            translation: window.LanguageData || {}
        }
    }
});

起初多語言總是轉(zhuǎn)換不成功,發(fā)送a:{b:1}這種格式的文件是沒問題的犀勒,但是換成a.b=1的就是不可以屎飘,這就是上面需要配置的那個很重要的屬性。keySeparator 屬性不配置默認(rèn)為., i18next的查找文件默認(rèn)先查a對象贾费,然后再找其下面的屬性钦购,這個keySeparator就是個標(biāo)識符默認(rèn)按照此分隔符查找其前面的對象再找到對應(yīng)的屬性。也就是說它識別不了a.b只能是a{b:1}來查找褂萧。keySeparator默認(rèn)是.我們可以配置除.以外的任意字符押桃。
到此我們的界面也就修改成功了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箱玷,一起剝皮案震驚了整個濱河市怨规,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锡足,老刑警劉巖波丰,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舶得,居然都是意外死亡掰烟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纫骑,“玉大人蝎亚,你說我怎么就攤上這事∠裙荩” “怎么了发框?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煤墙。 經(jīng)常有香客問我梅惯,道長,這世上最難降的妖魔是什么仿野? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任铣减,我火速辦了婚禮,結(jié)果婚禮上脚作,老公的妹妹穿的比我還像新娘葫哗。我一直安慰自己,他們只是感情好球涛,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布劣针。 她就那樣靜靜地躺著,像睡著了一般宾符。 火紅的嫁衣襯著肌膚如雪酿秸。 梳的紋絲不亂的頭發(fā)上灭翔,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天魏烫,我揣著相機(jī)與錄音,去河邊找鬼肝箱。 笑死哄褒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煌张。 我是一名探鬼主播呐赡,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骏融!你這毒婦竟也來了链嘀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤档玻,失蹤者是張志新(化名)和其女友劉穎怀泊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體误趴,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡霹琼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枣申。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡售葡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忠藤,到底是詐尸還是另有隱情挟伙,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站谴蔑,受9級特大地震影響丁鹉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诺祸,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祭芦。 院中可真熱鬧筷笨,春花似錦、人聲如沸龟劲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌跌。三九已至仰禀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕愤,已是汗流浹背答恶。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留萍诱,地道東北人悬嗓。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像裕坊,于是被迫代替她去往敵國和親包竹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容