Django i18n не работает

Я пытаюсь активировать разные языки для своего проекта. Английский и испанский прямо сейчас.

Я опишу все шаги, которые я выполняю:

Прежде всего, я помещаю себя в каталог, который хочу перевести. Или лучше сказать, где все теги {% trans %}:

$ cd media/templates/landing/
$ mkdir locale
$ django-admin.py makemessages --locale=en

Последняя команда создает каталог / файл /locale/en/LC_MESSAGES/django.po

Я открываю django.po и продолжаю заполнять все поля msgstr на английском языке. msgid метка на испанском. Я уважаю советы о длинных сообщениях дела. После заполнения этого файла я делаю:

$ django-admin.py compilemessages

Этот процесс django.po и создает django.mo.

Поэтому я изменяю settings.py. Важные строки:

TEMPLATE_CONTEXT_PROCESSORS = (
    'ism.context_processor.user_vars',
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.request',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'pipeline.middleware.MinifyHTMLMiddleware',
}

TIME_ZONE = 'Atlantic/Canary'

LANGUAGE_CODE = 'es'

USE_I18N = True

_ = lambda s: s

LANGUAGES = (
    ('es', _('Espanol')),
    ('en', _('English')),
)

USE_L10N = True

USE_TZ = True

Наконец, я добавляю эту строку в URLS.py:

(r'^i18n/', include('django.conf.urls.i18n')),

Я перезагружаю свой сервер разработки, я настраиваю свой браузер Firefox, чтобы сначала выбрать английский язык в качестве основного, и он не работает. Все тексты по-прежнему отображаются на испанском, а не на английском.

Я уверен, что Firefox настроен на английском языке, потому что в функции просмотра Django (которая отображает.html) я делаю печать с request.LANGUAGE_CODE, который печатает "en".

Что я делаю не так?

2 ответа

Примечание редактора. Этот ответ был перенесен из редактирования в вопрос. Это было написано Оригинальным Плакатом.

Возникла проблема с выбором пути к локали. Django игнорировал (или просто не нашел) мой каталог локали в корневом пути, поэтому django.po / mo был недоступен. Все это дерьмо можно решить, добавив LOCALE_PATHS в settings.py.

Дополнительная информация -> https://docs.djangoproject.com/en/dev/topics/i18n/translation/

Прежде всего, я помещаю себя в каталог, который хочу перевести. Или лучше сказать, где все теги {% trans %}:

$ cd media / templates / landing / $ mkdir locale $ django-admin.py makemessages --locale = en

Это не то, как вы должны делать переводы.

Вы создаете файлы сообщений для языка, который вы хотите перевести, а не для того, с которого вы хотите перевести, который является базовым языком. В данном случае это английский.

Также comamnd должен быть запущен из каталога вашего проекта; не шаблон каталога.

Итак, ваша команда должна быть:

$ django-admin.py makemessages --locale=es

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

Затем вы добавляете свои переводы на испанский язык в файл. Файл будет иметь английские метки. Это говорит django загрузить испанский эквивалент для английской версии.

Получив это, вы компилируете файл сообщения (снова из корня)

$ django-admin.py compilemessages

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

В документации представлен шаблон, который вы можете использовать:

<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>

Выберите язык из этой формы, чтобы django знал, какие переводы загрузить.

Вам также следует прочитать, как django обнаруживает языковые предпочтения для ваших представлений и шаблонов.

Другие вопросы по тегам