Ответ 1
Возможно, переведенные строки отмечены как fuzzy
?
Я делаю многоязычный сайт Django. Я создал файл сообщений, заполнил и скомпилировал его. Я проверил сайт (администратор в этом случае) на моем желаемом языке (иврит), и большинство фраз появляются на иврите, как должны, но некоторые этого не делают. Я проверил источник, и они по-прежнему отображаются как _('Whatever')
, как и следовало ожидать, также они переводятся в файл сообщений, и да, я вспомнил, что сделал compilemessages
.
Каковы некоторые общие причины, по которым переводы не появляются?
Возможно, переведенные строки отмечены как fuzzy
?
Просто попал один. У меня был каталог 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'),
)
Возможная причина: Lazy Translation.
В примере, в views.py, вы должны использовать ugettext:
from django.utils.translation import ugettext as _
Но в models.py вы должны использовать ugettext_lazy:
from django.utils.translation import ugettext_lazy as _
Привет, просто приложите некоторые исправления, которые я должен был сделать в прошлом:
В файле настроек
- USE_I18N = True
требуется
django.middleware.locale.LocaleMiddleware среди промежуточных модулей (но это не ваш случай, если Django вообще не заботится о вашем локальном сервере)
django.core.context_processors.i18n среди TEMPLATE_CONTEXT_PROCESSORS
наверняка у меня были другие проблемы, связанные с переводами, но я не помню их всех... надеюсь, что это может помочь!
У меня была проблема с моим проектом прямо сейчас. У меня были переменные ЯЗЫКИ на settings.py так:
LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)
И структура папок с папкой локали и внутренняя папка pt-br внутри. Оказывается, мои переводы не были загружены. Переменная LANGUAGES следует за рисунком pt-br, а папки должны быть на патче pt_BR. По крайней мере, это единственный способ, которым он работает здесь!
Другая причина может быть неправильной структурой каталогов.
Хорошо прочитайте сообщение об ошибке команды управления, в котором создается каталог, прежде чем запускать команду makemassages
для перевода приложения. (Это приложение должно быть locale
для приложения, а не conf/locale
.) Обратите внимание, что команды управления работают нормально даже с неправильной структурой каталогов.
Я заметил, что когда у меня в тексте %
, переведенный текст не использовался. Могут быть другие символы, которые могут вызвать эту проблему. Я исправил проблему, выделив %
как %%
.
Я пытаюсь предоставить полный контрольный список:
В 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
?
Перезапустили ли вы веб-сервер?
Дополнительные примечания:
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 "名"
и вы увидите 姓
, 名
вместо стандартных 姓氏
, 名字
.