Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[generic]
lang=zh_CN
9 changes: 5 additions & 4 deletions core/file_save.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
from PySide6.QtWidgets import (QMessageBox)
from modules.UML import GameMakerLib as gml
import loc
class FileSave():
def __init__(self):
super().__init__()
Expand All @@ -11,13 +12,13 @@ def save_file_raw(self, path, content):
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
QMessageBox.information(self, "成功", "文件保存成功!")
QMessageBox.information(self, loc.translate("locSuccess"), loc.translate("locProjectSaved"))
except Exception as e:
QMessageBox.critical(self, "错误", f"保存失败:{str(e)}")
QMessageBox.critical(self, loc.translate("locError"), loc.translate("locProjectLoadFailed")+str(e))

def save_file_gm(self, path, content):
try:
gml.Write(path, content)
QMessageBox.information(self, "成功", "文件保存成功!")
QMessageBox.information(self, loc.translate("locSuccess"), loc.translate("locProjectSaved"))
except Exception as e:
QMessageBox.critical(self, "错误", f"保存失败:{str(e)}")
QMessageBox.critical(self, loc.translate("locError"), loc.translate("locProjectLoadFailed")+str(e))
19 changes: 10 additions & 9 deletions core/project_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import datetime
from PySide6.QtCore import QObject, Signal
from PySide6.QtWidgets import QFileDialog
import loc
class ProjectManager(QObject):
project_loaded = Signal(dict) # 工程加载成功信号
project_saved = Signal() # 工程保存成功信号
Expand All @@ -15,27 +16,27 @@ def __init__(self):

def new_project(self, parent_window):
"""创建新工程"""
src_folder = self._get_directory(parent_window, "选择源文件夹")
src_folder = self._get_directory(parent_window, loc.translate("locSelectSrcFolder"))
if not src_folder: return

project_folder = self._get_directory(parent_window, "选择工程文件夹")
project_folder = self._get_directory(parent_window, loc.translate("locSelectProjFolder"))
if not project_folder: return

try:
project_data = self._create_project_structure(src_folder, project_folder)
self.current_project = project_data
self.project_loaded.emit(project_data)
except Exception as e:
self.error_occurred.emit(f"创建工程失败:{str(e)}")
self.error_occurred.emit(loc.translate("locProjectCreateFailed")+str(e))

def open_project(self, parent_window):
"""打开已有工程"""
project_folder = self._get_directory(parent_window, "选择工程文件夹")
project_folder = self._get_directory(parent_window, loc.translate("locSelectProjFolder"))
if not project_folder: return

project_file = os.path.join(project_folder, 'project.json')
if not os.path.exists(project_file):
self.error_occurred.emit("无效的工程目录")
self.error_occurred.emit(loc.translate("locInvalidProjDir"))
return

try:
Expand All @@ -47,12 +48,12 @@ def open_project(self, parent_window):
self.current_project = project_data
self.project_loaded.emit(project_data)
except Exception as e:
self.error_occurred.emit(f"加载工程失败:{str(e)}")
self.error_occurred.emit(loc.translate("locProjectLoadFailed")+str(e))

def save_project(self):
"""保存当前工程"""
if not self.current_project:
self.error_occurred.emit("没有正在编辑的工程")
self.error_occurred.emit(loc.translate("locNoProjEditing"))
return

try:
Expand All @@ -64,7 +65,7 @@ def save_project(self):

self.project_saved.emit()
except Exception as e:
self.error_occurred.emit(f"保存失败:{str(e)}")
self.error_occurred.emit(loc.translate("locProjectLoadFailed")+str(e))

def _create_project_structure(self, src_folder, project_folder):
"""创建工程目录结构"""
Expand Down Expand Up @@ -98,4 +99,4 @@ def _validate_project(self, project_data):
required_dirs = ['source', 'target']
for d in required_dirs:
if not os.path.isdir(os.path.join(project_data['project_path'], d)):
raise ValueError(f"缺失必需目录: {d}")
raise ValueError(loc.translate("locNecessaryDirMissing")+d)
4 changes: 2 additions & 2 deletions editors/base_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def __init__(self, source_path, target_path):
self.init_ui()

def init_ui(self):
raise NotImplementedError("必须实现init_ui方法")
raise NotImplementedError("Method init_ui need to be implement")

def get_content(self):
raise NotImplementedError("必须实现get_content方法")
raise NotImplementedError("Method get_content need to be implement")
5 changes: 3 additions & 2 deletions editors/csv_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from .base_editor import BaseEditor
from PySide6.QtCore import Qt
from utils import detect_encoding
import loc

class CSVEditor(BaseEditor):
def init_ui(self):
Expand Down Expand Up @@ -46,8 +47,8 @@ def _create_table(self, source_data, target_data):
# 设置表头
headers = []
for i in range(col_count):
headers.append(f"源列 {i+1}")
headers.append(f"目标列 {i+1}")
headers.append(f"{loc.translate("locSourceColumn")} {i+1}")
headers.append(f"{loc.translate("locTargetColumn")} {i+1}")
self.table.setHorizontalHeaderLabels(headers)

