# 国际化
[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