diff --git a/SRV/api/v1/settings.py b/SRV/api/v1/settings.py index b5110dc..62ab576 100644 --- a/SRV/api/v1/settings.py +++ b/SRV/api/v1/settings.py @@ -1,10 +1,6 @@ import os import logging -from pathlib import Path - -import polib -from docutils.nodes import entry -from fastapi import APIRouter, HTTPException, Depends +from fastapi import APIRouter, HTTPException, Depends, Response, Request from starlette.responses import FileResponse from services.settings_service import SettingsService from utils.i18n import get_translations, _ @@ -143,26 +139,27 @@ async def export_wifi(translations: Translations = Depends(get_translations("api media_type="application/json" ) -@router.get("/{locale}/{domain}") -async def get_translations(locale: str, domain: str): +@router.post("/set_language") +def set_language(locale: str, response: Response, request: Request): """ - + Устанавливает куку locale для смены языка пользователя. Args: - locale: - domain: - + locale (str): Используемый язык. Returns: - + dict: Сообщение об успешной установке языка. """ - try: - po_file = Path(f"locales/{locale}/LC_MESSAGES/{domain}.po") - if not po_file.exists(): - logger.warning(f"Файл интернационализации для {locale} и домена {domain} не найдены") - raise HTTPException(status_code=404, detail=f"Файл интернационализации для {locale} и домена {domain} не найдены") - po = polib.pofile(str(po_file)) - translations = {entry.msgid: entry.msgstr or entry.msgid for entry in po} - logger.info(f"Загрузка {len(translations)} перевода для локали {locale} и домена {domain}") - return translations - except Exception as e: - logger.error(f"Ошибка загрузки перевода для локали {locale} и домена {domain}: {str(e)}") - raise HTTPException(status_code=500, detail=f"Ошибка на сервере: {str(e)}") \ No newline at end of file + translations = get_translations("api_v1")(request) + lc_messages_path = os.path.join(os.path.dirname(__file__), '..', '..', 'locales', locale, 'LC_MESSAGES') + if not os.path.isdir(lc_messages_path): + raise HTTPException( + status_code=400, + detail=translations.gettext("Язык '{locale}' не поддерживается.").format(locale=locale) + ) + has_mo_or_po = any(f.endswith('.mo') or f.endswith('.po') for f in os.listdir(lc_messages_path)) + if not has_mo_or_po: + raise HTTPException( + status_code=400, + detail=translations.gettext("Язык '{locale}' не поддерживается (нет файлов переводов).").format(locale=locale) + ) + response.set_cookie(key="locale", value=locale, path="/", httponly=True) + return {"message": translations.gettext("Язык успешно установлен: {locale}").format(locale=locale)} \ No newline at end of file diff --git a/SRV/utils/i18n.py b/SRV/utils/i18n.py index 66f10a6..39fbdf1 100644 --- a/SRV/utils/i18n.py +++ b/SRV/utils/i18n.py @@ -21,7 +21,10 @@ def get_translations(domain: str = "api_v1") -> callable: # Проверяем параметр запроса 'locale', если он есть locale = request.query_params.get("locale") if not locale: - # Если параметр отсутствует, используем заголовок Accept-Language + # Если параметр отсутствует, проверяем куку 'locale' + locale = request.cookies.get("locale") + if not locale: + # Если куки нет, используем заголовок Accept-Language locale = request.headers.get("Accept-Language", "ru").split(",")[0].split("-")[0] try: