gpt4 book ai didi

c++ - 用于解析资源 (.rc) 文件的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:42 31 4
gpt4 key购买 nike

最终我只是想从 .rc 文件中提取字符串以便我可以翻译它们,但是任何与 .rc 文件一起使用的东西都对我有用。

最佳答案

我会考虑使用 gettext.PO files , 如果你的程序符合 GNU 许可证

1) 我建议使用状态机算法从 .rc 文件中提取。

void ProcessLine(const char * str)
{
if (strstr(str, " DIALOG"))
state = Scan;
else if (strstr(str, " MENU"))
state = Scan;
else if (strstr(str, " STRINGTABLE"))
state = Scan;
else if (strstr(str, "END"))
state = DontScan;

if (state == Scan)
{
const char * cur = sLine;
string hdr = ...// for example "# file.rc:453"
string msgid;
string msgid = "";
while (ExtractString(sLine, cur, msgid))
{
if (msgid.empty())
continue;
if (IsPredefined(msgid))
continue;
if (msgid.find("IDB_") == 0 || msgid.find("IDC_") == 0)
continue;
WritePoString(hdr, msgid, msgstr);
}
}
}

2) 在 ExtractString() 中提取字符串时,你应该考虑到 char "表示为 "",还有像\t\n\r 这样的字符。所以状态机在这里也是一个不错的选择。

以下字符串:

LTEXT           "Mother has washed ""Sony"", then \taquarium\\shelves\r\nand probably floors",IDC_TEXT1,24,14,224,19

在对话框中表示这样的标签:

Mother has washed "Sony", then aquarium\shelves
and probably floors

3) 然后在程序启动时,您应该通过 gettext 加载 .po 文件,并为每个对话框在启动时使用如下函数翻译其字符串:

int TranslateDialog(CWnd& wnd)
{
int i = 0;
CWnd *pChild;
CString text;

//Translate Title
wnd.GetWindowText(text);
LPCTSTR translation = Translate(text);
window.SetWindowText(translation);

//Translate child windows
pChild=wnd.GetWindow(GW_CHILD);
while(pChild)
{
i++;
Child->GetWindowText(Text);//including NULL
translation = Translate(Text);
pChild->SetWindowText(translation);
pChild = pChild->GetWindow(GW_HWNDNEXT);
}
return i;
}

关于c++ - 用于解析资源 (.rc) 文件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53599/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com