# 填充数据
Expand Down
4 changes: 2 additions & 2 deletions editors/gm/gm_base_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def __init__(self, source_data, target_data, id):
self.init_ui()

def init_ui(self):
raise NotImplementedError("必须实现init_ui方法")
raise NotImplementedError("Method init_ui need to be implement")

def save(self):
raise NotImplementedError("必须实现save方法")
raise NotImplementedError("Method save need to be implement")
7 changes: 4 additions & 3 deletions editors/gm/gm_strings_editor.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from PySide6.QtWidgets import QHBoxLayout, QPlainTextEdit, QVBoxLayout, QLabel
from .gm_base_editor import GMBaseEditor
from modules.UML import GameMakerLib as gml
import loc

class GMStringsEditor(GMBaseEditor):
def _handle_modify(self):
Expand All @@ -12,18 +13,18 @@ def init_ui(self):

# 源文本侧布局
source_layout = QVBoxLayout()
source_layout.addWidget(QLabel("源文本"))
source_layout.addWidget(QLabel(loc.translate("locSrcTxt")))
self.source_editor = QPlainTextEdit()
try:
self.source_editor.setPlainText(self.source_data.Strings[int(self.id)].Content)
except:
self.source_editor.setPlainText("无法读取源文本")
self.source_editor.setPlainText(loc.translate("locUnable2LoadSrcTxt"))
self.source_editor.setReadOnly(True)
source_layout.addWidget(self.source_editor)

# 目标文本侧布局
target_layout = QVBoxLayout()
target_layout.addWidget(QLabel("目标文本"))
target_layout.addWidget(QLabel(loc.translate("locTarTxt")))
self.target_editor = QPlainTextEdit()
try:
self.target_editor.setPlainText(self.target_data.Strings[int(self.id)].Content)
Expand Down
3 changes: 2 additions & 1 deletion editors/json_editor.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
from PySide6.QtWidgets import QHBoxLayout, QTableWidget, QTableWidgetItem
from .base_editor import BaseEditor
import loc

class JSONEditor(BaseEditor):
def init_ui(self):
Expand All @@ -14,7 +15,7 @@ def init_ui(self):
target_data = source_data.copy()

self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["键", "源文本", "目标文本"])
self.table.setHorizontalHeaderLabels([loc.translate("locKey"), loc.translate("locSrcTxt"), loc.translate("locTarTxt")])
self.table.setRowCount(len(source_data))

for row, (key, value) in enumerate(source_data.items()):
Expand Down
3 changes: 2 additions & 1 deletion editors/text_editor.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from PySide6.QtWidgets import QHBoxLayout, QPlainTextEdit
from .base_editor import BaseEditor
import loc

class TextEditor(BaseEditor):
def _handle_modify(self):
Expand All @@ -13,7 +14,7 @@ def init_ui(self):
with open(self.source_path, 'r', encoding='utf-8') as f:
self.source_editor.setPlainText(f.read())
except:
self.source_editor.setPlainText("无法读取源文件")
self.source_editor.setPlainText(loc.translate("locUnable2LoadSrcFile"))
self.source_editor.setReadOnly(True)

self.target_editor = QPlainTextEdit()
Expand Down
105 changes: 105 additions & 0 deletions loc.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
keys,en,zh_CN,zh_TW
locLangName,English,中文(简体),中文(繁體)

locAppName,TianjiHanTools,天机汉化工具,天機漢化工具
locLoadingCore,Loading Core Component...,正在加载核心组件...,正在加載核心組件
locReady,Ready to go,准备就绪,準備就緒
locConfirmQuit,Confirm to quit,确认退出,確認退出
locConfirmQuitDiag,Are you sure to quit?,确定要退出程序吗?,確定要退出程式嗎?

locSuccess,Success,成功,成功
locProjectSaved,Project saved!,工程保存成功!,工程儲存成功!
locProjectSaveFailed,Project saving failed: ,工程保存失败:,工程儲存失敗:
locProjectLoaded,Project loaded!,工程加载成功!,工程加載成功!
locProjectLoadFailed,Project loading failed: ,工程加载失败:,工程加載失敗:
locProjectCreateFailed,Project creating failed: ,创建工程失败:,創建工程失敗:
locError,Error,错误,錯誤

locSelectProjFolder,Select project folder,选择工程文件夹,選擇工程資料夾
locSelectSrcFolder,Select source folder,选择源文件夹,選擇源資料夾
locInvalidProjDir,Invalid project directory.,无效的工程目录,無效的工程目錄

locMainToolbar,Main toolbar,主工具栏,主工具欄
locFile,File,文件,檔案
locQuit,Quit,退出,退出
locAdd,Add,添加,添加
locEdit,Edit,编辑,編輯
locDelete,Delete,删除,刪除
locBuild,Build,构建,構建
locView,View,视图,試圖
locTool,Tool,工具,工具
locScript,Script,脚本,脚本
locHelp,Help,帮助,幫助

