ThinkJS 国际化

2021-09-17 14:26 更新

国际化

获取语言

可以通过 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);
    ...
  }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号