使用gettext翻译Tornado模板时出错

时间:2016-08-12 20:10:48

标签: python-2.7 tornado gettext

我已经将这个网站运行在Tornado和我想要国际化的模板引擎的顶部,所以我想用gettext来帮助我。

由于我的网站已经是葡萄牙语,我的message.po(模板)文件也包含所有的葡萄牙语msgid(例如):

#: base.html:30 base.html:51
msgid   "Início"
msgstr  ""

它是使用xgettext:

生成的
xgettext -i *.html -L Python --from-code UTF-8

后来我使用Poedit生成翻译文件en_US.po,然后将其编译为en_US.mo。 存储在我的翻译文件夹中:

translation/en_US/LC_MESSAGES/site.mo 

到目前为止,非常好。

我创建了一个非常简单的RequestHandler,可以呈现并返回翻译过的网站。

import os
import logging
from tornado.web import RequestHandler
import tornado.locale as locale

LOG = logging.getLogger(__name__)

class SiteHandler(RequestHandler):

    def initialize(self):
        locale.load_gettext_translations(os.path.join(os.path.dirname(__file__), '../translations'), "site")

    def get(self, page):
        LOG.debug("PAGE REQUESTED: %s", page)
        self.render("site/%s.html" %page)

据我所知,这应该可以完美运作,但不知怎的,我遇到了一些问题:

1 - 我如何告诉Tornado我的模板的文本是葡萄牙语,所以它不会去寻找我没有的pt语言环境?

2 - 当询问具有en_US语言环境的站点时,它加载正常但是当Tornado要翻译时,它会抛出编码异常。

TypeError: not all arguments converted during string formatting
ERROR:views.site:Could not load template
Traceback (most recent call last):
  File "/Users/ademarizu/Dev/git/new_plugin/site/src/main/py/views/site.py", line 20, in get
    self.render("site/%s.html" %page)
  File "/Users/ademarizu/Dev/virtualEnvs/execute/lib/python2.7/site-packages/tornado/web.py", line 664, in render
    html = self.render_string(template_name, **kwargs)
  File "/Users/ademarizu/Dev/virtualEnvs/execute/lib/python2.7/site-packages/tornado/web.py", line 771, in render_string
    return t.generate(**namespace)
  File "/Users/ademarizu/Dev/virtualEnvs/execute/lib/python2.7/site-packages/tornado/template.py", line 278, in generate
    return execute()
  File "site/home_html.generated.py", line 11, in _tt_execute
    _tt_tmp = _("Início")  # site/base.html:30
  File "/Users/ademarizu/Dev/virtualEnvs/execute/lib/python2.7/site-packages/tornado/locale.py", line 446, in translate
    return self.gettext(message)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py", line 406, in ugettext
    return self._fallback.ugettext(message)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py", line 407, in ugettext
    return unicode(message)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)

任何帮助?

啊,我正在运行python 2.7顺便说一句!

1 个答案:

答案 0 :(得分:1)

  

1 - 如何告诉Tornado我的模板的文本是葡萄牙语,所以它不会去寻找我不具备的pt语言环境?

这是set_default_locale方法的用途。在启动时调用import React from 'react' let scrollClass = 'Feed'; function handleScroll(e) { scrollClass = 'Feed scrolling'; } export default function Feed(){ return ( <div className={scrollClass} onScroll={(e) => handleScroll(e)}> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur arcu leo. </div> ) } (或tornado.locale.set_default_locale('pt')等)一次,告诉龙卷风您的模板源是葡萄牙语。

  

2 - 当询问具有en_US语言环境的站点时,它加载正常但是当Tornado要翻译时,它会抛出编码异常。

请记住,在Python 2中,包含非ascii字符的字符串需要标记为unicode。而不是pt_BR,请使用_("Início")