2013-05-20 2 views
1

Мне нужно реализовать интернационализацию в моем проекте, поэтому я хочу использовать i18n для статического контента, а я использую приложение django-modeltranslation для моделей. Я поддерживает следующие языки:I18n, похоже, не работает, в то время как modeltranslation делает (немного)

ан-нас (по умолчанию) п-нл де-де фр-фр эс-эс

В то время как я нидерландский, Джанго не изменяет языка на голландский. У меня есть английские окна, но хром настроен голландский, чтобы проверить интернационализацию. Это не единственная проблема, только модель переводится, когда язык по умолчанию изменяется. Когда я устанавливаю язык по умолчанию на голландский, все модели будут показывать голландский перевод, но статический контент остается на английском.

Примечание: я использовал compilemessages и перезапустить сервер

Settings.py

USE_I18N = True 

LANGUAGE_CODE = 'en-us' 

gettext = lambda s: s 
LANGUAGES = (
    ('en-us', gettext('English')), 
    ('nl-nl', gettext('Dutch')), 
    ('fr-fr', gettext('French')), 
    ('de-de', gettext('German')), 
    ('es-es', gettext('Spain')), 
) 

LOCALE_PATHS = ('/vagrant/locale',) 

/vagrant/locale/en-us/LC_MESSAGES/django.po (укороченный файл для отображения ошибки)

# SOME DESCRIPTIVE TITLE. 
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 
# This file is distributed under the same license as the PACKAGE package. 
# FIRST AUTHOR <[email protected]>, YEAR. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2013-05-17 23:14+0200\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME <[email protected]>\n" 
"Language-Team: LANGUAGE <[email protected]>\n" 
"MIME-Version: 1.0\n" 
"Language: en-us\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 

#: PyDiving/settings.py:170 
msgid "English" 
msgstr "" 

#: PyDiving/settings.py:171 
msgid "Dutch" 
msgstr "" 

#: PyDiving/settings.py:172 
msgid "French" 
msgstr "" 

#: PyDiving/settings.py:173 
msgid "German" 
msgstr "" 

#: PyDiving/settings.py:174 
msgid "Spain" 
msgstr "" 

#: company/templates/company/company_detail.html:22 
msgid "City" 
msgstr "" 

/vagrant/locale/nl-nl/LC_MESSAGES/django.po (только показывая различия, чтобы сократить пост)

"Language: nl-nl\n" 

#: company/templates/company/company_detail.html:28 
msgid "Postal Code" 
msgstr "Postcode" 

#: company/templates/company/company_detail.html:34 
msgid "City" 
msgstr "Stad" 

Шаблон компании/шаблоны/компания/company_detail.html

{% load i18n %} 
{{ company.text }} # this is the model translation, this will change when i change the default language 
{% trans "City" %} # this always says "City" 

Результат, когда язык по умолчанию ан-нас

EnglishCity 

где 'английский язык является содержание модели'

по умолчанию язык nl-nl

NederlandsCity 
+0

Вы используете 'django.middleware.locale.LocaleMiddleware'? Можете ли вы вывести 'request.LANGUAGE_CODE' в свой шаблон, чтобы убедиться, что правильный язык установлен? –

+0

По какой-то причине, когда я добавляю LocaleMiddleware (который я не использовал, потому что я читал, что он предназначен для установки языков вместо распознавания), он меняет модели для отображения испанского (es-es). Он «успешно» распознает язык, потому что я могу изменить код по умолчанию, но request.LANGUAGE_CODE все еще говорит, что это es-es, что неверно. Im в нидерландах с голландским ip/chrome и английскими окнами. Однако языковые файлы остаются английскими. Я проверил файлы испанского языка, и он совпадает с английским/голландским. – LHolleman

+0

Обычно вам нужно «LocaleMiddleware» в любом случае ... Можете ли вы проверить веб-инспектор Chrome, который вы отправляете браузером для «Accept-Language» (на вкладке «Сеть» ... выберите свой документ и посмотрите заголовки запроса) –

ответ

0

Я наткнулся на это сообщение: Django internationalization language codes. По-видимому, django поддерживает только коды языков iso 639-1, которые не встречаются в документации, что еще хуже, говорит, что вы должны использовать такие коды, как en-us. Как только я сменил языки на en-us> en, nl-nl> nl и т. Д., Он сразу сработал.

В любом случае, спасибо за внимание.

