Как настроить 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 не выдаст ошибку.

Вернуться на верх