|
|
@@ -0,0 +1,156 @@
|
|
|
+"""Simple two-language localization (EN / RU) for the LF-MRI GUI."""
|
|
|
+from __future__ import annotations
|
|
|
+
|
|
|
+_lang: str = "en"
|
|
|
+
|
|
|
+_T: dict[str, dict[str, str]] = {
|
|
|
+ # --- nav bar ---
|
|
|
+ "tab_nav_sequence": {"en": "Sequence", "ru": "Последовательность"},
|
|
|
+ "tab_nav_scanner": {"en": "Scanner", "ru": "Сканнер"},
|
|
|
+ "tab_nav_fid": {"en": "FID", "ru": "FID"},
|
|
|
+ "tab_nav_scanning": {"en": "Scanning", "ru": "Сканирование"},
|
|
|
+ "tab_nav_spectro": {"en": "Spectroscopy", "ru": "Спектроскопия"},
|
|
|
+ "active_tab": {"en": "Active", "ru": "Активно"},
|
|
|
+
|
|
|
+ # --- scanner_tab ---
|
|
|
+ "url_label": {"en": "Orchestrator URL:", "ru": "URL оркестратора:"},
|
|
|
+ "btn_connect": {"en": "Connect", "ru": "Подключить"},
|
|
|
+ "offline": {"en": "● Offline", "ru": "● Не подключён"},
|
|
|
+ "online": {"en": "● Online", "ru": "● Подключён"},
|
|
|
+ "conn_error": {"en": "● Error", "ru": "● Ошибка"},
|
|
|
+ "grp_scenario": {"en": "Scenario", "ru": "Сценарий"},
|
|
|
+ "btn_refresh": {"en": "Refresh", "ru": "Обновить"},
|
|
|
+ "grp_seq_info": {"en": "Sequence Info", "ru": "Информация о посл-ти"},
|
|
|
+ "no_seq_loaded": {"en": "No sequence loaded", "ru": "Посл-ть не загружена"},
|
|
|
+ "grp_job": {"en": "Job", "ru": "Задание"},
|
|
|
+ "no_job": {"en": "- no job -", "ru": "- нет задания -"},
|
|
|
+ "btn_load_scenario": {"en": "Load Scenario", "ru": "Загрузить сценарий"},
|
|
|
+ "btn_run_all": {"en": "Run All", "ru": "Запустить всё"},
|
|
|
+ "btn_next_step": {"en": "Next Step", "ru": "Следующий шаг"},
|
|
|
+ "btn_abort": {"en": "Abort", "ru": "Прервать"},
|
|
|
+ "col_step": {"en": "Step", "ru": "Шаг"},
|
|
|
+ "col_status": {"en": "Status", "ru": "Статус"},
|
|
|
+ "col_result": {"en": "Result", "ru": "Результат"},
|
|
|
+ "tab_step_result": {"en": "Step Result", "ru": "Результат шага"},
|
|
|
+ "tab_seq_info_view": {"en": "Sequence Info", "ru": "Инф. о посл-ти"},
|
|
|
+ "tab_log": {"en": "Log", "ru": "Журнал"},
|
|
|
+
|
|
|
+ # --- seq_interp_tab ---
|
|
|
+ "btn_load_seq": {"en": " Load .seq", "ru": " Загрузить .seq"},
|
|
|
+ "btn_hw_config": {"en": " HW Config", "ru": " Конфиг ЖО"},
|
|
|
+ "btn_out_dir": {"en": " Output Dir", "ru": " Папка вывода"},
|
|
|
+ "btn_run": {"en": "Run", "ru": "Запустить"},
|
|
|
+ "btn_export": {"en": " Export", "ru": " Экспорт"},
|
|
|
+ "btn_fit_all": {"en": " Fit All", "ru": " Вписать всё"},
|
|
|
+ "blocks_closed": {"en": " Blocks ▾", "ru": " Блоки ▾"},
|
|
|
+ "blocks_open": {"en": " Blocks ▴", "ru": " Блоки ▴"},
|
|
|
+ "btn_send_scanner": {"en": " Send to Scanner", "ru": " На сканнер"},
|
|
|
+ "grp_seq_metadata": {"en": "Sequence Metadata", "ru": "Метаданные посл-ти"},
|
|
|
+ "grp_warnings": {"en": "Warnings", "ru": "Предупреждения"},
|
|
|
+ "status_ready": {"en": "Ready", "ru": "Готово"},
|
|
|
+ "no_file_selected": {"en": "No file selected", "ru": "Файл не выбран"},
|
|
|
+
|
|
|
+ # --- fid_tab ---
|
|
|
+ "btn_generate": {"en": "Generate", "ru": "Генерировать"},
|
|
|
+ "btn_save_seq": {"en": " Save .seq", "ru": " Сохранить .seq"},
|
|
|
+ "btn_load_seq_tab": {"en": "→ Load in Sequence Tab", "ru": "→ В Sequence Tab"},
|
|
|
+ "grp_fid_params": {"en": "FID Parameters", "ru": "Параметры FID"},
|
|
|
+ "grp_pulse_type": {"en": "Pulse type", "ru": "Тип импульса"},
|
|
|
+ "grp_out_filename": {"en": "Output filename (no extension)", "ru": "Имя файла (без расширения)"},
|
|
|
+ "fid_status_init": {
|
|
|
+ "en": "Ready - set parameters and click Generate",
|
|
|
+ "ru": "Готово - задайте параметры и нажмите Генерировать",
|
|
|
+ },
|
|
|
+
|
|
|
+ # --- scanning_tab ---
|
|
|
+ "protocols_header": {"en": "Protocols", "ru": "Протоколы"},
|
|
|
+ "tab_main": {"en": "Main", "ru": "Основные"},
|
|
|
+ "tab_contrast": {"en": "Contrast", "ru": "Контраст"},
|
|
|
+ "tab_resolution": {"en": "Resolution", "ru": "Разрешение"},
|
|
|
+ "tab_system": {"en": "System", "ru": "Система"},
|
|
|
+ "tab_geometry": {"en": "Geometry", "ru": "Геометрия"},
|
|
|
+ "grp_orientation": {"en": "Orientation", "ru": "Ориентация"},
|
|
|
+ "grp_rotation": {"en": "Rotation", "ru": "Поворот"},
|
|
|
+ "grp_rot_matrix": {"en": "Rotation Matrix", "ru": "Матрица поворота"},
|
|
|
+ "no_data": {"en": "No data", "ru": "Нет данных"},
|
|
|
+ "btn_scan": {"en": "Scan", "ru": "Сканировать"},
|
|
|
+ "btn_stop_scan": {"en": "Stop", "ru": "Стоп"},
|
|
|
+ "scanning_status": {"en": "Scanning...", "ru": "Сканирование..."},
|
|
|
+ "ready_to_scan": {"en": "Ready to scan", "ru": "Готово к сканированию"},
|
|
|
+ "dlg_no_data_title": {"en": "No data", "ru": "Нет данных"},
|
|
|
+ "dlg_no_seq_msg": {
|
|
|
+ "en": "First load and export a sequence\nin the \"Sequence\" tab.",
|
|
|
+ "ru": "Сначала загрузите и экспортируйте последовательность\nво вкладке \"Sequence\".",
|
|
|
+ },
|
|
|
+ "done_status": {"en": "Done", "ru": "Готово"},
|
|
|
+ "error_prefix": {"en": "Error", "ru": "Ошибка"},
|
|
|
+
|
|
|
+ # --- spectroscopy_tab ---
|
|
|
+ "btn_load_json": {"en": "Load JSON...", "ru": "Загрузить JSON..."},
|
|
|
+ "btn_analyze": {"en": "Analyze", "ru": "Анализировать"},
|
|
|
+ "btn_batch": {"en": "Batch...", "ru": "Пакетный..."},
|
|
|
+ "btn_export_sp": {"en": "Export...", "ru": "Экспорт..."},
|
|
|
+ "btn_clear": {"en": "Clear", "ru": "Очистить"},
|
|
|
+ "grp_nmr_params": {"en": "NMR Parameters", "ru": "Параметры ЯМР"},
|
|
|
+ "grp_metadata": {"en": "Metadata", "ru": "Метаданные"},
|
|
|
+ "grp_metrics": {"en": "Metrics", "ru": "Метрики"},
|
|
|
+ "spec_status_init": {
|
|
|
+ "en": "Click 'Load JSON...' to open a hardware JSON file and start NMR analysis",
|
|
|
+ "ru": "Нажмите 'Загрузить JSON...' для открытия JSON-файла и запуска анализа ЯМР",
|
|
|
+ },
|
|
|
+ "batch_title": {"en": "Batch NMR Analysis", "ru": "Пакетный анализ ЯМР"},
|
|
|
+ "folder_label": {"en": "Folder:", "ru": "Папка:"},
|
|
|
+ "btn_browse": {"en": "Browse...", "ru": "Обзор..."},
|
|
|
+ "cb_use_current": {
|
|
|
+ "en": "Use current parameters from the Spectroscopy tab",
|
|
|
+ "ru": "Использовать текущие параметры вкладки Spectroscopy",
|
|
|
+ },
|
|
|
+ "btn_run_batch": {"en": "Run Batch", "ru": "Запустить пакет"},
|
|
|
+ "btn_export_csv": {"en": "Export CSV...", "ru": "Экспорт CSV..."},
|
|
|
+ "btn_close": {"en": "Close", "ru": "Закрыть"},
|
|
|
+ "batch_status_init": {
|
|
|
+ "en": "Select a folder and click Run Batch.",
|
|
|
+ "ru": "Выберите папку и нажмите Запустить пакет.",
|
|
|
+ },
|
|
|
+
|
|
|
+ # --- controls_panel ---
|
|
|
+ "grp_hw_delays": {"en": "Hardware Delays / Rasters", "ru": "Задержки / Растры ЖО"},
|
|
|
+ "btn_apply_rerun": {"en": "Apply && Rerun", "ru": "Применить && Перезапуск"},
|
|
|
+ "btn_reset": {"en": "Reset", "ru": "Сброс"},
|
|
|
+ "btn_reload_config": {"en": "Reload Config", "ru": "Перезагрузить конфиг"},
|
|
|
+ "btn_save_hw": {"en": "Save HW Config", "ru": "Сохранить конфиг ЖО"},
|
|
|
+}
|
|
|
+
|
|
|
+_TAB_NAV_KEYS = [
|
|
|
+ "tab_nav_sequence",
|
|
|
+ "tab_nav_scanner",
|
|
|
+ "tab_nav_fid",
|
|
|
+ "tab_nav_scanning",
|
|
|
+ "tab_nav_spectro",
|
|
|
+]
|
|
|
+
|
|
|
+_PARAM_TABS_KEYS = [
|
|
|
+ "tab_main",
|
|
|
+ "tab_contrast",
|
|
|
+ "tab_resolution",
|
|
|
+ "tab_system",
|
|
|
+ "tab_geometry",
|
|
|
+]
|
|
|
+
|
|
|
+
|
|
|
+def tr(key: str) -> str:
|
|
|
+ """Return translated string for *key* in the current language."""
|
|
|
+ entry = _T.get(key)
|
|
|
+ if entry is None:
|
|
|
+ return key
|
|
|
+ return entry.get(_lang, entry.get("en", key))
|
|
|
+
|
|
|
+
|
|
|
+def current_language() -> str:
|
|
|
+ return _lang
|
|
|
+
|
|
|
+
|
|
|
+def set_language(lang: str) -> None:
|
|
|
+ global _lang
|
|
|
+ if lang in ("en", "ru"):
|
|
|
+ _lang = lang
|