""" Lity3D Editor 多语言翻译系统 支持: 中文、English、日本語、한국어、Español、Français、Deutsch、Русский、العربية、Português、Italiano、Türkçe """ import json, os LANG_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "languages") _translations = { "zh": { "app_title": "Lity3D 编辑器", "menu_file": "文件", "menu_edit": "编辑", "menu_build": "构建", "menu_scene": "场景", "menu_help": "帮助", "menu_view": "视图", "menu_language": "语言", "new_file": "新建文件", "open_file": "打开文件", "open_folder": "打开文件夹", "save": "保存", "save_as": "另存为", "exit": "退出", "run": "运行", "run_game": "运行游戏", "run_file": "运行当前文件", "stop": "停止", "build_engine": "编译引擎", "build_exe": "打包为 EXE", "kill_process": "终止进程", "new_scene": "新建场景", "open_scene": "打开场景", "save_scene": "保存场景", "run_scene": "运行场景", "about": "关于 Lity3D", "docs": "API 文档", "explorer": "资源管理器", "output": "输出", "console": "控制台", "ready": "就绪", "running": "运行中...", "saved": "已保存", "opened": "已打开", "new_file_msg": "新文件", "no_file": "没有打开文件", "no_scene": "没有找到场景文件", "build_first": "请先编译引擎", "kill_done": "进程已终止", "build_ok": "编译成功", "build_err": "编译失败", "packaged": "已打包", "new_scene_ok": "新场景已创建", "process_exit": "进程退出,返回码", "cant_run": "无法运行此类文件", "interpreter_not_found": "解释器未编译", "theme": "主题", "dark_theme": "深色主题", "light_theme": "浅色主题", "undo": "撤销", "redo": "重做", "cut": "剪切", "copy": "复制", "paste": "粘贴", "select_all": "全选", "find": "查找", "replace": "替换", "goto_line": "跳转到行", "preferences": "首选项", "recent_files": "最近文件", "reload": "重新加载", "close_tab": "关闭标签", "close_all": "关闭所有", "line": "行", "col": "列", "chars": "字符", "encoding": "编码", "new_scene_dialog_title": "新建场景", "new_scene_name": "场景名称:", "new_scene_type": "场景类型:", "type_empty": "空场景", "type_rpg": "RPG 模板", "type_fps": "FPS 模板", "type_platformer": "平台跳跃模板", "type_custom": "自定义", "create": "创建", "cancel": "取消", "confirm": "确认", "delete": "删除", "rename": "重命名", "duplicate": "复制", "properties": "属性", "hierarchy": "层级", "inspector": "检查器", "game_view": "游戏视图", "scene_view": "场景视图", "project": "项目", }, "en": { "app_title": "Lity3D Editor", "menu_file": "File", "menu_edit": "Edit", "menu_build": "Build", "menu_scene": "Scene", "menu_help": "Help", "menu_view": "View", "menu_language": "Language", "new_file": "New File", "open_file": "Open File", "open_folder": "Open Folder", "save": "Save", "save_as": "Save As", "exit": "Exit", "run": "Run", "run_game": "Run Game", "run_file": "Run Current File", "stop": "Stop", "build_engine": "Build Engine", "build_exe": "Package as EXE", "kill_process": "Kill Process", "new_scene": "New Scene", "open_scene": "Open Scene", "save_scene": "Save Scene", "run_scene": "Run Scene", "about": "About Lity3D", "docs": "API Docs", "explorer": "Explorer", "output": "Output", "console": "Console", "ready": "Ready", "running": "Running...", "saved": "Saved", "opened": "Opened", "new_file_msg": "New file", "no_file": "No file open", "no_scene": "No scene file found", "build_first": "Build engine first", "kill_done": "Process killed", "build_ok": "Build succeeded", "build_err": "Build failed", "packaged": "Packaged to", "new_scene_ok": "New scene created", "process_exit": "Process exited with code", "cant_run": "Cannot run this file type", "interpreter_not_found": "Interpreter not built", "theme": "Theme", "dark_theme": "Dark Theme", "light_theme": "Light Theme", "undo": "Undo", "redo": "Redo", "cut": "Cut", "copy": "Copy", "paste": "Paste", "select_all": "Select All", "find": "Find", "replace": "Replace", "goto_line": "Go to Line", "preferences": "Preferences", "recent_files": "Recent Files", "reload": "Reload", "close_tab": "Close Tab", "close_all": "Close All", "line": "Line", "col": "Col", "chars": "Characters", "encoding": "Encoding", "new_scene_dialog_title": "New Scene", "new_scene_name": "Scene Name:", "new_scene_type": "Scene Type:", "type_empty": "Empty Scene", "type_rpg": "RPG Template", "type_fps": "FPS Template", "type_platformer": "Platformer Template", "type_custom": "Custom", "create": "Create", "cancel": "Cancel", "confirm": "Confirm", "delete": "Delete", "rename": "Rename", "duplicate": "Duplicate", "properties": "Properties", "hierarchy": "Hierarchy", "inspector": "Inspector", "game_view": "Game View", "scene_view": "Scene View", "project": "Project", }, "ja": { "app_title": "Lity3D エディタ", "menu_file": "ファイル", "menu_edit": "編集", "menu_build": "ビルド", "menu_scene": "シーン", "menu_help": "ヘルプ", "menu_view": "表示", "menu_language": "言語", "new_file": "新規ファイル", "open_file": "ファイルを開く", "open_folder": "フォルダを開く", "save": "保存", "save_as": "名前を付けて保存", "exit": "終了", "run": "実行", "run_game": "ゲームを実行", "run_file": "現在のファイルを実行", "stop": "停止", "build_engine": "エンジンをビルド", "build_exe": "EXEにパッケージ", "kill_process": "プロセスを終了", "new_scene": "新規シーン", "open_scene": "シーンを開く", "save_scene": "シーンを保存", "run_scene": "シーンを実行", "about": "Lity3D について", "docs": "API ドキュメント", "explorer": "エクスプローラ", "output": "出力", "ready": "準備完了", "running": "実行中...", "dark_theme": "ダークテーマ", "light_theme": "ライトテーマ", "undo": "元に戻す", "redo": "やり直す", "save_as": "名前を付けて保存", "line": "行", "col": "列", "cancel": "キャンセル", "create": "作成", }, "ko": { "app_title": "Lity3D 편집기", "menu_file": "파일", "menu_edit": "편집", "menu_build": "빌드", "menu_scene": "씬", "menu_help": "도움말", "menu_view": "보기", "menu_language": "언어", "new_file": "새 파일", "open_file": "파일 열기", "open_folder": "폴더 열기", "save": "저장", "save_as": "다른 이름으로 저장", "exit": "종료", "run": "실행", "run_game": "게임 실행", "run_file": "현재 파일 실행", "stop": "중지", "build_engine": "엔진 빌드", "build_exe": "EXE로 패키징", "kill_process": "프로세스 종료", "new_scene": "새 씬", "about": "Lity3D 정보", "docs": "API 문서", "explorer": "탐색기", "output": "출력", "ready": "준비", "running": "실행 중...", "dark_theme": "다크 테마", "light_theme": "라이트 테마", "undo": "실행 취소", "redo": "다시 실행", "cancel": "취소", "create": "생성", "line": "줄", "col": "열", }, "es": { "app_title": "Lity3D Editor", "menu_file": "Archivo", "menu_edit": "Editar", "menu_build": "Construir", "menu_scene": "Escena", "menu_help": "Ayuda", "menu_view": "Vista", "menu_language": "Idioma", "new_file": "Nuevo archivo", "open_file": "Abrir archivo", "save": "Guardar", "save_as": "Guardar como", "exit": "Salir", "run": "Ejecutar", "run_game": "Ejecutar juego", "stop": "Detener", "build_engine": "Compilar motor", "build_exe": "Empaquetar como EXE", "about": "Acerca de Lity3D", "explorer": "Explorador", "output": "Salida", "ready": "Listo", "running": "Ejecutando...", "dark_theme": "Tema oscuro", "light_theme": "Tema claro", "undo": "Deshacer", "redo": "Rehacer", "cancel": "Cancelar", "create": "Crear", "line": "Línea", "col": "Col", }, "fr": { "app_title": "Lity3D Éditeur", "menu_file": "Fichier", "menu_edit": "Édition", "menu_build": "Construire", "menu_scene": "Scène", "menu_help": "Aide", "menu_view": "Affichage", "menu_language": "Langue", "new_file": "Nouveau fichier", "open_file": "Ouvrir fichier", "save": "Enregistrer", "save_as": "Enregistrer sous", "exit": "Quitter", "run": "Exécuter", "run_game": "Exécuter le jeu", "stop": "Arrêter", "build_engine": "Compiler le moteur", "build_exe": "Package EXE", "about": "À propos", "explorer": "Explorateur", "output": "Sortie", "ready": "Prêt", "running": "En exécution...", "dark_theme": "Thème sombre", "light_theme": "Thème clair", "undo": "Annuler", "redo": "Rétablir", "cancel": "Annuler", "create": "Créer", "line": "Ligne", "col": "Col", }, "de": { "app_title": "Lity3D Editor", "menu_file": "Datei", "menu_edit": "Bearbeiten", "menu_build": "Erstellen", "menu_scene": "Szene", "menu_help": "Hilfe", "menu_view": "Ansicht", "menu_language": "Sprache", "new_file": "Neue Datei", "open_file": "Datei öffnen", "save": "Speichern", "save_as": "Speichern unter", "exit": "Beenden", "run": "Ausführen", "run_game": "Spiel starten", "stop": "Stopp", "build_engine": "Engine erstellen", "build_exe": "Als EXE paketieren", "about": "Über Lity3D", "explorer": "Explorer", "output": "Ausgabe", "ready": "Bereit", "running": "Wird ausgeführt...", "dark_theme": "Dunkles Theme", "light_theme": "Helles Theme", "undo": "Rückgängig", "redo": "Wiederholen", "cancel": "Abbrechen", "create": "Erstellen", "line": "Zeile", "col": "Spalte", }, "ru": { "app_title": "Lity3D Редактор", "menu_file": "Файл", "menu_edit": "Правка", "menu_build": "Сборка", "menu_scene": "Сцена", "menu_help": "Справка", "menu_view": "Вид", "menu_language": "Язык", "new_file": "Новый файл", "open_file": "Открыть файл", "save": "Сохранить", "save_as": "Сохранить как", "exit": "Выход", "run": "Запуск", "run_game": "Запустить игру", "stop": "Стоп", "build_engine": "Собрать движок", "build_exe": "Упаковать в EXE", "about": "О Lity3D", "explorer": "Проводник", "output": "Вывод", "ready": "Готово", "running": "Выполняется...", "dark_theme": "Тёмная тема", "light_theme": "Светлая тема", "undo": "Отменить", "redo": "Повторить", "cancel": "Отмена", "create": "Создать", "line": "Строка", "col": "Столбец", }, "pt": { "app_title": "Lity3D Editor", "menu_file": "Arquivo", "menu_edit": "Editar", "menu_build": "Compilar", "menu_scene": "Cena", "menu_help": "Ajuda", "menu_view": "Visualizar", "menu_language": "Idioma", "new_file": "Novo arquivo", "open_file": "Abrir arquivo", "save": "Salvar", "save_as": "Salvar como", "exit": "Sair", "run": "Executar", "run_game": "Executar jogo", "stop": "Parar", "build_engine": "Compilar engine", "build_exe": "Empacotar EXE", "about": "Sobre Lity3D", "explorer": "Explorador", "output": "Saída", "ready": "Pronto", "running": "Executando...", "dark_theme": "Tema escuro", "light_theme": "Tema claro", "undo": "Desfazer", "redo": "Refazer", "cancel": "Cancelar", "create": "Criar", "line": "Linha", "col": "Col", }, "it": { "app_title": "Lity3D Editor", "menu_file": "File", "menu_edit": "Modifica", "menu_build": "Compila", "menu_scene": "Scena", "menu_help": "Aiuto", "menu_view": "Vista", "menu_language": "Lingua", "new_file": "Nuovo file", "open_file": "Apri file", "save": "Salva", "save_as": "Salva come", "exit": "Esci", "run": "Esegui", "run_game": "Esegui gioco", "stop": "Ferma", "build_engine": "Compila engine", "build_exe": "Pacchetta EXE", "about": "Informazioni", "explorer": "Esplora", "output": "Output", "ready": "Pronto", "running": "In esecuzione...", "dark_theme": "Tema scuro", "light_theme": "Tema chiaro", "undo": "Annulla", "redo": "Ripristina", "cancel": "Annulla", "create": "Crea", "line": "Riga", "col": "Col", }, "tr": { "app_title": "Lity3D Editör", "menu_file": "Dosya", "menu_edit": "Düzenle", "menu_build": "Derle", "menu_scene": "Sahne", "menu_help": "Yardım", "menu_view": "Görünüm", "menu_language": "Dil", "new_file": "Yeni dosya", "open_file": "Dosya aç", "save": "Kaydet", "save_as": "Farklı kaydet", "exit": "Çıkış", "run": "Çalıştır", "run_game": "Oyunu çalıştır", "stop": "Durdur", "build_engine": "Motoru derle", "build_exe": "EXE paketle", "about": "Hakkında", "explorer": "Gezgin", "output": "Çıktı", "ready": "Hazır", "running": "Çalışıyor...", "dark_theme": "Koyu tema", "light_theme": "Açık tema", "undo": "Geri al", "redo": "Yinele", "cancel": "İptal", "create": "Oluştur", "line": "Satır", "col": "Sütun", }, } _current_lang = "zh" _listeners = [] LANG_NAMES = { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어", "es": "Español", "fr": "Français", "de": "Deutsch", "ru": "Русский", "pt": "Português", "it": "Italiano", "tr": "Türkçe", } def t(key): lang = _translations.get(_current_lang, _translations["en"]) return lang.get(key, _translations["en"].get(key, key)) def set_language(lang_code): global _current_lang if lang_code in _translations: _current_lang = lang_code for cb in _listeners: cb() def get_language(): return _current_lang def on_language_change(callback): _listeners.append(callback) def get_all_languages(): return [(code, LANG_NAMES.get(code, code)) for code in _translations] def save_language(code): path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".lang") with open(path, "w") as f: f.write(code) def load_language(): global _current_lang path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".lang") if os.path.exists(path): with open(path) as f: code = f.read().strip() if code in _translations: _current_lang = code