I18n, похоже, не работает, в то время как перевод модели работает (немного)

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

en-us (по умолчанию) nl-nl de-de fr-fr es-es

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

Примечание: я использовал сообщения компиляции и перезапустил сервер.

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@ADDRESS>, 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@ADDRESS>\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 / templates / company / 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"

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

EnglishCity

где "английский - это содержание модели"

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

NederlandsCity

person LHolleman    schedule 20.05.2013    source источник
comment
Вы используете django.middleware.locale.LocaleMiddleware? Можете ли вы вывести request.LANGUAGE_CODE в свой шаблон, чтобы убедиться, что установлен правильный язык?   -  person Bernhard Vallant    schedule 23.05.2013
comment
По какой-то причине, когда я добавляю LocaleMiddleware (который я не использовал, потому что я читал, что он предназначен для установки языков, а не для распознавания), он меняет модели для отображения испанского (es-es). Он «успешно» распознает язык, потому что я могу изменить код по умолчанию, но request.LANGUAGE_CODE по-прежнему говорит, что это es-es, что неверно. Я в Нидерландах с голландским ip / chrome и английскими окнами. Однако языковые файлы остаются английскими. Я проверил файлы на испанском, и он такой же, как и на английском / голландском.   -  person LHolleman    schedule 23.05.2013
comment
Обычно в любом случае вам понадобится LocaleMiddleware ... Можете ли вы проверить в Chrome Web Inspector, что ваш браузер отправляет для Accept-Language (на вкладке "Сеть" ... выберите свой документ и посмотрите заголовки запросов)   -  person Bernhard Vallant    schedule 23.05.2013
comment
Также проверьте, есть ли на вашем компьютере необходимые языковые стандарты: locale -a.   -  person Bernhard Vallant    schedule 23.05.2013
comment
Вероятно, django не находит файл mo. Не могли бы вы подробно описать структуру вашего проекта в файловой системе? пути к файлам и т. д.   -  person jpic    schedule 23.05.2013
comment
Мои заголовки Chrome pastie.org/7947352. Маловероятно, что django не сможет найти мои языковые файлы, я могу скомпилировать их без проблем pastie.org/7947368. Я также получил необходимые локали на моей машине   -  person LHolleman    schedule 23.05.2013
comment
Вы правильно прочитали docs .djangoproject.com / ru / dev / themes / i18n / translation /?   -  person Adrián    schedule 23.05.2013
comment
Ваш LocaleMiddleware размещен после SessionMiddleware и перед CommonMiddleware?   -  person Hedde van der Heide    schedule 23.05.2013
comment
Да, я прочитал это, все проверил, все было правильно. @Hedde, это включено в сообщение, которое сделал Адриан   -  person LHolleman    schedule 23.05.2013


Ответы (3)


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

Перенеся тот же проект в производство (Ubuntu), он снова перестал работать, я пробовал все под Sun, думая, что имена папок уже должны быть правильными, поскольку они работают на моем 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, у вас все будет хорошо в большинстве систем.

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

person mkoistinen    schedule 28.05.2013

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

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

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

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

После этого мое приложение Django больше не переводилось. Что бы я ни делал ...

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

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

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

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

  • pt
  • en-us
  • en

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

person Community    schedule 28.05.2014

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

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

person LHolleman    schedule 23.05.2013
comment
Это объясняется здесь, и в нем говорится, что это поддерживает специальные переводы: / - person Adrián; 24.05.2013
comment
Я вижу, что страницы теперь связаны, прочитал неправильно, мое плохое. Опубликуйте это, и я приму это. - person LHolleman; 24.05.2013
comment
Я бы выложил это, но это не совсем ответ на вопрос. Я до сих пор не знаю, почему это не сработало, и теперь, после замены en-us на просто en, это работает. Согласно документам, "en-us" действительно. - person Adrián; 24.05.2013
comment
Хм, это правда. Теперь, когда я это проверил, nl-nl также является допустимым кодом. - person LHolleman; 24.05.2013
comment
'en-us' это даже данный пример для LANGUAGE_CODE настройка. - person Adrián; 24.05.2013
comment
Да, согласно документации и моему заголовку Accept-Language он должен отображать английский, а LANGUAGE_CODE - это что-то другое. - person LHolleman; 24.05.2013
comment
См. Здесь, это список языков в который переведен сам django. - person Adrián; 24.05.2013
comment
И если вы указали, например, «en-gb», а его не было в списке. Я думаю, это должен быть откат к общему английскому "en". - person Adrián; 24.05.2013
comment
Умм, это сработало для вас только потому, что вы отключили региональные части языков. Чтобы решить проблему, указанную в исходном вопросе, оставьте коды языков так, как их ожидает Django, и измените языковые ПАПКИ в / locale /, как их ожидает gettext, как я написал в своем ответе. - person mkoistinen; 29.05.2013