Django i18n: общие причины появления переводов не появляются - PullRequest
18 голосов
/ 24 февраля 2010

Я делаю многоязычный веб-сайт Django. Я создал файл сообщений, заполнил и скомпилировал его. Я проверил сайт (в данном случае администратор) на желаемом языке (иврите), и большинство фраз на иврите появляются так, как должны, но некоторые этого не делают. Я проверил источник, и они по-прежнему выглядят как _('Whatever'), как они должны, также они переведены в файл сообщений, и да, я не забыл сделать compilemessages.

Каковы некоторые распространенные причины, по которым переводы не появляются таким образом?

Ответы [ 8 ]

25 голосов
/ 04 марта 2010

Может быть переведенные строки помечены как fuzzy?

16 голосов
/ 08 ноября 2013

Только что получил удар. У меня был каталог locale/ в корне моего проекта, но по умолчанию Django ищет переводы в каталогах INSTALLED_APPS и переводы по умолчанию. Так что он не нашел переводы, которые я добавил. Но некоторые из моих строк были в переводах по умолчанию, которые поставляются с Django (например, «Поиск»), поэтому было переведено несколько строк, что меня смутило.

Чтобы добавить каталог, в котором находились мои переводы, в список мест, в которых Django будет искать переводы, мне пришлось установить параметр LOCALE_PATHS . Так что в моем случае, когда каталог locale/ и settings.py находились в корне проекта django, я мог бы поместить в settings.py следующее:

from os import path
LOCALE_PATHS = (
    path.join(path.abspath(path.dirname(__file__)), 'locale'),
)
8 голосов
/ 03 марта 2010

Возможная причина: Ленивый перевод .

Например, в views.py вы должны использовать ugettext :

from django.utils.translation import ugettext as _

Но в models.py вы должны использовать ugettext_lazy :

from django.utils.translation import ugettext_lazy as _
7 голосов
/ 03 ноября 2010

Привет, просто приложите некоторые исправления, которые я должен был сделать в прошлом:

  • Перезагрузите веб-сервер!

В файле настроек - USE_I18N = True необходимо

  • django.middleware.locale.LocaleMiddleware среди модулей промежуточного программного обеспечения (но это точно не ваш случай, если Django не будет заботиться о вашем локальном)

  • django.core.context_processors.i18n среди TEMPLATE_CONTEXT_PROCESSORS

наверняка у меня были другие проблемы, связанные с переводами, но я не помню их всех ... надеюсь, это поможет!

6 голосов
/ 13 мая 2017

Я пытаюсь предоставить полный контрольный список:

  • В settings.py, правильно ли установлены USE_I18N, USE_L10N, LANGUAGE_CODE и LOCALE_PATHS?

    • См. этот список для всех допустимых значений идентификаторов языка. Обратите внимание, что упрощенный китайский указан zh-hans, а не zh-cn.
  • В settings.py входит django.middleware.locale.LocaleMiddleware в MIDDLEWARE в правильном порядке ?

  • Вы (повторно) запускали django-admin makemessages -l <locale-name> с правильным локальным именем, из правильного места ?

    • Вы можете увидеть неполный список разрешенных имен локалей, запустив ls your/path/to/python/site-packages/django/conf/locale/ на вашем компьютере или , взглянув на исходный код
    • Обратите внимание, что здесь нужно использовать _ вместо -. Например, чтобы указать упрощенный китайский, выполните django-admin makemessages -l zh_Hans, а не zh_CN или zh_hans или zh-Hans или что-нибудь еще.
  • Вы удалили все теги fuzzy в ваших файлах PO?

  • Скомпилировали ли вы файл (-ы) OP с помощью django-admin compilemessages?

  • Вы перезапустили веб-сервер?

Дополнительные примечания:

  • Если часть вашего перевода переопределена переводом по умолчанию в Django, используйте контекстные маркеры , чтобы обойти его. Например,

models.py

first_name = models.CharField(
    pgettext_lazy('override default', 'first name'),
    max_length=30
)

last_name = models.CharField(
    pgettext_lazy('override default', 'last name'),
    max_length=150
)

django.po

#: models.py:51
msgctxt "override default"
msgid "first name"
msgstr "姓"

#: models.py:55
msgctxt "override default"
msgid "last name"
msgstr "名"

и вы увидите , вместо значения по умолчанию 姓氏, 名字.

6 голосов
/ 08 августа 2015

У меня была эта проблема с моим проектом прямо сейчас. У меня была переменная ЯЗЫКИ в settings.py, установленная следующим образом:

LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)

И структура папок с папкой локали и подпапкой pt-br внутри. Оказывается, мои переводы не загружались. Переменная LANGUAGES следует шаблону pt-br, а папки должны находиться в шаблоне pt_BR. По крайней мере, так работает только здесь!

0 голосов
/ 03 сентября 2013

Я заметил, что когда в моем тексте было %, переведенный текст не использовался. Там могут быть другие символы, которые могут вызвать эту проблему. Я исправил проблему, экранируя % как %%.

0 голосов
/ 19 июля 2013

Другой причиной может быть неправильная структура каталогов.

Перед выполнением команды makemassages для перевода app внимательно прочитайте сообщение об ошибке команды управления о том, какой каталог создать. (Это должно быть locale для приложения, , а не conf/locale.) Обратите внимание, что команды управления работают нормально даже при неправильной структуре каталогов.

...