Подтвердить что ты не робот

Django i18n: Общие причины появления переводов

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

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

4b9b3361

Ответ 1

Возможно, переведенные строки отмечены как fuzzy?

Ответ 2

Просто попал один. У меня был каталог 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'),
)

Ответ 3

Возможная причина: Lazy Translation.

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

from django.utils.translation import ugettext as _

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

from django.utils.translation import ugettext_lazy as _

Ответ 4

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

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

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

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

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

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

Ответ 5

У меня была проблема с моим проектом прямо сейчас. У меня были переменные ЯЗЫКИ на settings.py так:

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

и вы увидите , вместо стандартных 姓氏, 名字.