2 Star 7 Fork 0

乐园 / 异星工厂MOD汉化工具

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
ElyTranslatorDlg.cpp 27.90 KB
一键复制 编辑 原始数据 按行查看 历史
乐园 提交于 2024-02-08 01:15 . 版本更新
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953

// ElyTranslatorDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "ElyTranslator.h"
#include "ElyTranslatorDlg.h"
#include "CMyListBox.h"
#include "EtFunction.h"
#include "atlenc.h"
#include "CbaiduAPI.h"
#include "EasySize.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//InternalName:内部名称 EditTranslation:待翻译文本 Translated:翻译后文本 EqualSign:符号 CategoryArray:类别
CStringArray InternalName, EditTranslation, Translated, EqualSign, CategoryArray;
//oText:行前选中行的待翻译文本,方便复制到剪贴板 AK:APP ID SK:密钥 oCategory:当前行类别
CString oText, AK, SK, oCategory;
//当前选中行的序号
int tIndex = -1, CK = 0, bExit = 0;
bool decode_manual = false;
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CElyTranslatorDlg 对话框
CElyTranslatorDlg::CElyTranslatorDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_ELYTRANSLATOR_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CElyTranslatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m1_listbox);
DDX_Control(pDX, IDC_PROGRESS1, LoadFileProgress);
DDX_Control(pDX, IDC_EDIT1, m_edit);
DDX_Control(pDX, IDC_EDIT2, m_eline);
DDX_Control(pDX, IDC_EDIT3, m_search);
DDX_Control(pDX, IDC_EDIT4, m2_edit);
DDX_Control(pDX, IDC_CHECK1, m_check);
}
BEGIN_MESSAGE_MAP(CElyTranslatorDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CElyTranslatorDlg::OnBnClickedButton1)
ON_LBN_SELCHANGE(IDC_LIST1, &CElyTranslatorDlg::OnLbnSelchangeList1)
ON_BN_CLICKED(IDC_BUTTON2, &CElyTranslatorDlg::OnBnClickedButton2)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDOK, &CElyTranslatorDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON3, &CElyTranslatorDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CElyTranslatorDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDCANCEL, &CElyTranslatorDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON5, &CElyTranslatorDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CElyTranslatorDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7, &CElyTranslatorDlg::OnBnClickedButton7)
ON_WM_DROPFILES()
ON_BN_CLICKED(IDC_BUTTON8, &CElyTranslatorDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_CHECK1, &CElyTranslatorDlg::OnBnClickedCheck1)
ON_WM_TIMER()
ON_WM_SIZE()
ON_WM_SIZING()
END_MESSAGE_MAP()
BEGIN_EASYSIZE_MAP(CElyTranslatorDlg)
//EASYSIZE(Control_ID,left,top,right,bottom,options)
EASYSIZE(IDC_BUTTON1, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_BUTTON2, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_BUTTON3, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_BUTTON6, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_PROGRESS1, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_EDIT2, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_CHECK1, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_STATIC1, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_EDIT3, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_KEEPSIZE, 0)
EASYSIZE(IDC_BUTTON4, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_BUTTON5, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_BUTTON7, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_BUTTON8, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDOK, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDCANCEL, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_LIST1, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_EDIT4, ES_BORDER, IDC_LIST1, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_EDIT1, ES_BORDER, IDC_EDIT4, ES_BORDER, ES_BORDER, 0)
EASYSIZE(IDC_STATIC3, ES_BORDER, IDC_EDIT1, ES_BORDER, ES_KEEPSIZE, 0)
END_EASYSIZE_MAP
// CElyTranslatorDlg 消息处理程序
BOOL CElyTranslatorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//::SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); //固定窗口大小
brush.CreateSolidBrush(RGB(240, 240, 240)); //创建刷子用来改变listbox1背景色
// 获取程序所在路径
CString fPath;
GetModuleFileName(NULL, fPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
fPath.ReleaseBuffer();
int nPos;
nPos = fPath.ReverseFind('\\');
fPath = fPath.Left(nPos + 1) + _T("settings.ini"); //路径变量设置为程序所在路径的ini文件
CStdioFile file;
CFileFind finder;
if (finder.FindFile(fPath))
{
if (file.Open(fPath, CFile::modeRead)) //读取文件获取APP ID和密钥
{
CString strtemp;
while (file.ReadString(strtemp))
{
CharToUTF8(strtemp);
int i = strtemp.FindOneOf(_T("="));
if (i != std::string::npos)
{
if (strtemp.Left(i) == _T("AK"))
{
AK= strtemp.Right(strtemp.GetLength() - i - 1);
}
if (strtemp.Left(i) == _T("SK"))
{
SK = strtemp.Right(strtemp.GetLength() - i - 1);
}
if (strtemp.Left(i) == _T("CK"))
{
CK = _ttoi(strtemp.Mid(3, 1));
bExit= _ttoi(strtemp.Mid(4, 1));
}
}
}
}
file.Close();
if (bExit == 1)
{
int mOK = MessageBox(_T("检测到意外退出,是否自动恢复"), _T("提示"), MB_OKCANCEL);
if (mOK == 1)
{
CString ePath;
GetModuleFileName(NULL, ePath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
ePath.ReleaseBuffer();
int nPos;
nPos = ePath.ReverseFind('\\');
ePath = ePath.Left(nPos + 1) + _T("backup.cfg"); //路径变量设置为程序所在路径的ini文件
CFileFind finder;
if (finder.FindFile(ePath))
{
OpenFile(ePath);
}
else
{
MessageBox(_T("备份文件丢失或损坏,恢复失败"), _T("提示"), MB_OKCANCEL);
}
}
}
}
m_check.SetCheck(CK);
if (CK)
{
SetTimer(19001, 180000, NULL);
}
INIT_EASYSIZE;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CElyTranslatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CElyTranslatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CElyTranslatorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CElyTranslatorDlg::OnBnClickedButton1()
{
//通过打开文件对话框打开文件,并交给OpenFile函数处理其内容
CFileDialog filedlg(TRUE);
filedlg.m_ofn.lpstrFilter = _T("cfg(*.cfg)\0*.cfg"); //异星工厂的本地化文本格式是cfg
filedlg.m_ofn.lpstrDefExt = _T("cfg");
if (IDOK == filedlg.DoModal())
{
OpenFile(filedlg.GetPathName());
}
}
void CElyTranslatorDlg::OnLbnSelchangeList1()
{
//选择listbox的条目时,在listbox2显示原文,在edit编辑内容
int i = m1_listbox.GetCurSel();
m2_edit.SetWindowTextW(_T("原文:") + EditTranslation.ElementAt(i));
oText = EditTranslation.ElementAt(i);
m_edit.SetWindowTextW(Translated.ElementAt(i));
tIndex = i;
CString eline;
eline.Format(_T("%d"), i + 1);
m_eline.SetWindowTextW(_T("第") + eline + _T("行"));
m_edit.SetSel(0, -1, false);
m_edit.SetFocus();
//发送滚动条消息
//m1_listbox.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, pos), NULL);
}
void CElyTranslatorDlg::OnBnClickedButton2()
{
//以无BOM的UTF8格式保存汉化文件,将根据内部名称、符号、翻译后文本保存
CFileDialog filedlg(FALSE);
filedlg.m_ofn.lpstrFilter = _T("cfg(*.cfg)\0*.cfg");
filedlg.m_ofn.lpstrDefExt = _T("cfg");
if (IDOK == filedlg.DoModal())
{
SaveFile(filedlg.GetPathName());
}
}
HBRUSH CElyTranslatorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//修改listbox1的背景色
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->m_hWnd == m1_listbox.m_hWnd)
{
return (HBRUSH)brush;
}
return hbr;
}
void CElyTranslatorDlg::OnBnClickedOk()
{
//汉化当前行,将已经汉化的条目用绿色字体标注
if (InternalName.GetCount() == 0 || tIndex < 0) return;
while (Translated.GetCount() > tIndex)
{
if (!Translated.ElementAt(tIndex).IsEmpty())
{
m_edit.GetWindowTextW(Translated.ElementAt(tIndex));
m1_listbox.DeleteString(tIndex);
m1_listbox.InsertString(tIndex, InternalName.ElementAt(tIndex) + EqualSign.ElementAt(tIndex) + Translated.ElementAt(tIndex), RGB(0, 160, 60));
}
if (Translated.GetCount() == tIndex + 1)
break;
else
++tIndex;
if (!Translated.ElementAt(tIndex).IsEmpty())
{
m1_listbox.SetCurSel(tIndex);
m2_edit.SetWindowTextW(_T("原文:") + EditTranslation.ElementAt(tIndex));
oText = EditTranslation.ElementAt(tIndex);
m_edit.SetWindowTextW(Translated.ElementAt(tIndex));
int nLenth = m_edit.GetWindowTextLength();
m_edit.SetSel(0, nLenth, FALSE);
m_edit.SetFocus();
break;
}
}
}
void CElyTranslatorDlg::OnBnClickedButton3()
{
//载入老版本的汉化文件,汉化与新版一致的部分,代码与Button1相同的部分参见Button1的注释
CStringArray InternalNameOld, TranslatedOld, CategoryArrayOld;
CFileDialog filedlg(TRUE);
filedlg.m_ofn.lpstrFilter = _T("cfg(*.cfg)\0*.cfg");
filedlg.m_ofn.lpstrDefExt = _T("cfg");
if (IDOK == filedlg.DoModal())
{
CStdioFile file;
CString strtemp;
if (!file.Open(filedlg.GetPathName(), CFile::modeRead)) return; //打开*.CFG的文件,打开形式为读取
oCategory = _T("[None]");
InternalNameOld.RemoveAll();
TranslatedOld.RemoveAll();
CategoryArrayOld.RemoveAll();
//ReadString函数按行读取内容,处理每行并分类储存
while (file.ReadString(strtemp))
{
CharToUTF8(strtemp);
if (strtemp.Mid(0, 1) == _T("#")) continue;
int i = strtemp.Find(_T("="));
if (i != std::string::npos)
{
InternalNameOld.Add(strtemp.Left(i));
TranslatedOld.Add(strtemp.Right(strtemp.GetLength() - i - 1));
CategoryArrayOld.Add(oCategory);
}
else
{
if (strtemp.Mid(0, 1) == _T("["))
oCategory = strtemp;
}
}
file.Close();
//以下是将内容显示在listbox列表,内容较多时需要一定时间加载,使用进度条显示进度
m1_listbox.ResetContent();
m1_listbox.LockWindowUpdate();
LoadFileProgress.ShowWindow(SW_SHOW);
for (int i = 0; i < InternalName.GetCount(); ++i)
{
if (Translated.ElementAt(i).IsEmpty() || EqualSign.ElementAt(i).IsEmpty() || InternalName.ElementAt(i).Mid(0, 1) == (_T("[")) || InternalName.ElementAt(i).Mid(0, 1) == (_T("#")))
{
m1_listbox.AddString(InternalName.ElementAt(i), RGB(0, 0, 0));
}
else
{
int j = 0;
bool NoTranslatedOld = true;
while (j < InternalNameOld.GetCount())
{
//当两个文件对应条目的内部名称和类别都相同时则存在汉化,直接将汉化应用在新版英文文件,并用蓝色标注
if (InternalName.ElementAt(i) == InternalNameOld.ElementAt(j) && CategoryArray.ElementAt(i) == CategoryArrayOld.ElementAt(j))
{
Translated.ElementAt(i) = TranslatedOld.ElementAt(j);
m1_listbox.AddString(InternalName.ElementAt(i) + EqualSign.ElementAt(i) + Translated.ElementAt(i), RGB(0, 0, 255));
NoTranslatedOld = false;
}
++j;
}
//如果当前行不存在对应汉化,用红色标注
if (NoTranslatedOld)
m1_listbox.AddString(InternalName.ElementAt(i) + EqualSign.ElementAt(i) + Translated.ElementAt(i), RGB(255, 0, 0));
}
LoadFileProgress.SetPos(i * 100 / InternalName.GetCount());
LoadFileProgress.SetStep(1);
LoadFileProgress.StepIt();
}
LoadFileProgress.ShowWindow(SW_HIDE);
m1_listbox.UnlockWindowUpdate();
}
}
void CElyTranslatorDlg::OnBnClickedButton4()
{
// 机翻本行,通过百度翻译API进行翻译
if (AK.IsEmpty() || SK.IsEmpty())
{
CbaiduAPI dlg;
//INT_PTR nResponse = dlg.DoModal();// 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse
dlg.DoModal();
return;
}
if (oText.IsEmpty() || oText.Mid(0, 1) == (_T("#")))
{
MessageBox(_T("不翻译空行、类别行或注释行"), _T("错误"), MB_OK);
return;
}
if (oText.GetLength() * sizeof(TCHAR) > 5000)
{
MessageBox(_T("本行文本过长,百度翻译API限制为2000汉字(包含字符)"), _T("错误"), MB_OK);
return;
}
if (!EditTranslation.IsEmpty())
{
CString tText = TranslateFromBaiduFunc(oText); //调用翻译函数
if (!tText.IsEmpty())
{
//翻译成功则将当前行的已翻译内容并显示在listbox1
if(!decode_manual) UTF8toANSI(tText);
tText.Delete(tText.GetLength() - 1, 1); //删除解析前拼接的一位字符
Translated.ElementAt(tIndex) = tText;
m1_listbox.DeleteString(tIndex);
m1_listbox.InsertString(tIndex, InternalName.ElementAt(tIndex) + EqualSign.ElementAt(tIndex) + Translated.ElementAt(tIndex), RGB(0, 0, 255));
m1_listbox.SetCurSel(tIndex);
m_edit.SetWindowTextW(Translated.ElementAt(tIndex));
int nLenth = m_edit.GetWindowTextLength();
m_edit.SetSel(nLenth, nLenth, FALSE);
m_edit.SetFocus();
}
else
{
MessageBox(_T("本行翻译失败"), _T("错误"), MB_OK);
}
}
}
void CElyTranslatorDlg::OnBnClickedCancel()
{
// 增加退出提示
int bResult = MessageBox(_T("确定要退出吗,未保存的内容将会丢失"), _T("提示"), MB_OKCANCEL);
if (bResult == 1)
{
bExit = 0;
SaveSettings();
CDialogEx::OnCancel();
}
else
{
return;
}
}
void CElyTranslatorDlg::OnBnClickedButton5()
{
//打开百度翻译API配置界面
CbaiduAPI dlg;
INT_PTR nResponse = dlg.DoModal();
}
void CElyTranslatorDlg::OnBnClickedButton6()
{
// 从listbox1当前行开始搜索,找到指定文本则选中listbox1对应行
bool finded = false;
int loc = -1;
int sLoc = m1_listbox.GetCurSel() + 1;
CString SearchStr;
m_search.GetWindowTextW(SearchStr);
if (sLoc < 0)
sLoc = 0;
while (sLoc < Translated.GetCount())
{
loc = InternalName.ElementAt(sLoc).Find(SearchStr, 0);
if (loc != -1)
{
finded = true;
break;
}
loc = EditTranslation.ElementAt(sLoc).Find(SearchStr, 0);
if (loc != -1)
{
finded = true;
break;
}
loc = Translated.ElementAt(sLoc).Find(SearchStr, 0);
if (loc != -1)
{
finded = true;
break;
}
++sLoc;
}
if (finded)
{
m1_listbox.SetCurSel(sLoc);
m2_edit.SetWindowTextW(_T("原文:") + EditTranslation.ElementAt(sLoc));
oText = EditTranslation.ElementAt(sLoc);
m_edit.SetWindowTextW(Translated.ElementAt(sLoc));
tIndex = sLoc;
CString eline;
eline.Format(_T("%d"), sLoc + 1);
m_eline.SetWindowTextW(_T("第") + eline + _T("行"));
}
else
{
MessageBox(_T("下文中未找到:") + SearchStr, _T("提示"), MB_OK);
}
}
BOOL CElyTranslatorDlg::PreTranslateMessage(MSG* pMsg)
{
// 捕获回车消息,如果焦点是指定edit控件则执行对应功能
if (WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
if (GetFocus() == GetDlgItem(IDC_EDIT3)) //根据不同控件焦点判断是那个在执行
{
UpdateData(TRUE);
OnBnClickedButton6();
}
if (GetFocus() == GetDlgItem(IDC_EDIT1)) //根据不同控件焦点判断是那个在执行
{
UpdateData(TRUE);
OnBnClickedOk();
}
//MessageBox(_T("捕捉到了回车!"));
return true;
}
if (WM_KEYDOWN == pMsg->message && VK_UP == pMsg->wParam)
{
if (GetFocus() == GetDlgItem(IDC_EDIT1)) //根据不同控件焦点判断是那个在执行
{
UpdateData(TRUE);
if (tIndex > 0)
{
--tIndex;
m1_listbox.SetCurSel(tIndex);
m2_edit.SetWindowTextW(_T("原文:") + EditTranslation.ElementAt(tIndex));
oText = EditTranslation.ElementAt(tIndex);
m_edit.SetWindowTextW(Translated.ElementAt(tIndex));
CString eline;
eline.Format(_T("%d"), tIndex + 1);
m_eline.SetWindowTextW(_T("第") + eline + _T("行"));
m_edit.SetSel(0, -1, false);
m_edit.SetFocus();
}
}
//MessageBox(_T("捕捉到了回车!"));
return true;
}
if (WM_KEYDOWN == pMsg->message && VK_DOWN == pMsg->wParam)
{
if (GetFocus() == GetDlgItem(IDC_EDIT1)) //根据不同控件焦点判断是那个在执行
{
UpdateData(TRUE);
if (tIndex < m1_listbox.GetCount() - 1)
{
++tIndex;
m1_listbox.SetCurSel(tIndex);
m2_edit.SetWindowTextW(_T("原文:") + EditTranslation.ElementAt(tIndex));
oText = EditTranslation.ElementAt(tIndex);
m_edit.SetWindowTextW(Translated.ElementAt(tIndex));
CString eline;
eline.Format(_T("%d"), tIndex + 1);
m_eline.SetWindowTextW(_T("第") + eline + _T("行"));
m_edit.SetSel(0, -1, false);
m_edit.SetFocus();
}
}
//MessageBox(_T("捕捉到了回车!"));
return true;
}
//捕获F5,F5是机翻本行快捷键
if (WM_KEYDOWN == pMsg->message && VK_F5 == pMsg->wParam)
{
OnBnClickedButton4();
return true;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CElyTranslatorDlg::OnBnClickedButton7()
{
//复制原文,把当前行的原文复制到剪贴板
if (OpenClipboard() && m2_edit.GetWindowTextLengthW() > 0)
{
EmptyClipboard();
int nLen = (oText.GetLength() + 1) * sizeof(WORD);
HGLOBAL cbuff = GlobalAlloc(GMEM_MOVEABLE, nLen);
if (cbuff != 0)
{
char* buffer = (char*)GlobalLock(cbuff);
int len = WideCharToMultiByte(CP_ACP, 0, oText, oText.GetLength(), NULL, 0, NULL, NULL);
char* pBuff = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, oText, oText.GetLength(), pBuff, len, NULL, NULL);
pBuff[len] = '\0';
if (buffer != 0 && pBuff != 0)
{
strcpy_s(buffer, nLen, pBuff);
}
GlobalUnlock(cbuff);
SetClipboardData(CF_TEXT, cbuff);
}
CloseClipboard();
}
}
void CElyTranslatorDlg::OnDropFiles(HDROP hDropInfo)
{
// 接受拖拽文件
int fCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
if (fCount > 1)
{
MessageBox(_T("请拖入单个文件"), _T("提示"), MB_OK);
return;
}
TCHAR fPath[MAX_PATH];
CString filepath;
DragQueryFile(hDropInfo, 0, fPath, _countof(fPath));
CString extension;
filepath.Format(L"%s", fPath);
extension = filepath.Right(filepath.GetLength() - filepath.ReverseFind('.') - 1);
if (extension != _T("cfg"))
{
MessageBox(_T("请拖入异星工厂MOD的.cfg文件"), _T("提示"), MB_OK);
return;
}
DragFinish(hDropInfo);
OpenFile(filepath);
CDialogEx::OnDropFiles(hDropInfo);
}
void CElyTranslatorDlg::OpenFile(CString filepath)
{
//读取需要汉化的cfg文件
//将UTF8转换为多字节格式,对文本进行处理把内部名称、显示文本和符号分别存储,并将全部内容显示在listbox列表
//InternalName的CStringArray字符串数组是内部名称,EditTranslation是待翻译原文,Translated是翻译后文本,EqualSign是本行符号,CategoryArray是本行类别
//关于类别,同一物品的item-name物品名称、item-description物品描述的内部名称是相同的,通过记录其类别加以区分,对于没有类别的条目默认为None
CStdioFile file;
CString strtemp;
if (!file.Open(filepath, CFile::modeRead)) return; //打开*.CFG的文件,打开形式为读取
//初始化相关变量和界面,以载入新的文件
m1_listbox.ResetContent();
InternalName.RemoveAll();
EditTranslation.RemoveAll();
Translated.RemoveAll();
EqualSign.RemoveAll();
CategoryArray.RemoveAll();
oCategory = _T("[None]");
//ReadString函数按行读取内容,处理每行并分类储存
while (file.ReadString(strtemp))
{
CharToUTF8(strtemp);
if (strtemp.Mid(0, 1) == _T("#")) continue; //如果本行第一个字符是#,那么本行是注释行直接略过
int i = strtemp.Find(_T("=")); //查找本行是否有=,如果有第一个=左边是内部名称,右边是需要汉化的文本
if (i == std::string::npos)
{
if (strtemp.Mid(0, 1) == _T("[")) //如果本行第一个字符是[,那么本行是类别行,后续行属于本类别
oCategory = strtemp;
InternalName.Add(strtemp);
EditTranslation.Add(strtemp);
Translated.Add(_T(""));
EqualSign.Add(_T(""));
CategoryArray.Add(_T(""));
}
else
{
InternalName.Add(strtemp.Left(i));
EditTranslation.Add(strtemp.Right(strtemp.GetLength() - i - 1));
Translated.Add(strtemp.Right(strtemp.GetLength() - i - 1));
EqualSign.Add(_T("="));
CategoryArray.Add(oCategory);
}
}
//以下是将内容显示在listbox列表,内容较多时需要一定时间加载,使用进度条显示进度
m1_listbox.LockWindowUpdate();
LoadFileProgress.ShowWindow(SW_SHOW);
for (int i = 0; i < InternalName.GetCount(); ++i)
{
if (Translated.ElementAt(i).IsEmpty() || EqualSign.ElementAt(i).IsEmpty() || InternalName.ElementAt(i).Mid(0, 1) == (_T("[")) || InternalName.ElementAt(i).Mid(0, 1) == (_T("#")))
m1_listbox.AddString(InternalName.ElementAt(i), RGB(0, 0, 0));
else
m1_listbox.AddString(InternalName.ElementAt(i) + EqualSign.ElementAt(i) + Translated.ElementAt(i), RGB(0, 0, 0));
LoadFileProgress.SetPos(i * 100 / InternalName.GetCount());
LoadFileProgress.SetStep(1);
LoadFileProgress.StepIt();
}
LoadFileProgress.ShowWindow(SW_HIDE);
m1_listbox.UnlockWindowUpdate();
file.Close();
}
void CElyTranslatorDlg::SaveFile(CString filepath)
{
CStdioFile file;
file.Open(filepath, CFile::modeCreate | CFile::modeWrite); //以创建\写入模式打开文件
for (int i = 0; i < Translated.GetCount(); ++i)
{
//写入utf8的BOM头的代码,异星工厂文本一般不带BOM头
//ULONGLONG dwFileLen = file.GetLength();
//if (0 == dwFileLen)
//{
// const unsigned char LeadBytes[] = { 0xEF, 0xBB, 0xBF };
// file.Write(LeadBytes, sizeof(LeadBytes));
//}
CString strtemp; //缓存本行将要写入的内容
if (Translated.ElementAt(i).IsEmpty() || EqualSign.ElementAt(i).IsEmpty() || InternalName.ElementAt(i).Mid(0, 1) == (_T("[")) || InternalName.ElementAt(i).Mid(0, 1) == (_T("#")))
strtemp = InternalName.ElementAt(i);
else
strtemp = InternalName.ElementAt(i) + EqualSign.ElementAt(i) + Translated.ElementAt(i);
//-------以下是将Unicode字符转为utf-8字符,这样才能正常显示中文
int nSrcLen = (int)wcslen(strtemp);
CStringA utf8String(strtemp);
int nBufLen = (nSrcLen + 1) * 6;
//下面的函数AtlUnicodeToUTF8()需头文件:<atlenc.h>
LPSTR buffer = utf8String.GetBufferSetLength(nBufLen);
int nLen = AtlUnicodeToUTF8(strtemp, nSrcLen, buffer, nBufLen);
buffer[nLen] = 0;
utf8String.ReleaseBuffer();
file.SeekToEnd();
//将转码后的内容写入文件
file.Write(utf8String.GetBuffer(), nLen);
file.Write("\n", 1);
}
file.Close();
}
void CElyTranslatorDlg::SaveSettings()
{
CString fPath;
GetModuleFileName(NULL, fPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
fPath.ReleaseBuffer();
int nPos;
nPos = fPath.ReverseFind('\\');
fPath = fPath.Left(nPos + 1) + _T("settings.ini");
//将获取的AK和SK存放到程序目录的key.ini文件
CStdioFile file;
file.Open(fPath, CFile::modeCreate | CFile::modeWrite);
//将转码后的内容写入文件
CString strtemp = _T("AK=") + AK;
int nSrcLen = (int)wcslen(strtemp);
CStringA utf8String1(strtemp);
int nBufLen = (nSrcLen + 1) * 6;
//下面的函数AtlUnicodeToUTF8()需头文件:<atlenc.h>
LPSTR buffer = utf8String1.GetBufferSetLength(nBufLen);
int nLen = AtlUnicodeToUTF8(strtemp, nSrcLen, buffer, nBufLen);
buffer[nLen] = 0;
utf8String1.ReleaseBuffer();
file.Write(utf8String1.GetBuffer(), nLen);
file.Write("\n", 1);
strtemp = _T("SK=") + SK;
nSrcLen = (int)wcslen(strtemp);
CStringA utf8String2(strtemp);
nBufLen = (nSrcLen + 1) * 6;
//下面的函数AtlUnicodeToUTF8()需头文件:<atlenc.h>
buffer = utf8String2.GetBufferSetLength(nBufLen);
nLen = AtlUnicodeToUTF8(strtemp, nSrcLen, buffer, nBufLen);
file.Write(utf8String2.GetBuffer(), nLen);
file.Write("\n", 1);
CString cCK, cExit;
cCK.Format(_T("%d"), CK);
cExit.Format(_T("%d"), bExit);
strtemp = _T("CK=") + cCK + cExit;
nSrcLen = (int)wcslen(strtemp);
CStringA utf8String3(strtemp);
nBufLen = (nSrcLen + 1) * 6;
//下面的函数AtlUnicodeToUTF8()需头文件:<atlenc.h>
buffer = utf8String3.GetBufferSetLength(nBufLen);
nLen = AtlUnicodeToUTF8(strtemp, nSrcLen, buffer, nBufLen);
file.Write(utf8String3.GetBuffer(), nLen);
file.Close();
}
void CElyTranslatorDlg::OnBnClickedButton8()
{
// 打开关于界面
CAboutDlg dlg;
dlg.DoModal();
}
void CElyTranslatorDlg::OnBnClickedCheck1()
{
// 启动或关闭自动备份
CK = m_check.GetCheck();
if (CK)
{
SetTimer(19001, 180000, NULL);
MessageBox(_T("自动备份已开启,汉化进度每3分钟会备份到程序目录的backup.cfg文件,可以手动打开恢复。如果意外退出,再次启动时将会自动提示恢复。"), _T("提示"), MB_OK);
}
else
{
KillTimer(19001);
}
bExit = 1;
SaveSettings();
}
void CElyTranslatorDlg::OnTimer(UINT_PTR nIDEvent)
{
// 按时处理自动备份
if (nIDEvent == 19001)
{
CString fPath;
GetModuleFileName(NULL, fPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
fPath.ReleaseBuffer();
int nPos;
nPos = fPath.ReverseFind('\\');
fPath = fPath.Left(nPos + 1) + _T("backup.cfg"); //路径变量设置为程序所在路径的ini文件
SaveFile(fPath);
}
bExit = 1;
SaveSettings();
CDialogEx::OnTimer(nIDEvent);
}
void CElyTranslatorDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// 改变窗口大小时更新控件位置
UPDATE_EASYSIZE;
}
void CElyTranslatorDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialogEx::OnSizing(fwSide, pRect);
// 限制窗口大小的最小值
EASYSIZE_MINSIZE(800, 600, fwSide, pRect);
}
C++
1
https://gitee.com/elysiumworks/ElyTranslator.git
git@gitee.com:elysiumworks/ElyTranslator.git
elysiumworks
ElyTranslator
异星工厂MOD汉化工具
master

搜索帮助