我有一个对我有用的程序,但文档和所有工具提示都是我无法阅读的语言。源代码可用,整个过程大约有84,000行代码。我的问题是,是否有一种方法可以导出或抓取工具提示文本,按钮文本,最终用户在任何可读消息中显示的内容,以便轻松翻译文本?
答案 0 :(得分:1)
一种可能的方法是使用知道如何转换VB6程序的东西。它需要解析VB6,拉出所有文字文本字符串,提供给你翻译,并用你的替换代替原始字符串。实际上,你需要两个传递,第一个产生一个集合,使你能够翻译感兴趣的,第二个来代替你指定的翻译,如果有的话。您可能需要进行一些调试,因为通常会有一些东西取决于字符串大小。
如何将字符串从一种语言转换为另一种语言取决于您。正如其他海报所建议的那样,您可以使用在线翻译并获取您所获得的内容。如果你有一个人,我希望你会做得更好。它们通常只需要关注字符串的含义,因为它们是从代码中提取的,但是您也会发现转换取决于代码的作用,因此程序员需要参与其中。
我们的DMS Software Reengineering Toolkit及其Visual Basic Front End可以轻松配置为执行此操作。 DMS提供通用的解析和转换机制; VB前端提供了有关Visual Basic 6的详细信息(在您的情况下)。
这个想法的一个变体是用引用“资源”(相当于由字符串编号索引的查找表)替换翻译的文字字符串,其中包含原始(法语)或新(英语)。这种解决方案产生的东西接近人们做国际化的想法。 (这不会考虑日期和货币格式;那些需要数据流分析来确定导致/来自日期或货币操作的计算。虽然文字字符串转换不需要,但DMS提供流量分析,因此可以配置为执行这也是。)
如果您有关于文本中字符串位置的精确信息(例如,起始行/列,结束行/列),您可以采用另一种方式:使用该精确信息提取字符串,然后使用重新插入翻译的相同精确信息。为了避免损坏字符串位置,您应该首先从每个文件的末尾开始替换字符串,然后在文件中向后工作。这应该可以直接在文本缓冲区上进行。
我们的Source Code Search Engine (SCSE)可用于轻松查找此类字符串及其位置。 SCSE根据其词法结构索引源代码(因此完全看到字符串文字),然后所有允许跨源代码查询任意序列的标记。它使用DMS的语言前端(为了您的目的,VB6前端)准确地挑选出词汇。
有人可能会寻找一个为一个变量分配超过10(使用范围约束)的变量的名称,该变量的名称包含X(使用通配符),并带有如下查询:
I=*x* '=' N>10
SCSE将找到所有匹配项,显示匹配项,并通过一次单击启用查看源代码中的匹配项。
您要查找文字字符串的查询非常简单:
S=*
意思是“找不到内容的所有字符串”。您可以打开SCSE日志记录,它会将所有匹配的列表以及精确的位置写入日志文件。在这一点上,您拥有所有精确的字符串信息。 (SCSE不能进行流量分析,所以它无法帮助国际化日期以及DMS可以,但它可以找到
N 'mod' 4 '==' 0
模式,往往是闰年调整。)
答案 1 :(得分:0)
我没有完美的建议,但它可能是你最好的镜头:使用文档翻译并让自己亲近。然后编译新的源代码,看看有什么中断。很可能它会忽略那些不正确的词(比如btnOK等)
有很多网站都使用谷歌翻译。这是我选择的一个随机的:
http://www.onlinedoctranslator.com/
如果您想构建自己的翻译器,可以查看此CodeProject文章:
http://www.codeproject.com/KB/IP/GoogleTranslator.aspx
我知道这不在您的初始问题的范围内,但由于使用翻译器可能是您的最佳选择,也许您可以构建一些东西以使其更好地工作。
答案 2 :(得分:0)
一个选项是
答案 3 :(得分:0)
只是我的2c。源代码文本的自动翻译非常有问题。基本上,它只是不能很好地工作。为什么不?语境。要使自动翻译器运行良好,它必须具有一定的上下文。但是当你谈论源代码文本时,你会谈论一些文本片段,这些片段要么没有明显的上下文,要么通过代码串联在一起,因此会松开它们的上下文。
你会从自动翻译中获得“某些东西”,但它几乎可以保证让母语使用者发出讽刺,或者2)抓住他们的头脑,想知道按钮标题意味着什么......
答案 4 :(得分:0)
如果你打开一个VB6 .frm文件,你会在顶部看到所有表单控件,如下摘录:
Begin VB.Frame frShipmentDetails
BackColor = &H00FFC0C0&
Caption = "Shipment Details by Part"
BeginProperty Font
Name = "Verdana"
Size = 9.75
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H000000C0&
Height = 2895
Left = 480
TabIndex = 28
Top = 6960
Width = 10935
请注意,它只是一个名称/值对。在VB6中,您通常会寻找Caption
和ToolTip
等属性。一个简单的grep将为您提供一个好的开始列表。如果需要,您可以通过一些自动技术翻译器运行结果,或者将其发送给真正的技术翻译人员(虽然它们很昂贵)。
然而,有两个非常重要的注意事项:
首先,应用程序中可能有一些代码如下:
If a = b Then
lblSomeLabel.Caption = "yes"
Else
lblSomeLabel.Caption = "no"
End If
...在这种情况下,它不再是静态文本,而是动态的。
更糟糕的是,您有时会在某个事件处理程序中找到它:
If lblSomeLabel.Caption = "yes" Then
... do something ...
End If
这意味着即使你修改了设置标题的第一行,你也会破坏你进行比较的后一行。相信我,这在VB6代码中发生了很多。
之前我已经完成了从英语到西班牙语的VB6应用程序的翻译。谨防。这比你初想的要多得多。
正确的方法是找到所有这些字符串,将它们放在某种查找表中(每个目标语言有一列),并且每次都进行查找。