首頁  >  問答  >  主體

javascript - 如何優雅的在一個js檔案裡配置多語言(i18n),求探討思路

我搜尋了搜尋資料,發現大多數是不同語言的js檔案分開做,然後根據使用者語言環境去載入對應的js檔案。

但我現在因為使用場景限制,最好是在一個js檔案裡完成。我現在打算支援3種語言(中文、日文、英文),而且輸出文字的地方也比較多,可能有上百條,中間也常常要拼接變數。

使用場景範例:

var result=10;
document.body.innerHTML="一共有"+result+"个结果";

現在我的想法有兩種,一種是把語言文字存到一個變數裡;一種是把文字寫在原地,形式為數組,然後使用下標呼叫。

思路1:

// 方式1:判断语言后确定唯一的结果。有点割裂,而且在使用时只能看到属性名,影响思路
// {w1}是占位符,每个配置写了多遍是为了模拟数量多的时候的情景
var lang={};
if () {    // 判断为中文
    lang.tip1="一共有{w1}个结果";
    // lang.tip2="一共有{w1}个结果";
    // lang.tip3="一共有{w1}个结果";
    // lang.tip4="一共有{w1}个结果";
    // lang.tip5="一共有{w1}个结果";
}else if(){    // 判断为日文
    lang.tip1="{w1}の結果の合計";
    // lang.tip2="{w1}の結果の合計";
    // lang.tip3="{w1}の結果の合計";
    // lang.tip4="{w1}の結果の合計";
    // lang.tip5="{w1}の結果の合計";
}else if(){    // 判断为英文
    lang.tip1="There is a total of {w1} result";
    // lang.tip2="There is a total of {w1} result";
    // lang.tip3="There is a total of {w1} result";
    // lang.tip4="There is a total of {w1} result";
    // lang.tip5="There is a total of {w1} result";
}
var result=10;
document.body.innerHTML=lang.tip1.replace("{w1}",result);

思路2:

// 方式2:判断语言后只做个下标,文字写在原地方。这样使用时可以知道这里写的是什么,但似乎比较乱
var lang;
if () {    // 判断为中文
    lang=0;
}else if(){    // 判断为日文
    lang=1;
}else if(){    // 判断为英文
    lang=2;
}
var result=10;
document.body.innerHTML=["一共有{w1}个结果","{w1}の結果の合計","There is a total of {w1} result"][lang].replace("{w1}",result);

其實第一種方法形式上較為優雅,不過我個人傾向第二種,主要是我看程式碼的時候知道這裡寫的是什麼。如果透過變數名稱判斷內容的話則比較麻煩(主要是條數太多,雖然我實際使用的話要把變數名稱做語意化處理,但能簡短、準確描述內容的情況也不多)。

請問大家有其他想法或解決辦法嗎?

漂亮男人漂亮男人2662 天前1114

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-07-05 10:50:33

    你的意思大概是想把所有文字都翻譯,但由於語法結構問題變量的位置是未知的不知道怎麼解決是吧?
    思路的話其實你可以參考模板渲染的思路.
    我打個比方

    var language = {
        'hello': [
            'hello,{val}!',
            '{val},コン!'
        ]
    };
    var lang = 0; // 当前英文
    
    function translate (msgVariable, data, msg) {
        if (msg !== undefined) language[msgVariable].push(msg);
        return language[msgVariable][lang].replace('{val}', data);
    }
    var data = '张三';
    var msg = translate('hello', data, '你好,{val}!');

    回覆
    0
  • 迷茫

    迷茫2017-07-05 10:50:33

    比如這樣?

    var hello = {
        "cn" : "哈喽",
        "jp" : "こんにちは",
        "en" : "f**k you"
    };
    
    //在页面初始化的时候判断当前的环境,然后直接设定key值就可以,比如说我现在是日语
    var lang = "jp";
    console.log(hello[lang]);
    //拓展的话往对象里面加值就行了,比如说加韩文
    var hello = {
        "cn" : "哈喽",
        "jp" : "こんにちは",
        "en" : "f**k you",
        "kr" : "为何不洗澡思密达"
    };
    lang = "kr";
    console.log(hello[lang]);

    回覆
    0
  • typecho

    typecho2017-07-05 10:50:33

    您的問題算是i18n/L10n的範圍,或許可以找到像

    • jQuery.i18n

    • JavaScript I18n And L10n
      等等的國際化和本地化的javascript 庫。第一個庫還是維基媒體搞出來的,很有參考價值。

    其他基本的i18n/L10n內容及庫,別錯過

    • Unicode CLDR如簡中語言表

    • ICU library

    本人對i18n/L10n的在中國的發展很感興趣,一起切磋成長。

    回覆
    0
  • 取消回覆