Django i18n: частые причины отсутствия переводов

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

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


person Ram Rachum    schedule 24.02.2010    source источник


Ответы (9)


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

person Ofri Raviv    schedule 04.03.2010
comment
Вы обманываете, Офри :) Да, это одна из причин пропуска переводов, спасибо. - person Ram Rachum; 05.03.2010
comment
Мне тоже потребовалось время, чтобы понять. Записи, помеченные как нечеткие, не используются. Они предназначены для просмотра переводчиком и не отображаются до тех пор, пока не будут проверены (путем снятия флажка нечеткости). - person Tom; 07.10.2010
comment
gnu.org/software/hello/manual/ gettext / - person Tom; 07.10.2010

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

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

from os import path
LOCALE_PATHS = (
    path.join(path.abspath(path.dirname(__file__)), 'locale'),
)
person Hamish Downer    schedule 08.11.2013
comment
Сейчас это выглядит так: LOCALE_PATHS = ((BASE_DIR / 'locale'), ) - person mitenka; 06.01.2021

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

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

    • See this list for all allowed values of language identifiers. Note that Simplified Chinese is specified by zh-hans, not zh-cn.
  • В settings.py django.middleware.locale.LocaleMiddleware включен в MIDDLEWARE в правильном порядке?

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

    • You can see an incomplete list of allowed locale name by running ls your/path/to/python/site-packages/django/conf/locale/ on your machine, or by taking a look at the source code
    • Обратите внимание, что здесь вы должны использовать _, а не -. Например, чтобы указать упрощенный китайский, выполните django-admin makemessages -l zh_Hans, а не zh_CN, zh_hans или zh-Hans или что-то еще.
  • Вы удалили все fuzzy теги в своих файлах (ах) PO?

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

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

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

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

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 "名"

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

person nalzok    schedule 13.05.2017
comment
Очень полезный список! Я бы добавил проверку, которая заставила меня зря потратить несколько часов: наличие каталога locale в вашем приложении, в котором будут записаны локали. Очень хорошая заметка о контекстных маркерах, о которых я не знал. - person Alessandro Dentella; 20.10.2018

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

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

В файле настроек - нужен USE_I18N = True

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

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

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

person Tommaso Barbugli    schedule 03.11.2010
comment
+1! В моем случае мне просто пришлось перезапустить сервер. Я использую комбинацию nginx + gunicorn. Достаточно было перезапустить Gunicorn. Спасибо - person nt.bas; 08.08.2015

Прямо сейчас у меня возникла проблема с моим проектом. Я установил переменную LANGUAGES в settings.py следующим образом:

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

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

person Erick Mendonça    schedule 08.08.2015
comment
То же самое с pt-br здесь (используя Django == 1.10.5) - person pitervergara; 13.02.2017
comment
У меня такая же проблема. правильный шаблон для языкового кода, который содержит '-' (дефис): '‹code_prefix› _ ‹CAPITAL_SUFFIX›', пример: pt_BR, поэтому правильная команда - python manage.py makemessages -l=pt_BR - person Kaushal; 22.02.2018

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

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

from django.utils.translation import ugettext as _

Но в models.py следует использовать ugettext_lazy:

from django.utils.translation import ugettext_lazy as _
person David Arcos    schedule 03.03.2010
comment
Спасибо, но похоже, что проблема не в этом. Я вхожу в оболочку, делаю ugettext('My expression') и получаю 'My expression' вместо перевода. (Да, я activate выбрал другой язык перед тем, как сделать это, и подтвердил, что могу переводить другие строки с помощью этой функции.) - person Ram Rachum; 03.03.2010

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

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

person Iodnas    schedule 19.07.2013

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

person Shailen    schedule 03.09.2013

Мой ответ здесь, все мои переводы работали, кроме 2 DateField, которые я использовал в ModelForm. Оказалось, что у меня в forms.py был виджет, который плохо работал с переводами.

Я только что удалил его, чтобы насладиться Рождеством = D

person A Campos    schedule 25.12.2020