locFileExplorer,File Explorer,文件浏览器,檔案瀏覽器
locExport,Export,导出,匯出
locNew,New,新建,新建
locOpen,Open,打开,打開
locSave,Save,保存,儲存
locRun,Run,运行,運行
locNewInfo,New project,新建工程,新建工程
locOpenInfo,Open project,打开工程,打開工程
locSaveInfo,Save project,保存工程,儲存工程
locRunInfo,Run project,运行工程,運行工程
locNewInfoKey,New project (Ctrl+N),新建工程 (Ctrl+N),新建工程 (Ctrl+N)
locOpenInfoKey,Open project (Ctrl+O),打开工程 (Ctrl+O),打開工程 (Ctrl+O)
locSaveInfoKey,Save project (Ctrl+S),保存工程 (Ctrl+S),儲存工程 (Ctrl+S)
locRunInfoKey,Run project (F5),运行工程 (F5),運行工程 (F5)
locWriteIntoData,Write into data,写入 data,寫入 data
locNoProjEditing,There is no project editing.,没有正在编辑的工程,沒有正在編輯的工程
locNecessaryDirMissing,Neccessary directory is missing: ,缺失必需目录:,缺失必須目錄:

locKey,Key,键,鍵
locSrcTxt,Source text,源文本,源文本
locTarTxt,Target text,目标文本,目標文本
locUnable2LoadSrcTxt,Unable to load source text.,无法读取源文本,無法讀取源文本
locUnable2LoadSrcFile,Unable to load source file.,无法读取源文件,無法讀取源檔案
locSourceColumn,Source column,源列,源列
locTargetColumn,Target column,目标列,目標列
locPreferences,Preferences,首选项,首選項
locLocalizedStrStandardization,Localized Strings Standardization,本地化文本规范化,在地化文本規範化
locSearch,Search...,搜索...,搜尋...
locRegEx,RegEx,正则表达式,規則運算式
locProjectFile,Project file,项目文件,專案檔案

locConvert,Convert,转换,轉換
locMerge,Merge,合并,合并
locUpgrade,Upgrade,升级,升級
locClassification,Classification,分类管理,分類管理

locConvertTxt2Json,Convert TXT to JSON,转换 TXT 到 JSON,轉換 TXT 到 JSON
locMergeJson2Txt,Merge JSON to TXT,合并 JSON 到 TXT,合并 JSON 到 TXT
locSelectDir,Select directory,选择目录,選擇目錄
locSelectFile,Select file,选择文件,選擇檔案
locSaveFile,Save file,保存文件,儲存檔案
locSelectInputFile,Select input file,选择输入文件,選擇輸入檔案
locSelectOutputDir,Select output directory,选择输出目录,選擇輸出目錄
locInputFile,Input file: ,输入文件,輸入檔案:
locOutputDir,Output directory: ,输出目录,輸出目錄:
locSelectInputDir,Select input directory,选择输入目录,選擇輸入目錄
locSelectOutputFile,Select output file,选择输出文件,選擇輸出檔案
locInputDir,Input directory: ,输入目录:,輸入目錄:
locOutputFile,Output file: ,输出文件:,輸出檔案:

locUpgradeTxt,Upgrade Texts,升级文本,升級文本
locSelectOldTxt,Select old TXT file,选择旧 TXT 文件,選擇舊 TXT 檔案
locSelectOldJson,Select old JSON file,选择旧 JSON 文件,選擇舊 JSON 檔案
locSelectNewTxt,Select new TXT file,选择新 TXT 文件,選擇新 TXT 檔案
locOldTxt,Old TXT file: ,旧 TXT 文件:,舊 TXT 檔案:
locOldJson,Old JSON file: ,旧 JSON 文件:,舊 JSON 檔案:
locNewTxt,New TXT file: ,新 TXT 文件:,新 TXT 檔案:

locMoveUp,Move up,上移,上移
locMoveDn,Move down,下移,下移
locName,Name,名称,名稱
locNameInfo,Classification name,分类名称,分類名稱
locType,Type,类型,類型
locTypeInfo,Condition type,条件类型,條件類型
locParam,Param,参数,參數
locRuleEditor,Rule editor,规则编辑器,規則編輯器
locAddRule,Add rule,添加规则,添加規則

locFinished,Finished,完成,完成
locConvertFinished,Convert finished.,转换完成,轉換完成
locMergeFinished,Merge finished.,合并完成,合并完成
locUpgradeFinished,Upgrade finished.,升级完成,升級完成
36 changes: 36 additions & 0 deletions loc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import csv
import configparser

config = configparser.ConfigParser()

global lang
global langs
global keys
lang = "en"
langs = []
keys = {}
with open("loc.csv",encoding="utf-8") as f:
reader = csv.reader(f)
for line in reader:
if (line):
if (line[0] == "keys"):
for langi in line:
if (langi != "keys"):
langs.append(langi)
keys[langi] = {}
else:
for stri in line:
if (line.index(stri) != 0):
keys[langs[line.index(stri)-1]][line[0]] = stri
# print(keys)
config.read("config.ini")
lang = config.get("generic","lang",fallback="en")

def translate(key):
if (key in keys[lang]):
return keys[lang][key]
elif (key in keys["en"]):
return keys["en"][key]
else:
print("Error: Undefined key: "+key)
return key
Loading
Loading