网站首页学无止境PYTHON

python框架Tornado之二Tornado 攻略(7) 本地化

发布时间:2014-07-25 17:24:24编辑:songlin阅读(142)

    本地化

    不管有没有登陆,当前用户的 locale 设置可以通过两种方式访问到:请求处理器的 self.locale 对象、以及模板中的locale 值。Locale 的名称(如 en_US)可以 通过 locale.name 这个变量访问到,你可以使用 locale.translate 来进行本地化 翻译。在模板中,有一个全局方法叫 _(),它的作用就是进行本地化的翻译。这个 翻译方法有两种使用形式:

    1. _("Translate this string"

    它会基于当前 locale 设置直接进行翻译,还有一种是:
     

    1. _("A person liked this""%(num)d people liked this", len(people)) % {"num": len(people)} 

    这种形式会根据第三个参数来决定是使用单数或是复数的翻译。上面的例子中,如果 len(people) 是 1 的话,就使用第一种形式的翻译,否则,就使用第二种形式 的翻译。

    常用的翻译形式是使用 Python 格式化字符串时的“固定占位符(placeholder)”语法,(例如上面的 %(num)d),和普通占位符比起来,固定占位符的优势是使用时没有顺序限制。

    一个本地化翻译的模板例子:
     

    1. <html>
    2.    <head>
    3.       <title>FriendFeed - {{ _("Sign in") }}title>
    4.    head>
    5.    <body>
    6.      <form action="{{ request.path }}" method="post">
    7.        <div>{{ _("Username") }} <input type="text" name="username"/>div>
    8.        <div>{{ _("Password") }} <input type="password" name="password"/>div>
    9.        <div><input type="submit" value="{{ _("Sign in") }}"/>div>
    10.        {{ xsrf_form_html() }} 
    11.      form>
    12.    body>
    13.  html>

    默认情况下,我们通过 Accept-Language 这个头来判定用户的 locale,如果没有, 则取 en_US 这个值。如果希望用户手动设置一个 locale 偏好,可以在处理请求的 类中复写 get_user_locale 方法:
     

    1. class BaseHandler(tornado.web.RequestHandler): 
    2.     def get_current_user(self): 
    3.         user_id = self.get_secure_cookie("user"
    4.         if not user_id: return None
    5.         return self.backend.get_user_by_id(user_id) 
    6.  
    7.     def get_user_locale(self): 
    8.         if "locale" not in self.current_user.prefs: 
    9.             # Use the Accept-Language header
    10.             return None
    11.         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() 方法中调用一次该函数:
     

    1. def main(): 
    2.     tornado.locale.load_translations( 
    3.         os.path.join(os.path.dirname(__file__), "translations")) 
    4.     start_server() 

    你可以使用 tornado.locale.get_supported_locales() 方法得到支持的 locale 列表。Tornado 会依据用户当前的 locale 设置以及已有的翻译,为用户选择 一个最佳匹配的显示语言。比如,用户的 locale 是 es_GT 而翻译中只支持了es, 那么 self.locale 就会被设置为 es。如果找不到最接近的 locale 匹配,self.locale 就会就会取备用值 es_US

    查看 locale 模块 的代码文档以了解 CSV 文件的格式,以及其它的本地化方法函数。

本文来源地址:http://sebug.net/paper/books/tornado/