# 國際化
[TOC=2,3]
## 獲取語言
可以通過?`http.lang`?方法從 cookie 或者 header 里獲取當前用戶的語言。如:
~~~
let lang = http.lang();
~~~
如果要支持從 cookie 里獲取用戶選擇的語言,那么需要設置語言在 cookie 里的名稱。可以在配置文件`src/common/config/locale.js`?里修改,如:
~~~
export default {
cookie_name: "think_locale", //存放語言的 cookie 名稱
default: "en" //默認語言
};
~~~
在 Controller 里可以直接通過?`this.lang`?方法獲取對應的語言。
## 從 URL 中解析語言
有些情況下,語言是要從 URL 中解析。比如:當前頁面的地址是?`https://www.thinkjs.org/zh-CN/doc/2.0/i18n.html`,就包含了語言?`zh-CN`。
這種情況下需要在項目里通過 middleware 來解析其中的語言,如:
~~~
think.middleware("get_lang", http => {
let supportLangs = think.config("locale.support");
let lang = http.pathname.split("/")[0]; //從 URL 中獲取語言
if(supportLangs.indexOf(lang) > -1){
http.pathname = http.pathname.substr(lang.length + 1);
}else{
lang = http.lang(); //從 cookie 或者 header 中獲取語言
if(supportLangs.indexOf(lang) === -1){
lang = http.config("locale.default"); //默認支持的語言
}
}
http.lang(lang, true); //設置語言,并設置模版路徑中添加語言目錄
});
~~~
從 URL 中解析到語言后,通過?`http.lang`?方法設置語言,后續在 Controller 里可以直接通過?`http.lang`?來獲取語言了。
定義 middleware?`get_lang`?后,添加到對應的 hook 里。如:
~~~
export default {
route_parse: ["prepend", "get_lang"], //將 get_lang 前置添加到 route_parse hook 里
}
~~~
## 語言變量配置
支持國際化的項目需要配置變量在不同語言下的值,配置文件在?`src/common/config/locale/[lang].js`,配置格式如下:
~~~
// src/common/config/locale/zh-CN.js
export default {
"title-home": "ThinkJS官網 - A Node.js MVC Framework Support All Of ES6/7 Features",
"title-changelog": "更新日志 - ThinkJS官網",
}
~~~
~~~
// 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"
}
~~~
## 獲取語言變量
配置語言變量后,可以通過?`http.locale`?方法來獲取當前語言對應的變量值。如:
~~~
let homeTitle = http.locale("title-home");
~~~
如果在 Controller 中,可以直接通過?`this.locale`?方法來獲取,如:
~~~
export default class extends think.controller.base {
indexAction(){
let homeTitle = this.locale("title-home");
}
}
~~~
## 模版里使用語言變量
模版里可以通過?`_`?函數來獲取對應的語言值。下面以?`ejs`?模版引擎為例:
~~~
<%- _("title-home") %>
~~~
## 設置模版語言路徑
有些項目中,需要根據不同的語言定制不同的模版,這時模版路徑里加一層語言目錄來處理就比較合適了。如:`view/zh-CN/home/index_index.html`,路徑中添加了一層?`zh-CN`?語言目錄。
可以通過?`http.lang`?方法設置語言并設置在模版路徑里添加一層語言目錄。如:
~~~
http.lang(lang, true); // true 表示在模版路徑里添加一層語言目錄
~~~
在 Controller 里可以通過?`this.lang`?方法來設定。如:
~~~
export default class extends think.controller.base {
indexAction(){
let lang = getFromUrl();
this.lang(lang, true);
...
}
}
~~~
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware