repair translations

This commit is contained in:
parent 98581132dd
commit 84adc5d941
18 changed files with 304 additions and 122 deletions

View file

@ -20,7 +20,7 @@ import os
import logging
import netifaces
from netaddr import IPNetwork
from utils.i18n import get_translations, _
from utils.i18n import _, _load_translations
from babel.support import Translations
logger = logging.getLogger(__name__)
@ -54,7 +54,7 @@ class NetworkScanner:
Инициализирует интерфейс, информацию об IP-адресах и локальный MAC-адрес.
"""
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
self.interface = None
self.ip_info = []
self.networks = []

View file

@ -9,7 +9,7 @@ from typing import Optional
import configparser
import os
import logging
from utils.i18n import get_translations, _
from utils.i18n import _, _load_translations
from babel.support import Translations
logging.basicConfig(level=logging.INFO)
@ -38,7 +38,7 @@ class AuthService:
def __init__(self, translations: Optional[Translations] = None):
self.storage = JsonStorage()
self.session_storage = SessionStorage()
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
def create_access_token(self, data: dict) -> str:
"""Создаёт токен"""

View file

@ -18,7 +18,7 @@
import subprocess
import logging
from typing import Tuple, Optional
from utils.i18n import get_translations, _
from utils.i18n import _load_translations, _
from babel.support import Translations
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
@ -36,7 +36,7 @@ class WifiConnectionService:
Автоматически определяет доступный Wi-Fi-интерфейс и сохраняет его имя.
"""
self.interface = self._get_wifi_interface()
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
def _get_wifi_interface(self) -> str:
"""Автоматически определяет Wi-Fi-интерфейс.

View file

@ -21,7 +21,7 @@ from sdbus_async.networkmanager import (
import sdbus
from sdbus_async.networkmanager.settings import ConnectionProfile
from services.arp_service import NetworkScanner
from utils.i18n import get_translations
from utils.i18n import _load_translations
from babel.support import Translations
from fastapi import Depends
@ -54,7 +54,7 @@ class IPService:
self.bus = None
self.bus = new_bus
async def check_ip_config(self, args: Dict[str, Any], translations: Translations = Depends(get_translations())) -> Dict[str, Any]:
async def check_ip_config(self, args: Dict[str, Any], translations: Translations = None) -> Dict[str, Any]:
"""Проверяет доступность IP-адреса перед его применением.
Выполняет ARP-сканирование сети для проверки, занят ли указанный IP-адрес.
@ -73,6 +73,7 @@ class IPService:
Raises:
Exception: Если произошла ошибка при сканировании ARP.
"""
translations = translations or _load_translations("ru")
self._reset_bus()
clients = self.arp_scanner.scan_network()
new_ip = args["ipv4_updates"]["ipv4.address-data"][0]["address"]
@ -86,7 +87,7 @@ class IPService:
"message": translations.gettext("Настройки сетевого профиля доступны для использования.")
}
async def apply_ip_config(self, args: Dict[str, Any], translations: Translations = Depends(get_translations())) -> None:
async def apply_ip_config(self, args: Dict[str, Any], translations: Translations = None) -> None:
"""Применяет проверенные настройки IP к указанному соединению.
Перезапускает шину D-Bus, обновляет настройки соединения через NetworkManager,
@ -105,6 +106,7 @@ class IPService:
Note:
Требуются права для изменения настроек через NetworkManager.
"""
translations = translations or _load_translations("ru")
self._reset_bus()
nm = NetworkManager()
settings = NetworkManagerSettings()
@ -140,4 +142,4 @@ class IPService:
print(f"Reconnected to {args['connection_id']}")
return
raise RuntimeError(translations.gettext("Устройство для интерфейса {interface} не найдено").format(interface=interface_name))
raise RuntimeError(translations.gettext("Устройство для интерфейса {interface} не найдено").format(interface=interface_name))

View file

@ -32,9 +32,20 @@ from models.network import (
WiFiDevice,
)
import subprocess
from utils.i18n import get_translations, _
from utils.i18n import _, _load_translations
from babel.support import Translations
def _extract_value(value):
"""Приводит значения D-Bus к примитивам Python."""
if isinstance(value, tuple) and len(value) == 2:
value = value[1]
if isinstance(value, bytes):
try:
return value.decode("utf-8")
except Exception:
return value.decode("utf-8", errors="ignore")
return value
class NetworkService:
"""Сервис для взаимодействия с NetworkManager через D-Bus.
@ -51,7 +62,7 @@ class NetworkService:
self.system_bus = sd_bus_open_system()
self.nm = NetworkManager(self.system_bus)
self.nm_settings = NetworkManagerSettings(self.system_bus)
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
async def get_ip_method(self, device: NetworkDeviceGeneric, ip_type: str) -> str:
"""Получает метод IP (например, "auto", "manual") для указанного устройства.
@ -152,7 +163,7 @@ class NetworkService:
wifi_info = {
"ssid": None,
"bssid": None,
"bitrate": await wifi_device.bitrate,
"bitrate": _extract_value(await wifi_device.bitrate),
"strength": None,
"frequency": None,
"mode": None,
@ -160,11 +171,11 @@ class NetworkService:
if active_ap != "/":
ap = AccessPoint(active_ap, self.system_bus)
wifi_info.update({
"ssid": await ap.ssid,
"bssid": await ap.hw_address,
"strength": await ap.strength,
"frequency": await ap.frequency,
"mode": await ap.mode,
"ssid": _extract_value(await ap.ssid),
"bssid": _extract_value(await ap.hw_address),
"strength": _extract_value(await ap.strength),
"frequency": _extract_value(await ap.frequency),
"mode": _extract_value(await ap.mode),
})
return wifi_info
@ -209,8 +220,8 @@ class NetworkService:
"device_mtu": str(await generic_device.mtu),
"ipv4": IPConfig(configurations=await self.get_ip_config(generic_device, "4")),
"ipv6": IPConfig(configurations=await self.get_ip_config(generic_device, "6")),
"x": initial_positions.get(interface_name, (100, 100))[0],
"y": initial_positions.get(interface_name, (100, 100))[1],
"container_x": initial_positions.get(interface_name, (100, 100))[0],
"container_y": initial_positions.get(interface_name, (100, 100))[1],
}
if device_type == "WIFI":

View file

@ -2,7 +2,7 @@ import json
import logging
from typing import Optional
from utils.i18n import get_translations
from utils.i18n import _load_translations
from babel.support import Translations
from pathlib import Path
@ -15,7 +15,7 @@ class SettingsService:
def __init__(self, translations: Translations = None):
self.subnet_base_path = "storage/subnets"
self.wifi_file = "storage/wifi/wifi.json"
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
def clear_subnet(self, subnet: Optional[str] = None) -> bool:
"""Очищает данные узлов подсети в указанном файле или во всех файлах.

