与python gae,babel和i18n的国际化。无法输出正确的字符串

时间:2013-01-19 13:43:18

标签: python google-app-engine internationalization babel

jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),extensions=['jinja2.ext.i18n'], autoescape = True)
jinja_env.install_gettext_translations(i18n)

config['webapp2_extras.i18n'] = {
    'translations_path': 'locale',
    'template_path': 'views'
}

app = webapp2.WSGIApplication([
    ('/', MainController.MainPageHandler)
], config=config, debug=True)

在messages.po文件中。

  

“Project-Id-Version:PROJECT VERSION \ n”“Report-Msgid-Bugs-To:EMAIL @ ADDRESS \ n”“POT-Creation-Date:2013-01-19   19:26 + 0800 \ n“”采购订单修订日期:2013-01-19 19:13 + 0800 \ n“   “Last-Translator:FULL NAME \ n”“语言团队:en_US   \ n“”复数形式:nplurals = 2;复数=(n!= 1)\ n“   “MIME-Version:1.0 \ n”“Content-Type:text / plain; charset = utf-8 \ n”   “Content-Transfer-Encoding:8bit \ n”“Generated-By:Babel 0.9.6 \ n”

     

#~msgid“Hello-World”

     

#~msgstr“Hello World”

在处理程序中:

from webapp2_extras import i18n

from webapp2_extras.i18n import gettext as _

class MainPageHandler(Handler.Handler):
    def get(self):
        locale = self.request.GET.get('locale', 'en_US')
        i18n.get_i18n().set_locale(locale)
        logging.info(locale)
        message = _('Hello-World')
        logging.info(message)
        self.render("main.html")

在html文件中:

<div id="main">

    {{ _("Hello-World") }}
</div>

导航到网页时,会返回字符串“Hello-World”而不是“Hello World”。我不知道出了什么问题。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

可能有些错误,或者可能只是在描述中遗漏了......

带有webapp2翻译的默认“域”是“消息”,而不是“消息”,因此如果您输入的文件实际上是“message.po”,则需要更改。

其次,翻译工作在已编译的.mo文件中,而不是.po,所以如果你还没有运行编译步骤(pybabel compile -f -d ./locale),你需要这样做。 您应该有locale/en_US/LC_MESSAGES/messages.mo

的文件

答案 1 :(得分:3)

谢谢,@ tipsywacky,我和jinja2,babel和GAE有点迷茫,你的代码让我走上了正确的道路。

我想与其他“堆叠器”分享我的代码,在这里您可以欣赏一个奇怪的事情:不知道为什么,但我不需要设置 config var来制作一切正常。

import webapp2
import jinja2
import os
import logging
# Internacionalization functions
from webapp2_extras import i18n
from webapp2_extras.i18n import gettext as _
# Put here the path to the jinja templates, relative to the actual file
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "views"))),
        extensions=['jinja2.ext.i18n'],
        autoescape=False)
jinja_env.install_gettext_translations(i18n)


# This controller handles the generation of the front page.
class MainPage(webapp2.RequestHandler):
    def get(self):
        locale = self.request.get('locale', 'es_ES')
        i18n.get_i18n().set_locale(locale)
        logging.info(_('Hello-World'))
        template = jinja_environment.get_template('main.html')
        self.response.out.write(template.render())

app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

仅使用此代码和HTML文件(以及编译的message.mo文件):

<div id="main">
    {{ _("Hello-World") }}
</div>

我的应用程序会对日志文本和HTML文本进行翻译。

这太好了,我花了整整一天寻找一种做本地化的方法,最后我得到了它。

我唯一不理解的是你的配置变量。为什么我不需要它?

答案 2 :(得分:2)

好吧,弄明白了什么。

在messages.po文件中,我将#: gettext_example.py:16放在msgid "Hello-World"的顶部。然后重新编译它,它可以工作。