企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 国际化 [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); ... } } ~~~