Джанго: переводится только один элемент

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

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

Редактировать: причина для одной переведенной строки была в том, что она соответствовала строке на сайте администратора.

Пытаясь заставить его работать, я очистил LOCALE_PATH, перезапустил сервер dev (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',)

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

2 ответа

Решение

Г! Я столкнулся с той же проблемой, что и этот парень: https://code.djangoproject.com/ticket/18492

А именно, в конце отсутствует запятая LOCALE_PATHS кортеж. Жаль, что Джанго не вызывает ошибку для этого.

У меня была похожая проблема, которую я решил, убедившись, что всякий раз, когда я обновляю файл 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/ в зависимости от языка, который вы хотите увидеть

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

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