多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 本地化 不管有没有登陆,当前用户的 locale 设置可以通过两种方式访问到:请求处理器的 `self.locale` 对象、以及模板中的 `locale` 值。Locale 的名称(如 `en_US`)可以 通过 `locale.name` 这个变量访问到,你可以使用 `locale.translate` 来进行本地化 翻译。在模板中,有一个全局方法叫 `_()`,它的作用就是进行本地化的翻译。这个 翻译方法有两种使用形式: ``` _("Translate this string") ``` 它会基于当前 locale 设置直接进行翻译,还有一种是: ``` _("A person liked this", "%(num)d people liked this", len(people)) % {"num": len(people)} ``` 这种形式会根据第三个参数来决定是使用单数或是复数的翻译。上面的例子中,如果 `len(people)` 是 `1` 的话,就使用第一种形式的翻译,否则,就使用第二种形式 的翻译。 常用的翻译形式是使用 Python 格式化字符串时的“固定占位符(placeholder)”语法,(例如上面的 `%(num)d`),和普通占位符比起来,固定占位符的优势是使用时没有顺序限制。 一个本地化翻译的模板例子: ``` <html> <head> <title>FriendFeed - {{ _("Sign in") }}</title> </head> <body> <form action="{{ request.path }}" method="post"> <div>{{ _("Username") }} <input type="text" name="username"/></div> <div>{{ _("Password") }} <input type="password" name="password"/></div> <div><input type="submit" value="{{ _("Sign in") }}"/></div> {{ xsrf_form_html() }} </form> </body> </html> ``` 默认情况下,我们通过 `Accept-Language` 这个头来判定用户的 locale,如果没有, 则取 `en_US` 这个值。如果希望用户手动设置一个 locale 偏好,可以在处理请求的 类中复写 `get_user_locale` 方法: ``` class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): user_id = self.get_secure_cookie("user") if not user_id: return None return self.backend.get_user_by_id(user_id) def get_user_locale(self): if "locale" not in self.current_user.prefs: # Use the Accept-Language header return None return self.current_user.prefs["locale"] ``` 如果 `get_user_locale` 返回 `None`,那么就会再去取 `Accept-Language` header 的值。 你可以使用 `tornado.locale.load_translations` 方法获取应用中的所有已存在的翻 译。它会找到包含有特定名字的 CSV 文件的目录,如 `es_GT.csv` `fr_CA.csv` 这 些 csv 文件。然后从这些 CSV 文件中读取出所有的与特定语言相关的翻译内容。典型的用例 里面,我们会在 Tornado 服务器的 `main()` 方法中调用一次该函数: ``` def main(): tornado.locale.load_translations( os.path.join(os.path.dirname(__file__), "translations")) start_server() ``` 你可以使用 `tornado.locale.get_supported_locales()` 方法得到支持的 locale 列表。Tornado 会依据用户当前的 locale 设置以及已有的翻译,为用户选择 一个最佳匹配的显示语言。比如,用户的 locale 是 `es_GT` 而翻译中只支持了 `es`, 那么 `self.locale` 就会被设置为 `es`。如果找不到最接近的 locale 匹配,`self.locale` 就会就会取备用值 `es_US`。 查看 [`locale` 模块](http://github.com/facebook/tornado/blob/master/tornado/locale.py) 的代码文档以了解 CSV 文件的格式,以及其它的本地化方法函数。