如果要支持从 cookie 里获取用户选择的语言,那么需要设置语言在 cookie 里的名称。可以在配置文件 src/common/config/locale.js 里修改,如:

    1. export default {
    2. cookie_name: 'think_locale', //存放语言的 cookie 名称
    3. default: 'en' //默认语言
    4. };

    在 Controller 里可以直接通过 this.lang 方法获取对应的语言。

    从 URL 中解析语言

    有些情况下,语言是要从 URL 中解析。比如:当前页面的地址是 https://www.thinkjs.org/zh-cn/doc/2.0/i18n.html,就包含了语言 zh-cn

    这种情况下需要在项目里通过 middleware 来解析其中的语言,如:

    1. think.middleware('get_lang', http => {
    2. let supportLangs = think.config('locale.support');
    3. let lang = http.pathname.split('/')[0]; //从 URL 中获取语言
    4. if(supportLangs.indexOf(lang) > -1){
    5. }else{
    6. lang = http.lang(); //从 cookie 或者 header 中获取语言
    7. if(supportLangs.indexOf(lang) === -1){
    8. lang = http.config('locale.default'); //默认支持的语言
    9. }
    10. http.lang(lang, true); //设置语言,并设置模版路径中添加语言目录
    11. });

    定义 middleware get_lang 后,添加到对应的 hook 里。如:

    支持国际化的项目需要配置变量在不同语言下的值,配置文件在 src/common/config/locale/[lang].js,配置格式如下:

    1. // src/common/config/locale/zh-cn.js
    2. export default {
    3. 'title-home': 'ThinkJS官网 - A Node.js MVC Framework Support All Of ES6/7 Features',
    4. 'title-changelog': '更新日志 - ThinkJS官网',
    5. }
    1. // src/common/config/locale/en.js
    2. export default {
    3. 'title-changelog': 'Changelog - ThinkJS'
    4. }

    获取语言变量

    配置语言变量后,可以通过 http.locale 方法来获取当前语言对应的变量值。如:

    如果在 Controller 中,可以直接通过 方法来获取,如:

    1. export default class extends think.controller.base {
    2. indexAction(){
    3. let homeTitle = this.locale('title-home');
    4. }
    5. }
    1. <%- _('title-home') %>

    设置模版语言路径

    有些项目中,需要根据不同的语言定制不同的模版,这时模版路径里加一层语言目录来处理就比较合适了。如:view/zh-cn/home/index_index.html,路径中添加了一层 zh-cn 语言目录。

    可以通过 http.lang 方法设置语言并设置在模版路径里添加一层语言目录。如:

    在 Controller 里可以通过 this.lang 方法来设定。如:

    1. export default class extends think.controller.base {
    2. indexAction(){
    3. let lang = getFromUrl();
    4. this.lang(lang, true);
    5. ...
    6. }