Джанго: переводится только один элемент
Портирование сайта 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
- Создайте файл перевода:
./manage.py makemessages -a
- Перевести: вручную или с помощью такого инструмента, как автоматический перевод
- скомпилируйте файл:
./manage.py compilemessages
- Проверьте, чтобы увидеть изменения: не то, чтобы язык по умолчанию мог быть выбран в первую очередь, убедитесь, что вы меняете язык. Например изменить
localhost:8000/en/
вlocalhost:8000/fr/
или жеlocalhost:8000/foo/
в зависимости от языка, который вы хотите увидеть
надеюсь, это поможет