543 lines
17 KiB
Python
543 lines
17 KiB
Python
"""
|
||
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
|