so easy 前端實(shí)現(xiàn)多語言

? 每個公司業(yè)務(wù)不一樣,此解決方案僅做參考 。

Git demo地址

前言

其實(shí)現(xiàn)在開發(fā)者解決多語言普遍三種解決方案:

第一個是為每個頁面提供每種語言的相關(guān)頁面蚌成。
第二種是把內(nèi)容從表現(xiàn)形式中分離出來芭析,做不同語言的內(nèi)容文件。
第三種是動態(tài)翻譯頁面內(nèi)容攀甚。第三種很少見箩朴,而且機(jī)器翻譯技術(shù)還很難達(dá)到人們的預(yù)期。

其實(shí)第二種相對來說簡單一點(diǎn)秋度,那么開搞炸庞。

實(shí)現(xiàn)

思考

  • 翻譯公司給的有的excel有的是json文件,咱們就統(tǒng)一請求json文件吧;
  • html中給標(biāo)簽加個lang屬性荚斯,到時候頁面加載時遍歷所有這些有lang屬性的標(biāo)簽去實(shí)現(xiàn)切換語言;
  • js里的文字用方法實(shí)現(xiàn)轉(zhuǎn)換語言;
  • 把用戶選擇的語言存到cookie里吧埠居,嗯!拿個小本本記下來;
  • 做個緩存事期,請求過的語言文件就不再請求了;
  • 暫時就這些吧...

demo

image

文件目錄

image

index.html

<!DOCTYPE html>
<html>
<meta charset="utf-8">  
<title>translation test</title>  
<script src="https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
<script src="js/script.js"></script>  
<script src="js/index.js"></script>  
</head>  
  
<body>  
    <div>  
        <a href="#" id="enBtn">English</a>  
        <a href="#" id="zhBtn">簡體中文</a>  
    </div>  
    <div><a lang>click here:</a></div>  
    <div><input type="button" value="apply" lang id="applyBtn"></div> 
</body>  
  
</html>  

script.js

var dict = {};

$(function () {
  registerWords();
  if(getCookieVal("lang")=="en"){
    setLanguage("en");
  }else if(getCookieVal("lang")=="zh"){
    setLanguage("zh");
  }else{
    setLanguage("en");
  }
  
// 切換語言事件 根據(jù)自己業(yè)務(wù)而定
  $("#enBtn").bind("click", function () {
    setLanguage("en");
    //這里也可以寫一些其他操作滥壕,比如加載語言對應(yīng)的css
  });

  $("#zhBtn").bind("click", function () {
    setLanguage("zh");
  });

});

function setLanguage(lang) {
  setCookie("lang=" + lang + "; path=/;");
  translate(lang);
}

function getCookieVal(name) {
  var items = document.cookie.split(";");
  for (var i in items) {
    var cookie = $.trim(items[i]);
    var eqIdx = cookie.indexOf("=");
    var key = cookie.substring(0, eqIdx);
    if (name == $.trim(key)) {
      return $.trim(cookie.substring(eqIdx + 1));
    }
  }
  return null;
}

function setCookie(cookie) {
  var Days = 30; //此 cookie 將被保存 30 天
  var exp = new Date(); //new Date("December 31, 9998");
  exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
  document.cookie = cookie+ ";expires=" + exp.toGMTString();
}

function translate(lang) {
  if(sessionStorage.getItem(lang + "Data") != null){
    dict = JSON.parse(sessionStorage.getItem(lang + "Data"));
  }else{
    loadDict();
  }

  $("[lang]").each(function () {
    switch (this.tagName.toLowerCase()) {
      case "input":
        $(this).val(__tr($(this).attr("lang")));
        break;
      default:
        $(this).text(__tr($(this).attr("lang")));
    }
  });
}

function __tr(src) {
  return (dict[src] || src);
}

function loadDict() {
  var lang = (getCookieVal("lang") || "en");
  $.ajax({
    async: false,
    type: "GET",
    url: "/lang/"+lang + ".json",
    success: function (msg) {
      dict = msg;
      sessionStorage.setItem(lang + 'Data', JSON.stringify(dict));
    }
  });

}

// 遍歷所有l(wèi)ang屬性的標(biāo)簽賦值
function registerWords() {
  $("[lang]").each(function () {
    switch (this.tagName.toLowerCase()) {
      case "input":
        if($(this).attr("lang")==""){
          $(this).attr("lang", $(this).val());
        }
        break;
      default:
        if($(this).attr("lang")==""){
          $(this).attr("lang", $(this).text());
        }
    }
  });
}

之前弄demo的時候,registerWords函數(shù)這里沒有判斷
但是我們的項(xiàng)目自己封裝的路由去動態(tài)加載頁面兽泣。每次進(jìn)來都會重新賦值绎橘,這會導(dǎo)致問題。

因?yàn)樗x值的是當(dāng)前元素的值唠倦,這個時候你lang的值就和語言包文件里的key對應(yīng)不上了

使用方法

html中語言切換:給所有標(biāo)簽加上lang屬性
js中語言切換:使用__tr()方法

可以直接把script.js作為一個插件使用放到項(xiàng)目中

總結(jié)

條條大路通羅馬称鳞,根據(jù)自己的實(shí)際需求與業(yè)務(wù)場景去做即可。

有點(diǎn)倉促稠鼻,有不足的還請各位小哥哥小姐姐指點(diǎn)冈止。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市候齿,隨后出現(xiàn)的幾起案子靶瘸,更是在濱河造成了極大的恐慌,老刑警劉巖毛肋,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怨咪,死亡現(xiàn)場離奇詭異,居然都是意外死亡润匙,警方通過查閱死者的電腦和手機(jī)诗眨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孕讳,“玉大人,你說我怎么就攤上這事锹引』髯铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵峡懈,是天一觀的道長。 經(jīng)常有香客問我与斤,道長肪康,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任撩穿,我火速辦了婚禮磷支,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘食寡。我一直安慰自己雾狈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布抵皱。 她就那樣靜靜地躺著善榛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呻畸。 梳的紋絲不亂的頭發(fā)上移盆,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音擂错,去河邊找鬼味滞。 笑死,一個胖子當(dāng)著我的面吹牛钮呀,可吹牛的內(nèi)容都是我干的剑鞍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼爽醋,長吁一口氣:“原來是場噩夢啊……” “哼蚁署!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚂四,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤光戈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遂赠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體久妆,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年跷睦,在試婚紗的時候發(fā)現(xiàn)自己被綠了筷弦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烂琴,靈堂內(nèi)的尸體忽然破棺而出爹殊,到底是詐尸還是另有隱情,我是刑警寧澤奸绷,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布梗夸,位于F島的核電站,受9級特大地震影響号醉,放射性物質(zhì)發(fā)生泄漏反症。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一扣癣、第九天 我趴在偏房一處隱蔽的房頂上張望惰帽。 院中可真熱鬧憨降,春花似錦父虑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悔叽,卻和暖如春莱衩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娇澎。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工笨蚁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趟庄。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓括细,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戚啥。 傳聞我的和親對象是個殘疾皇子奋单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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