Как правильно настроить перевод Django?
У меня проблема с переводами, не работающими на Django 1.6. Я добавил это в мои settings.py:
LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('de', ugettext('German')),
)
Также добавлено промежуточное ПО:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
а также мои *.py файлы, когда я использую строку, которая должна быть l10-й:
from django.utils.translation import ugettext_lazy as _
Мои шаблоны начинаются с:
{% extends "base.html" %}
{% load i18n %}
и внутри шаблона я использовал заполнитель trans
. Э.Г.
<h1>{% trans "Register a tank" %}</h1>
Я предоставил переводы в локаль /de/LC_MESSAGES/django.po:
msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"
Мой браузер в первую очередь настроен на запрос немецкого контента:
Настройки браузера
Что я пропустил?
Постскриптум Проект, в котором я сейчас размышляю, размещен на GitHub: https://github.com/frlan/blankspot
Ответы
Ответ 1
Добавьте LOCALE_PATHS
к settings.py
и установите его следующим образом:
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
Обратите внимание, что LOCALE_PATHS
должен быть кортежем (посмотрите на запятую в конце пути).
Теперь, основываясь на LOCALE_PATHS
, папка locale
должна находиться в корне вашего проекта.
И убедитесь, что вы запускаете команды django-admin.py makemessages -l de
и django-admin.py compilemessages
из корня вашего проекта.
djPrj
|
+---> djPrj
|
+---> djApp
|
+---> locale
|
+---> templates
Также измените MIDDLEWARE_CLASSES
на LocaleMiddleware
после SessionMiddleware
и до CommonMiddleware
, как упоминалось здесь:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
Перезапустите службу (python manage.py runserver
) и проверьте снова.
Просто чтобы убедиться, что ваша локализация применена к вашей странице администратора Django с файлом по умолчанию django.mo
Django, выполните следующий тест:
Сначала в главном urls.py
проекта замените patterns
на i18n_patterns
:
from django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns('',
url(r'^admin/', include(admin.site.urls)),
# ...
)
Теперь перейдите на страницу администратора с префиксом de
, например: http://127.0.0.1:8000/de/admin/
И страница администратора должна быть показана на немецком языке.
Хорошо, вы можете видеть страницу администрирования Django на немецком языке?
Также проверьте свой вид с префиксом de
.
Согласно вашему коду проекта, некоторые предложения не находятся в блоках trans
. Поместите их как:
{% trans "your sentence" %}
Также вы должны использовать ugettext_lazy
вместо ugettext
в своем коде для представлений и моделей (см. здесь и здесь.)
Замените это:
from django.utils.translation import ugettext as _
с помощью:
from django.utils.translation import ugettext_lazy as _
А теперь все будет работать.
Ответ 2
В моем случае я использовал en-gb как параметр для запуска
django-admin.py makemessages -l en-gb
Вместо этого он должен быть en_GB.
django-admin.py makemessages -l en_GB
Ответ 3
Установите translated string
в django.po
, а затем используйте python manage.py compilemessages
for e.g
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr "put appropriate translated string here"
Предложение: вы можете использовать пакет django-rosetta
для добавления translated string
из интерфейса пользовательского интерфейса. Легко добавить T-строку из django-admin. https://github.com/mbi/django-rosetta
Ответ 4
Проверьте файлы cookie и сеанс - согласно Как Django обнаруживает языковые предпочтения, процесс таков:
- языковой префикс в URL, при использовании i18n_patterns в URLconf
- _language в текущем сеансе пользователя
- django_language cookie (или как указано в настройках .LANGUAGE_COOKIE_NAME)
- HTTP-заголовок Accept-Language (это то, что посылает ваш браузер)
- settings.LANGUAGE_CODE
Поскольку настройки вашего браузера имеют предпочтение "de", я подозреваю, что LocaleMiddleware решит иначе на одном из предыдущих шагов 1. - 3..
Ответ 5
Вам нужно включить LocaleMiddleware
в настройках, чтобы сообщить Django об обнаружении языка на основе настроек браузера. Изменение языковых настроек эффективно устанавливает заголовок Accept-Language
. Возможно, вам потребуется проверить окно инкогнито, потому что другие средства определения языка имеют более высокий приоритет, например сеанс пользователя и куки файл django_language
.