一、Tornado的語言國際化方法
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站建設、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的宣化網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
Tornado做國際化折騰了一下下,Tornado這部分的官方文檔太poor了。所以自己記錄一下如何用tornado結合gettext做國際化。
第一步,在項目路徑下建立./locales/zh_CN/LC_MESSAGES文件夾。
第二步,使用xgettext或poedit在第一步的文件夾下創(chuàng)建一個po文件,比如messages.po,我用poedit創(chuàng)建,比xgettext方便一些。
第三步,編輯該messages.po文件,當然,po文件有自己特定的格式,需要按照它的格式編寫。
msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "X-Generator: Poedit 1.8.4\n" msgid "Sign in" msgstr "登入" msgid "Sign out" msgstr "登出" msgid "Username" msgstr "用戶名" msgid "Password" msgstr "密碼"
msgid是網(wǎng)頁里原先的文本內(nèi)容,msgstr是準備替換的內(nèi)容。新內(nèi)容直接用編輯器往后追加msgid和msgstr就可以了。
第四步,修改HTML網(wǎng)頁模板
{% include '../header.html' %}
html里面的{{ _("Sign in") }}等內(nèi)容就是需要gettext查找和替換的內(nèi)容。
第五步,在tornado主文件內(nèi)添加gettext支持的方法。
import os import tornado.autoreload import tornado.httpserver import tornado.ioloop import tornado.web import tornado.locale ''' ... ''' if __name__ == '__main__': tornado.locale.set_default_locale('zh_CN') tornado.locale.load_gettext_translations('./locales', 'messages') server = tornado.httpserver.HTTPServer(application) server.listen(20000) loop = tornado.ioloop.IOLoop.instance() tornado.autoreload.start(loop) loop.start()
由于我用的ubuntu系統(tǒng),所以 第六步,在自己寫的Handler里面,加入locale.translate _=self.locale.translate,self.locale.translate實際是一個方法,那么把這個方法放到_這個對象里面,然后_方法會被自動代入到模板中去執(zhí)行替換_("Sign in"),所以實際在模板里面寫的 {{ _("Sign in") }}實際上是讓Tornado執(zhí)行tornado.locale.translate()方法。這樣的話,如果我去掉之前的set_default_locale(),頁面顯示的就是英文的Sign in,加上,顯示的就是中文的登入。 同樣,Tornado也可以使用一個csv文件作為翻譯的基礎字典,默認是采用csv方式的。 二、Tornado作為HTTP client執(zhí)行RESTful命令。 之前已經(jīng)記錄了Tornado異步的客戶端,昨天調(diào)試了一下用Tornado做HDFS和YARN的RESTful客戶端。HDFS的RESTful方式,不能使用異步,需要使用Tornado同步客戶端才可以。HDFS和YARN的RESTful管理方式需要用到HTTP的四種查詢方式,GET,POST,PUT,DELETE。其中PUT和DELETE的方式跟POST和GET很類似。 比如 HDFS的MKDIRS方法放在PUT組里面,所以提交的參數(shù)需要用urlencode進行編碼轉換后PUT給RESTful接口。 而DELETE則是。 跟GET方式一樣,DELETE不需要封裝傳遞參數(shù)。class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
_ = self.locale.translate
user = self.get_secure_cookie('username')
return user
class SigninHandler(BaseHandler):
def get(self):
self.render('User/sign_in.html')
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
if username == 'xianglei':
self.set_secure_cookie('username', 'xianglei')
self.redirect('/')
class SignoutHandler(BaseHandler):
def get(self, *args, **kwargs):
self.clear_all_cookies()
self.redirect('/')
class MakeDirectoryHandler(BaseHandler):
@tornado.web.authenticated
def post(self):
host = self.get_argument('host')
port = self.get_argument('port')
directory = self.get_argument('directory')
username = self.get_secure_cookie('username')
base_url = 'http://'+host+':'+port+'/webhdfs/v1'+directory+'?op=MKDIRS&user.name='+username
put_body = dict()
put_body['op'] = 'MKDIRS'
put_body['user.name'] = username
put_body = urllib.urlencode(put_body)
try:
http = tornado.httpclient.HTTPClient()
response = http.fetch(
tornado.httpclient.HTTPRequest(
url=base_url,
method='PUT',
body=put_body,
)
)
self.write(response.body)
except tornado.httpclient.HTTPError, e:
self.write('{"errcode":"'+str(e).replace('\n', '
')+'"}')class RemoveHandler(BaseHandler):
@tornado.web.authenticated
def post(self):
host = self.get_argument('host')
port = self.get_argument('port')
filename = self.get_argument('filename')
'''
If recursive = true, it use to remove whole directory
If recursive = false, it use to remove a file or an empty directory
The argument must be string.
'''
recursive = self.get_argument('recursive')
username = self.get_secure_cookie('username')
base_url = 'http://'+host+':'+port+'/webhdfs/v1'+filename+'?op=DELETE&recursive='+recursive+'&user.name='+username
try:
http = tornado.httpclient.HTTPClient()
response = http.fetch(
tornado.httpclient.HTTPRequest(
url=base_url,
method='DELETE',
)
)
self.write(response.body)
except tornado.httpclient.HTTPError, e:
self.write('{"errcode":"'+str(e).replace('\n', '
')+'"}')
文章標題:Tornado學習筆記(四)
網(wǎng)址分享:http://weahome.cn/article/igssdh.html