-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathi18n.py
More file actions
111 lines (87 loc) · 3.54 KB
/
i18n.py
File metadata and controls
111 lines (87 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# i18n.py
import os
import json
from typing import Dict
from PyQt5 import QtCore
from constants import BASE_DIR
from utils import get_settings
LANG_DIR = os.path.join(BASE_DIR, "lang")
class TranslationManager:
"""
Простой менеджер переводов:
- грузит lang/ru.json и lang/en.json (если есть);
- хранит текущий язык в QSettings (ключ ui/language);
- даёт метод translate(key) и глобальную функцию _().
"""
def __init__(self) -> None:
# Базовые словари (можно оставить пустыми — всё в JSON)
self._translations: Dict[str, Dict[str, str]] = {
"ru": {},
"en": {},
}
self._default_lang = "en" # первый запуск
self._fallback_lang = "en" # страховка переводов
# Подгружаем JSON-файлы, если существуют
self._load_json("ru")
self._load_json("en")
# Определяем текущий язык из настроек
settings = get_settings()
lang_code = settings.value("ui/language", self._default_lang, type=str)
if lang_code not in self._translations:
lang_code = self._default_lang
self._current_lang = lang_code
def _load_json(self, code: str) -> None:
"""
Загружает lang/<code>.json и мёрджит в словарь переводов.
Если файла нет или JSON битый — тихо игнорируем.
"""
path = os.path.join(LANG_DIR, f"{code}.json")
if not os.path.isfile(path):
return
try:
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
if isinstance(data, dict):
# все ключи/значения приводим к строкам
self._translations[code].update(
{str(k): str(v) for k, v in data.items()}
)
except Exception:
# никаких падений из-за переводов
pass
def set_language(self, code: str) -> None:
"""
Смена языка: 'ru' или 'en'. Сохраняем в QSettings.
"""
if code not in self._translations:
code = self._default_lang
self._current_lang = code
settings = get_settings()
settings.setValue("ui/language", code)
def get_language(self) -> str:
return self._current_lang
def translate(self, key: str) -> str:
"""
Вернуть перевод по ключу:
1) текущий язык
2) fallback (en)
3) сам key, если ничего не найдено
"""
lang = self._current_lang
if key in self._translations.get(lang, {}):
return self._translations[lang][key]
if key in self._translations.get(self._fallback_lang, {}):
return self._translations[self._fallback_lang][key]
return key
# Глобальный экземпляр менеджера
_manager = TranslationManager()
def set_language(code: str) -> None:
_manager.set_language(code)
def get_language() -> str:
return _manager.get_language()
def _(key: str) -> str:
"""
Глобальная функция-переводчик:
_("settings_title") -> "Настройки XTimer" / "XTimer Settings"
"""
return _manager.translate(key)