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)是.
我們可以配置除.
以外的任意字符押桃。
到此我們的界面也就修改成功了。