前端國(guó)際化

前言

從10年接觸編程就開始接觸國(guó)際化這個(gè)概念,然而這些年全面用到國(guó)際化的項(xiàng)目并不是很多,且都是些螺絲釘式的工作。15年末,部門項(xiàng)目需要推國(guó)際化,前端這塊由我來(lái)主導(dǎo)。雖然難度不高,但還是拿出來(lái)分享下。

選擇方式:

目前了解到的前端國(guó)際化有以下兩種方式:

1、按語(yǔ)言種類分別開發(fā)前端界面:

這種方式貌似給人一種很low的感覺(jué)且覺(jué)著文件會(huì)無(wú)限多。然而在一般項(xiàng)目中語(yǔ)言種類并不會(huì)特別多,實(shí)現(xiàn)中英文兩種即可滿足大部分需求;并且這種方式如果配合上不同的網(wǎng)站風(fēng)格,不但可以解決中英文字符長(zhǎng)度差異問(wèn)題,而且可以兼顧不同群體的視覺(jué)感觀。但該方式后期維護(hù)中需要付出相當(dāng)于維護(hù)語(yǔ)言種類相同倍數(shù)的前端代碼;

2、使用配置文件:

使用一套界面,同樣的樣式文件,調(diào)用相對(duì)應(yīng)的語(yǔ)言文件進(jìn)行DOM渲染。該方式可以快速實(shí)現(xiàn),且只需維護(hù)一套前端文件。單頁(yè)應(yīng)用建議使用該方法。

如還有更好的方式,希望可以發(fā)出來(lái)學(xué)習(xí)下。

我的選擇:登陸,注冊(cè)等單獨(dú)存在于系統(tǒng)外圍的功能模塊使用第一種方式,其它主體功能選擇的是第二種方式。

第一種方式只需要按語(yǔ)言分類成多份文件,這里就直接跳過(guò)。單說(shuō)第二種方式,該如何實(shí)現(xiàn)。

實(shí)現(xiàn)步驟:

步驟一:準(zhǔn)備語(yǔ)言資源文件

原則上需要遵守一個(gè)界面對(duì)應(yīng)一個(gè)資源文件,再通過(guò)一個(gè)統(tǒng)一入口文件進(jìn)行資源整合。舉個(gè)栗子:

page1對(duì)應(yīng)的資源文件

var page1 = {
title:{
'zh-cn':'標(biāo)題',
'en-us':'title'
}
}

page2對(duì)應(yīng)的資源文件

var page2 = {
words:{
'zh-cn':'{0}共有{1}人使用',
'en-us':'{1} people use {0}'
}
}

整合文件

var i18nData = {
page1:page1,
page2:page2,
}

步驟二:引入主JS

自已實(shí)現(xiàn)了一個(gè)I18N對(duì)象,少碼字多貼代碼,直接上code~

var I18N = {
    /*
    *   @存儲(chǔ)語(yǔ)言數(shù)據(jù)
    * */
    DATA : LD
    /*
    *   @ 使用的語(yǔ)言
    * */
    ,language: 'zh-cn'
    /*
    *   @ 修改使用的語(yǔ)言
    * */
    ,setLanguage: function(language){
        this.language = language;
    }
    /*
     *   @解析string 語(yǔ)言標(biāo)記  用于解析html中的{{i18n-}}
     *   str:html string
     *   pageName:頁(yè)面名稱 、
     * */
    ,parse: function(str, pageName){
        var _this = this;
        if(!pageName){
            console.error('I18N解析失敗,原因pageName='+pageName);
            return;
        }
        if(!_this.language){
            console.error('I18N解析失敗,原因language='+_this.language);
            return;
        }
        var key= '',
        parseStr = '';
        parseStr = str.replace(/{{i18n-(.+?)}}/g, function(t){
            key = t.slice(7, t.length - 2);
            try{
                return _this.DATA[pageName][key][_this.language] || '';
            }catch (e){
                console.warn(pageName + '未找到與'+ key +'相匹配的'+ _this.language +'語(yǔ)言');
                return '';
            }
        });
        return parseStr;
    }
    /*
    *   生成所需的文本信息 適用于js內(nèi)部更改DOM時(shí)使用
     *   pageName:頁(yè)面名稱
     *   key: 指向的文本索引
     *   v1,v2,v3:可為空,字符串格式,只存在v1時(shí)可為數(shù)組
    * */
    ,getText: function(pageName, key, v1, v2, v3){
        var _this = this;
        var intrusion = [];
        //處理參數(shù),實(shí)現(xiàn)多態(tài)化
        if(arguments.length == 3 && typeof(arguments[2]) == 'object'){
            intrusion = arguments[2];
        }
        else if(arguments.length > 2){
            for(var i=2; i< arguments.length; i++){
            intrusion.push(arguments[i]);
            }
        }
        var _lg = '';
        try{
            _lg = _this.DATA[pageName][key][_this.language] || '';
            if(!intrusion || intrusion.length == 0){
                return _lg;
            }
            _lg = _lg.replace(/{d+}/g, function( word ){
                return intrusion[word.match(/d+/)];
            });
            return _lg;
        }catch (e){
            console.warn('未找到與'+ key +'相匹配的'+ _this.language +'語(yǔ)言');
            return '';
        }
    }
};

主程序加上注釋也僅僅70行,很簡(jiǎn)易。

步驟三:替換文本

配置使用的語(yǔ)言種類:

I18N.setLanguage('en-us');   //設(shè)置當(dāng)前使用的語(yǔ)言為美式英語(yǔ)

替換HTML文本:

首先需要將HTML中原文本更換為{{i18n-*}}格式的標(biāo)記,舉個(gè)栗子:

//格式上在借鑒angularjs雙向綁定的同時(shí)附加特定的標(biāo)識(shí)
<span>標(biāo)題</span> 替換為 <span>{{i18n-title}}</span>

然后在獲取到這段HTML的string格式文件后進(jìn)行匹配,舉個(gè)栗子:

//這里直接用jQuery的get方式進(jìn)行示例
//假設(shè)test.html可包含的文本為:<span>{{i18n-title}}</span>
//語(yǔ)言資源文件使用步驟一示例的數(shù)據(jù)
$.get(‘test.html’, function(htmlSrc){
       var html =  I18N.parse(htmlSrc, 'page1');
       console.log(html);  //將輸出<span>title</span>
       $('body').html(html);
});

替換JS中的文本:

用于拼接字符串時(shí)處理含文本的字符,簡(jiǎn)單的舉個(gè)栗子:

//調(diào)用方法:getText(pageName, key, v1, v2, v3) 參數(shù)v1,v2,v3用于處理動(dòng)態(tài)數(shù)據(jù),可為空,字符串格式,只存在v1時(shí)可為數(shù)組
var _src = '<span>'
  + I18N.getText('page2', 'title', ['listManager.js', '10'])
  +'</span>';
console.log(_src ); //將輸出 10 people use listManager.js

@拭目以待

表格管理插件:gridmanager.lovejavascript.com && github地址
QQ交流群 (452781895):How To Make Love

《野生前端工程師》專輯中所有文章均為@拭目以待 原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

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