2016-08-12 2 views
0

У меня этот сайт работает сверху с Tornado и его движком шаблонов, который я хочу интернационализировать, поэтому я подумал об использовании gettext, чтобы помочь мне в этом.Ошибка при переводе шаблона Tornado с gettext

Поскольку мой сайт уже на португальском языке, мой файл message.po (шаблон) имеет все MsgID это находится в португальском, а также (пример):

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

Он был создан с: зная искомых

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 - Как я могу сказать, что мой Торнадо шаблон имеет свой текст на португальском языке, поэтому он не будет пойти искать язык, который у меня нет?

2 - При запросе сайта с en_US locale он загружается нормально, но когда 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

1 - Как сообщить Tornado, что мой шаблон имеет свой текст на португальском, чтобы он не искал языковой стандарт pt, которого у меня нет?

Это то, что нужно для метода set_default_locale. Позвоните tornado.locale.set_default_locale('pt') (или pt_BR и т. Д.) Один раз при запуске, чтобы сообщить торнадо, что ваш источник шаблона находится на португальском языке.

2 - При запросе сайта с en_US locale он загружается нормально, но когда Tornado собирается перевести, он выдает исключение для кодирования.

Помните, что в Python 2 строки, содержащие символы не-ascii, должны быть помечены как unicode. Вместо _("Início") используйте _(u"Início").

+0

благодарит за вас за помощь! Ты спасатель жизни! = D – ademarizu

Смежные вопросы