router / deeptutor /services /settings /interface_settings.py
Piyush1225's picture
push
5df8a73
"""
Interface (UI) settings reader.
This is the canonical backend source for user-selected UI language/theme stored in:
data/user/settings/interface.json
"""
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
from deeptutor.services.path_service import get_path_service
_path_service = get_path_service()
INTERFACE_SETTINGS_FILE = _path_service.get_settings_file("interface")
DEFAULT_UI_SETTINGS: dict[str, Any] = {
"theme": "light",
"language": "en",
}
def _normalize_language(language: Any, default: str = "en") -> str:
"""
Normalize language codes:
- en/english -> en
- zh/chinese/cn -> zh
"""
if language is None or language == "":
language = default
if isinstance(language, str):
s = language.lower().strip()
if s in {"en", "english"}:
return "en"
if s in {"zh", "chinese", "cn"}:
return "zh"
# Fall back to default
if isinstance(default, str):
return _normalize_language(default, "en")
return "en"
def get_ui_settings() -> dict[str, Any]:
"""
Read UI settings from interface.json with defaults.
Returns:
dict containing at least: {"theme": "...", "language": "..."}
"""
if INTERFACE_SETTINGS_FILE.exists():
try:
with open(INTERFACE_SETTINGS_FILE, encoding="utf-8") as f:
saved = json.load(f) or {}
merged = {**DEFAULT_UI_SETTINGS, **saved}
merged["language"] = _normalize_language(
merged.get("language"), DEFAULT_UI_SETTINGS["language"]
)
return merged
except Exception:
# On any parse error, fall back to defaults (safe)
return DEFAULT_UI_SETTINGS.copy()
return DEFAULT_UI_SETTINGS.copy()
def get_ui_language(default: str = "en") -> str:
"""
Get current UI language.
Priority:
1) interface.json
2) provided default
3) 'en'
"""
settings = get_ui_settings()
return _normalize_language(settings.get("language"), default)