Django: переводится только один элемент

При переносе сайта Django с 1.2 на 1.5 на Python 2.6 я столкнулся с проблемами интернационализации.

Странно то, что на всем сайте переводится только одна строка (ну, почти, фильтр даты мог переводить длинные названия месяцев, когда я тестировал). Другие строки, расположенные в том же шаблоне, не переводятся, и все переводы находятся в одном файле po / mo. Все переводы есть, проверены с помощью Poedit и скомпилированы с помощью manage.py compilemessages.

Изменить. Причина для единственной переведенной строки заключалась в том, что она совпадала со строкой на сайте администратора.

Пытаясь заставить его работать, я очистил LOCALE_PATH, перезапустил сервер разработки (manage.py runserver), очистил любой кеш браузера (хотя метаданные для сайта отключают кеширование), и вот, элемент все еще переведен. Я проверил это, снова добавив тот же текст после, и он по-прежнему переводится, поэтому кэширование на стороне клиента не выполняется.

Переключение языка работает должным образом, и единственный переведенный элемент изменяется на язык по умолчанию, {{ LANGUAGE_CODE }} подтверждает это. Я пробовал очистить данные сеанса и кеш django (который, похоже, не используется сервером разработки).

Кто-нибудь может догадаться, что здесь происходит? Нет ли каких-либо отладочных флагов, чтобы получить более обширное ведение журнала или что-то в этом роде?

Минимальный вид:

def locale_test(request):
    locale = request.GET.get('l', None)
    if locale:
        translation.activate(locale)
    di = {"foobar": _("foobar")}
    return render_to_response('locale_test.html',di, context_instance=RequestContext(request))

И соответствующий шаблон (locale_test.html):

{% load i18n %}
<p>Language: {{ LANGUAGE_CODE }}</p>
<p>Matching string from admin site that gets translated correctly: {% trans "Log out" %}</p>
<p>Translated in template: {% trans "Foobar" %}</p>
<p>Translated in view: {{ foobar }}</p>

Соответствующие настройки:

USE_I18N = True

USE_L10N = True

LANGUAGES = (
    ('en', 'English'),
    ('foo', 'Fooo'),
)

LANGUAGE_CODE = 'en'

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',

 )

 TEMPLATE_CONTEXT_PROCESSORS = (
      'django.contrib.auth.context_processors.auth',
      'django.core.context_processors.i18n',
      'django.core.context_processors.request',
     )
LOCALE_PATHS = ('/path/to/my/locale',)

Для справки, эти вопросы мне не помогли:


person mandrake    schedule 14.08.2013    source источник
comment
не могли бы вы также поделиться шаблоном?   -  person yuvi    schedule 15.08.2013
comment
Тайна единственного переведенного текста была решена: он соответствовал строке с админки.   -  person mandrake    schedule 15.08.2013
comment
Посмотрел эту страницу?   -  person Adrián    schedule 15.08.2013
comment
Не рекомендуется с версии 1.3: поиск в подкаталоге locale каталога, содержащего ваш файл настроек (пункт 3 выше), устарел с версии 1.3 и будет удален в Django 1.5. Вместо этого вы можете использовать параметр LOCALE_PATHS, указав абсолютный путь файловой системы для такого каталога локали в значении параметра. Вы это изменили?   -  person Adrián    schedule 15.08.2013
comment
Я сделал, но не правильно (см. Ответ).   -  person mandrake    schedule 15.08.2013


Ответы (2)



У меня была аналогичная проблема, которую я решил, убедившись, что всякий раз, когда я обновляю файл django.po, я компилирую его:

./manage.py compilemessages

Перевод выполняется из скомпилированного файла (django.mo), а не из файла .po

  1. Создайте файл перевода: ./manage.py makemessages -a
  2. Перевести: вручную или с помощью такого инструмента, как автоперевод
  3. скомпилируйте файл: ./manage.py compilemessages
  4. Протестируйте, чтобы увидеть изменения: не то чтобы язык по умолчанию мог быть выбран первым, убедитесь, что вы изменили язык. Например, измените localhost:8000/en/ на localhost:8000/fr/ или localhost:8000/foo/ в зависимости от языка, который вы хотите видеть.

надеюсь, это поможет

person Patrick    schedule 19.01.2018