Как локализовать мое сообщение проверки WTForms? - PullRequest
3 голосов
/ 10 декабря 2011

Я почти локализовал мое сообщение для проверки, так как вы видите, что оно работает для английского и шведского:

Английский:

enter image description here

Шведский:

enter image description here

Но когда я переключаюсь на португальский, я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "/media/Lexar/montao/lib/webapp2/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/media/Lexar/montao/montaoproject/main.py", line 1749, in post
    current_user=self.current_user,
  File "/media/Lexar/montao/montaoproject/main.py", line 466, in render_jinja
    self.response.out.write(template.render(data))
  File "/media/Lexar/montao/montaoproject/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/media/Lexar/montao/montaoproject/templates/insert_jinja.html", line 249, in top-level template code
    <ul class="errors">{% for error in form.name.errors %}<li>{{ error }}</li>{% endfor %}</ul>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Я думаю, что у меня было это сообщение об ошибке раньше, и я не знаю, каксправиться с этим.Не могли бы вы мне помочь?Почему появляется это сообщение об ошибке?

Код для моего класса формы:

class AdForm(Form):
    my_choices = [('1', _('VEHICLES')), ('2', _('Cars')), ('3', _('Bicycles'))]

    name = TextField(_('Name'), [validators.Length(min=4, max=50,
                     message=_(u'Name is required') )])
    title = TextField(_('title'), [validators.Required()])
    text = TextAreaField(_('Text'), widget=TextArea())
    phonenumber = TextField(_('Phone number'))
    phoneview = BooleanField(_('Display phone number on site'))
    price = TextField(_('Price'))
    password = PasswordField(_('Password'))
    email = TextField(_('Email'))
    category = SelectField(choices = my_choices, default = '1')

Часть перевода в моем файле .po:

msgid "Name is required"
msgstr "É necessário o nome"

Мой файл pythonначинается вот так

#!/usr/bin/python
# -*- coding: utf-8 -*-

И AFAIK Я установил все, что могу, на Unicode и UTF-8.

Спасибо за помощь

1 Ответ

6 голосов
/ 11 декабря 2011

Если вы хотите использовать в своих переводах символы Юникода, вам нужно использовать служебную функцию ugettext_lazy, а не gettext_lazy.
Основное отличие, как подсказывает название функции, состоит в том, что ugettext_lazy является unicode, а gettext_lazy - нет (что делает его, кстати, не таким уж полезным).

Пока вы это делаете, вы можете / должны использовать юникод вместо строк по умолчанию, когда это возможно, то есть конвертировать ввод в Unicode как можно скорее и кодировать вывод как можно позже в соответствующую кодировку.

...