+1

Это объясняется [здесь] (https://docs.djangoproject.com/en/dev/topics/i18n/#term-locale-name), и он говорит, что это поддерживает специальные переводы:/ –

+0

Я вижу, что страницы связаны сейчас, читайте неправильно, плохо. Отправьте его, и я его приму. – LHolleman

+0

Я бы опубликовал его, но на самом деле он не отвечает на вопрос. Я до сих пор не знаю, почему это не сработало, и теперь, после изменения «en-us» до «en», это так. Согласно документам, действует «en-us». –

2

Я обнаружил, что разные платформы позволяют/предпочитают имена разных языковых папок. Я вытаскивал свои волосы в моей системе разработки (Mac OS X), потому что «/ pt-br/LC_MESSAGES /» не работал, даже если makemessages создавал папки таким образом и компилировал сообщения. Он, наконец, ожил, как только я переименовал языки как «/ pt_br/LC_MESSAGES /» (обратите внимание на подчеркивание). Обратите внимание, что в корневом языке LANGUAGES в настройках используется форма aa-bb, так же, как вы здесь используете.

Миграция того же проекта на производство (Ubuntu), он снова перестает работать, я пробовал все под солнцем, думая, что имена папок уже должны быть правильными, так как они работают на моем dev. машина. Я, наконец, из отчаяния попробовал верхний индекс страны, например '/ pt_BR/LC_MESSAGES /', и, бум, он снова начал работать. Я считаю, что использование формы aa_BB работает повсеместно.

Итак, решение, которое, как я думаю, вы ищете, - это изменить имена каталогов локали внутри вашей папки локали.Вы должны иметь:

[project] 
    locale 
     de_DE 
     en_US 
     es_ES 
     fr_FR 
     nl_NL 
    ... 
    settings.py 

В каждом из них у вас будут LC_MESSAGES и т. Д., Как обычно, конечно. Ваша конфигурация Django не должна меняться, это именно то, что gettext принимает на вашей платформе. Опять же, я думаю, что если вы используете форму aa_BB, вы будете в порядке на большинстве систем.

Если вам нужна ваша папка локали в каком-либо другом месте по какой-либо причине, просто убедитесь, что вы установили параметры свойства. LOCALE_PATHS соответственно. Кроме того, документация Django дает понять, как она находит эту папку: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations.

+0

@LHolleman: Вы даже попробовали мое предложение? – mkoistinen

0

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

Отказ от ответственности: я использую PT-BR, потому что это мой родной язык, но вы можете получить это на любой язык, который вы хотите

Во-первых, что я сделал на моем Джанго приложения (если у вас уже есть созданный проект и приложение [s] и текущий каталог проекта реж):

  • создан локаль реж: mkdir locale
  • создал pt_BR локаль: django-admin.py makemessages -l pt_BR
  • изменил текст внутри созданного файла
  • скомпилированного все сообщения: django-admin.py compilemessages
  • добавил переменную LOCALE_PATHS Джанго настройки: LOCALE_PATHS =('/path/to/locale_foder',)

После этого, мой Django приложение никогда не переводится. Независимо от того, что я сделал ...

Согласно Джанго документации (https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preference) Джанго имеет предопределенный способ найти языковые предпочтения, и это то, как он работает:

поиска
  1. Джанго для языка приставки в url, для этого вам нужно использовать i18n_patterns в django url.
  2. если выше не удается, поиск переменной в сеансе пользователя
  3. если выше не удается, поиск куки
  4. если выше не сработает, используйте Accept-Language заголовка HTTP
  5. если выше fail, используйте язык, указанный в одноименной переменной, в настройках django.

Я выделил номер 4, потому что в моем случае это тот, который я использую. Это означает, что мое приложение зависит от данных браузера HTTP.

Теперь, поскольку мы зависим от данных HTTP, давайте проверим, как работает браузер. В основном я использую хром и firefox.Мой хром имеет следующие языковые настройки на моем ноутбуке:

  • пт
  • ан-нас
  • ан

И это проблема, мой Accept-Language заголовок HTTP отправляет пт, но у меня нет pt locale, у меня есть язык pt-br. Если бы это было наоборот, это сработало бы. Мое заключение состоит в том, что всегда должны быть коды iso 639-1, а оттуда - специализация. Например: теперь я использую pt как значение по умолчанию для pt-br и pt-pt для конкретных переводов в Португалии.