View file

@ -27,7 +27,7 @@ logging.basicConfig(
)
logger = logging.getLogger(__name__)
def get_subnet_service(translations: Translations = Depends(get_translations())):
def get_subnet_service(translations: Translations = Depends(get_translations)):
"""Фабричная функция для создания экземпляра SubnetService.
Использует зависимости FastAPI для получения объекта переводов и возвращает
@ -724,4 +724,4 @@ class SubnetService:
return True, ("success", {"mac": mac})
except Exception as e:
logger.error(f"Error deleting note for MAC {mac}: {str(e)}")
return False, ("internal_error", {"error": str(e)})
return False, ("internal_error", {"error": str(e)})

View file

@ -9,7 +9,7 @@ import pywifi
from models.wifi import WifiAccessPoint, WifiScanResult
from pathlib import Path
import json
from utils.i18n import get_translations
from utils.i18n import _load_translations
from babel.support import Translations
# Настройка логирования
@ -36,7 +36,7 @@ class WifiStorage:
def __init__(self, storage_path: str = "storage/wifi/wifi.json", translations: Translations = None):
self.storage_file = Path(storage_path)
self.storage_file.parent.mkdir(parents=True, exist_ok=True)
self.translations = translations or get_translations()()
self.translations = translations or _load_translations("ru")
logger.info(f"Wi-Fi storage initialized at: {self.storage_file.absolute()}")
def load_notes(self) -> Dict[str, Optional[str]]:
@ -88,10 +88,10 @@ class WifiService:
self.mac_lookup = MacLookup()
self.wifi = pywifi.PyWiFi()
self.interface = self._get_wifi_interface()
validated_translations = translations or get_translations()()
validated_translations = translations or _load_translations("ru")
if not hasattr(validated_translations, "gettext"):
logger.warning("Translations object does not support gettext, using fallback")
validated_translations = get_translations()()
validated_translations = _load_translations("ru")
self.translations = validated_translations
self.storage = WifiStorage()