2012-06-28 5 views
7

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

Я опишу все шаги, я следую:

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

$ 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) я делаю печать с запросом. LANGUAGE_CODE, который печатает «en».

Что я делаю неправильно?

+0

вы django-admin.py makemessages --locale = эс? – Efazati

+0

Как пользователь переключается между en и es? – Efazati

+0

@ Efazati Основным языком моего проекта является ES, а не EN. Поэтому я понимаю, что должен сделать django-admin.py makemessages -locale = en', не так ли? Таким образом, созданный файл django.po имеет поля msgid на испанском языке, и я должен заполнить поля msgstr на английском языке. –

ответ

3

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

$ CD медиа/шаблоны/выгрузку/$ MkDir локаль $ django-admin.py makemessages --locale = еп

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

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

Кроме того, 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> 

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

Вы также можете прочитать how django discovers language preference для ваших видов и шаблонов.

+1

Я думаю, вы понимаете неправильно. Мой родной язык в проекте ES (испанский), поэтому я хочу перевести с ES на EN (английский). Если вы посетите эту ссылку (http://www.djangobook.com/en/1.0/chapter18/), вы можете увидеть в своем примере, как они говорят нам о том, чтобы использовать 'django-admin.py make messages -l de' DE язык, на который они хотят перевести. Теперь я попытался сделать весь процесс из корневого каталога моего проекта. Теоретически LocaleMiddleware должен выполнять перевод, автоматически определяющий язык из браузера пользователя, без какого-либо предыдущего выбора. Но это не так. –

3

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

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

Подробнее ->https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations