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

Как правильно настроить перевод 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

4b9b3361

Ответ 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.