Как настроить Django i18n на Google App Engine (GAE)?
Используя Django 4.0.2 и стандарт GAE, текст сайта не меняется при выборе языка. Основной язык - английский. Второй язык - голландский. Если я переключаю язык, то url меняется и включает /nl
вместо en/
, но английский текст остается. На localhost английский текст заменяется на голландский
Я использую django-rosetta и на GAE его приборная панель находит два экземпляра моего приложения, называемых workspace/
и srv/
. Каждый из них содержит один и тот же файл .mo
в одном и том же месте /workspace/locale/nl/LC_MESSAGES/django.po
. Я не знаю, почему существует два приложения, и имеет ли это значение. На localhost у меня есть одно приложение в ожидаемом месте.
Ошибок нет, и проверка существования файла .mo
возвращает True
.
Мой каталог locale
находится в корне проекта. На локальном компьютере это имя моего проекта, на GAE имя корневого каталога проекта workspace
. Это должно быть нормально, потому что построение путей к файлам с помощью ROOT_DIR
по-прежнему работает, как ожидалось, для настроек локали, а также для всех остальных настроек.
Соответствующие настройки:
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
_locale_dir = ROOT_DIR / "locale"
_locale_file = _locale_dir / "nl/LC_MESSAGES/django.po"
print(f"--- {_locale_file.is_file() = }")
LOCALE_PATHS = [ROOT_DIR / "locale", "/workspace/locale", "/srv/locale"]
APPS_DIR = ROOT_DIR / "lettergun"
TIME_ZONE = "CET"
LANGUAGE_CODE = "en"
USE_I18N = True
# USE_L10N = True # Deprecated in Django 4
USE_TZ = True
LOCALE_PATHS = [ROOT_DIR / "locale", "/workspace/locale", "/srv/locale"]
LANGUAGES = (
("en", _("English")),
("nl", _("Dutch")),
)
MIDDLEWARE = [
...
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
...
]
# TRANSLATION USING ROSETTA
# ------------------------------------------------------------------------------
ROSETTA_MESSAGES_PER_PAGE = 20
ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS = True
DEEPL_AUTH_KEY = "e3b5c854-f059-2f86-6ebb-5eeafc3c57a6"
ROSETTA_LANGUAGE_GROUPS = True
ROSETTA_SHOW_AT_ADMIN_PANEL = True
url config
from django.conf.urls.i18n import i18n_patterns
urlpatterns: URLList = i18n_patterns(
# base app
path("", include("lettergun.apps.base.urls", namespace="base")),
path("blog/", include(wagtail_urls)),
... etc
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += [
# API base url
path("api/", include("config.api_router")),
# DRF auth token
path("auth-token/", obtain_auth_token),
]
Пример шаблона
{% load i18n %}
...
{% get_current_language as CURRENT_LANGUAGE %}
{% get_available_languages as AVAILABLE_LANGUAGES %}
{% get_language_info_list for AVAILABLE_LANGUAGES as languages %}
...
{% for language in languages %}
<span class="inline-block">
<a class=" {% if language.code == CURRENT_LANGUAGE %} font-bold {% endif %} px-1" href="/{{ language.code }}/">
{% if language.name_local == "English" %} EN {% elif language.name_local == "Nederlands" %} NL {% endif %}
</a>
</span>
{% endfor %}
Проблема была вызвана автоматически сгенерированным .gcloudignore
файлом, включающим .mo
файлы.
Если файл каталога отсутствует, Django не выдаст ошибку.