Django Translation (локализация) не работает в шаблоне и представлении
Я создаю приложение на django, пишу все сообщения интерфейса на английском языке, чтобы потом перевести их на другой язык. Моя первая попытка - использовать испанский язык в качестве целевого языка. Я читал другие вопросы, но у меня не было успеха с переводом в представлении и шаблоне. Вот некоторые вопросы:
- Localization doesn't work
- Django internationalization doesn't work in my project
- Django translations does not work
- Many others
В большинстве из них проблема заключается в том, что параметр LOCAL_PATHS
установлен неправильно. Однако я следовал рекомендациям в ответах, поэтому думаю, что это не моя проблема, и я не могу понять, в чем дело.
Это мои настройки.
# Notice a LocalMiddleware
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
# I have a special directory to my templates
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True, # Still needed for admin templates
...
}
# Language settings
LANGUAGE_CODE = 'es'
LANGUAGES = [
('en', _('English')),
('es', _('Spanish')),
]
# I use BASE/DIR to configure the paths...
LOCALE_PATHS = [
BASE_DIR / 'locale',
BASE_DIR / 'utils/locale',
]
USE_I18N = True
Структура проекта:
В каждом приложении есть свои собственные каталоги 'locale' и транслитерации внутри приложений работают отлично.
The messages that can't be translate are in 'utils' package. In it there are general functions and other stuffs. So, I have a 'locale' directory for 'utils' and one to my general project (for other translations outside 'utils' and apps) and that's the why these two paths are in LOCALE_PATHS
, to the apps be able to use the .mo
files of them.
Я передаю в контекст только строку, которая должна быть переведена (self.error_message
), и вывожу ее в представлении как тестовую. Однако ни в консоли, ни в шаблоне строка не переводится.
class SocialLoginErrorView(TemplateView):
template_name = 'user/social_login_error.html'
def get_context_data(self, **kwargs) -> dict[Any, Any]:
"""Send the error message to the template."""
self.get_params_data()
context = super().get_context_data(**kwargs)
print(f'{gettext(self.error_message)}\n{get_language()'}\n{settings.LOCALE_PATHS})
context['error_message'] = self.error_message
return context
Шаблон social_login_error.html
:
{% extends 'base.html' %}
{% load i18n %}
{% block head_content %}
<title>Hubo un problema al iniciar sesión</title>
{% endblock head_content %}
{% block body_content %}
{% get_current_language as LANGUAGE_CODE %}
<h2>Error al iniciar sesión</h2>
<div>
<span>Se ha detectado un problema al iniciar sesión:</span>
<br/>
<span>{% translate error_message %}</span>
<br/>
HOLA
<span>{{LANGUAGE_CODE|language_name}}</span>
</div>
{% endblock body_content %}
Результаты: сообщение по-прежнему на английском языке.
В консоли
И шаблон