# 國(guó)際化
[TOC=2,3]
## 獲取語(yǔ)言
可以通過(guò)?`http.lang`?方法從 cookie 或者 header 里獲取當(dāng)前用戶的語(yǔ)言。如:
~~~
let lang = http.lang();
~~~
如果要支持從 cookie 里獲取用戶選擇的語(yǔ)言,那么需要設(shè)置語(yǔ)言在 cookie 里的名稱??梢栽谂渲梦募src/common/config/locale.js`?里修改,如:
~~~
export default {
cookie_name: "think_locale", //存放語(yǔ)言的 cookie 名稱
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);
...
}
}
~~~
- 快速入門
- 介紹
- 創(chuàng)建項(xiàng)目
- 項(xiàng)目結(jié)構(gòu)
- 代碼規(guī)范
- 升級(jí)指南
- 進(jìn)階應(yīng)用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務(wù)
- 關(guān)聯(lián)模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴(kuò)展功能
- thinkjs 命令
- 靜態(tài)資源訪問(wèn)
- Middleware
- Service
- Cookie
- 錯(cuò)誤處理
- 錯(cuò)誤信息
- 數(shù)據(jù)校驗(yàn)
- 國(guó)際化
- 路徑常量
- REST API
- 定時(shí)任務(wù)
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware
