星期三, 2月 22, 2012

[Javascript] i18n問題: 可參數化的翻譯語句

先前在實作i18n上未考慮翻譯字串加上參數順序的問題
會導致不同語言翻譯下參數順序會被改變的問題!!
因此要改寫一下原本的printf方法!!

參數命名規則:  _%s<參數ID>_  , ID由1開始
參數命名範例:  Hello _%s1_ !!



$.printf = function(S, PARR) {
  
  if (!PARR) return S;
 
  var re = /_%s[0-9]*_/g;
  var matchPattern = S.match(re);//re.exec(S);
  if(matchPattern != null){
   var mlen = matchPattern.length;
//   console.log("match len:" + mlen);
   if(mlen == PARR.length){
    //find str must equal to PARR
    for(var i=0; i<mlen; i++) {
     var pattStr =  matchPattern[i];
//     console.log( i + ":" + pattStr);
     var pattIndex = pattStr.match(/[0-9]+/);
//     console.log( i + ":" + pattIndex);
     if(pattIndex > 0){
      //replace parameters
      S = S.replace(pattStr,PARR[pattIndex-1]);
     }
    }
   }
  } 
return S;
};

範例:
var text = Hello _%s1 !!
console.log($.printf(text,["ibigd"]))
輸出結果: Hello ibigd !!


TIP:常用到Regex取代字串,記錄一下今天的心得!! String的match()相同於 regex物件的 exec(), 需注意正則的規則要加上g才能代表global的搜尋!!

沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails