ThinkJS 國(guó)際化

2021-09-17 14:26 更新

國(guó)際化

獲取語(yǔ)言

可以通過(guò) http.lang 方法從 cookie 或者 header 里獲取當(dāng)前用戶的語(yǔ)言。如:

let lang = http.lang();

如果要支持從 cookie 里獲取用戶選擇的語(yǔ)言,那么需要設(shè)置語(yǔ)言在 cookie 里的名稱(chēng)??梢栽谂渲梦募?code>src/common/config/locale.js 里修改,如:

export default {
  cookie_name: "think_locale", //存放語(yǔ)言的 cookie 名稱(chēng)
  default: "en" //默認(rèn)語(yǔ)言
};

在 Controller 里可以直接通過(guò) this.lang 方法獲取對(duì)應(yīng)的語(yǔ)言。

從 URL 中解析語(yǔ)言

有些情況下,語(yǔ)言是要從 URL 中解析。比如:當(dāng)前頁(yè)面的地址是 https://www.thinkjs.org/zh-CN/doc/2.0/i18n.html,就包含了語(yǔ)言 zh-CN

這種情況下需要在項(xiàng)目里通過(guò) middleware 來(lái)解析其中的語(yǔ)言,如:

think.middleware("get_lang", http => {
  let supportLangs = think.config("locale.support");
  let lang = http.pathname.split("/")[0]; //從 URL 中獲取語(yǔ)言

  if(supportLangs.indexOf(lang) > -1){
    http.pathname = http.pathname.substr(lang.length + 1);
  }else{
    lang = http.lang(); //從 cookie 或者 header 中獲取語(yǔ)言
    if(supportLangs.indexOf(lang) === -1){
      lang = http.config("locale.default"); //默認(rèn)支持的語(yǔ)言
    }
  }
  http.lang(lang, true); //設(shè)置語(yǔ)言,并設(shè)置模版路徑中添加語(yǔ)言目錄
});

從 URL 中解析到語(yǔ)言后,通過(guò) http.lang 方法設(shè)置語(yǔ)言,后續(xù)在 Controller 里可以直接通過(guò) http.lang 來(lái)獲取語(yǔ)言了。

定義 middleware get_lang 后,添加到對(duì)應(yīng)的 hook 里。如:

export default {
  route_parse: ["prepend", "get_lang"], //將 get_lang 前置添加到 route_parse hook 里
}

語(yǔ)言變量配置

支持國(guó)際化的項(xiàng)目需要配置變量在不同語(yǔ)言下的值,配置文件在 src/common/config/locale/[lang].js,配置格式如下:

// src/common/config/locale/zh-CN.js
export default {
  "title-home": "ThinkJS官網(wǎng) - A Node.js MVC Framework Support All Of ES6/7 Features",
  "title-changelog": "更新日志 - ThinkJS官網(wǎng)",
}
// src/common/config/locale/en.js
export default {
  "title-home": "ThinkJS - A Node.js MVC Framework Support All Of ES6/7 Features",
  "title-changelog": "Changelog - ThinkJS"
}

獲取語(yǔ)言變量

配置語(yǔ)言變量后,可以通過(guò) http.locale 方法來(lái)獲取當(dāng)前語(yǔ)言對(duì)應(yīng)的變量值。如:

let homeTitle = http.locale("title-home");

如果在 Controller 中,可以直接通過(guò) this.locale 方法來(lái)獲取,如:

export default class extends think.controller.base {
  indexAction(){
    let homeTitle = this.locale("title-home");
  }
}

模版里使用語(yǔ)言變量

模版里可以通過(guò) _ 函數(shù)來(lái)獲取對(duì)應(yīng)的語(yǔ)言值。下面以 ejs 模版引擎為例:

<%- _("title-home") %>

設(shè)置模版語(yǔ)言路徑

有些項(xiàng)目中,需要根據(jù)不同的語(yǔ)言定制不同的模版,這時(shí)模版路徑里加一層語(yǔ)言目錄來(lái)處理就比較合適了。如:view/zh-CN/home/index_index.html,路徑中添加了一層 zh-CN 語(yǔ)言目錄。

可以通過(guò) http.lang 方法設(shè)置語(yǔ)言并設(shè)置在模版路徑里添加一層語(yǔ)言目錄。如:

http.lang(lang, true); // true 表示在模版路徑里添加一層語(yǔ)言目錄

在 Controller 里可以通過(guò) this.lang 方法來(lái)設(shè)定。如:

export default class extends think.controller.base {
  indexAction(){
    let lang = getFromUrl();
    this.lang(lang, true);
    ...
  }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)