DevExpressWinForm控件汉化方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DevExpressWinForm控件汉化⽅法
使⽤DevExpress控件开发时,汉化⼀直是⼀个很纠结的问题,各种⽅法均存在很多不⾜,在此不作评论。
现将本⼈实际使⽤中找到的⽅法提出共享,多提宝贵意见。
⼀、本地化对象。
DevExpress的⽂档中列出的是14个。
Product Localizer Class Resource String Enumeration
XtraBars BarLocalizer BarString
XtraCharts ChartLocalizer ChartStringId
XtraEditors Localizer StringId
XtraGauges GaugeCoreLocalizer GaugeCoreStringId
XtraGrid GridLocalizer GridStringId
XtraLayoutControl LayoutLocalizer LayoutStringId
XtraNavBar NavBarLocalizer NavBarStringId
XtraPivotGrid PivotGridLocalizer PivotGridStringId
XtraPrinting PreviewLocalizer PreviewStringId
XtraReports ReportLocalizer ReportStringId
XtraScheduler SchedulerLocalizer SchedulerStringId
XtraSpellChecker SpellCheckerLocalizer SpellCheckerStringId
XtraTreeList TreeListLocalizer TreeListStringId
XtraVerticalGrid VGridLocalizer VGridStringId
另外还有:
DevExpress.Accessibility.AccLocalizer AccStringId
DevExpress.XtraRichEdit.Localization.XtraRichEditLocalizer XtraRichEditStringId
DevExpress.XtraWizard.Localization.WizardLocalizer WizardStringId
DevExpress.XtraScheduler.Localization.SchedulerExtensionsLocalizerSchedulerExtensionsStringId
DevExpress.XtraRichEdit.Localization.RichEditExtensionsLocalizer RichEditExtensionsStringId
⼆、资源字符串枚举。
需要确切取得所有的Resource String Enumeration成员及其值(英语),才能汉化。
⾸先可以到源码中查找,如可以在C:\Program Files (x86)\DevExpress 2011.2\Components\Sources\DevExpress.XtraBars\DevExpress.XtraBars中找到Localizer.cs⽂件,有⼀个protected override void PopulateStringTable()过程,⾥⾯的代码是加⼊枚举字符串的值:
AddString(BarString.None, "");
AddString(BarString.PopupMenuEditor, "Popup Menu Editor");
AddString(BarString.AddOrRemove, "&Add or Remove Buttons");
AddString(BarString.ResetBar, "Are you sure you want to reset the changes made to the '{0}' toolbar?");
AddString(BarString.ResetBarCaption, "Customize");
AddString(BarString.ResetButton, "&Reset Toolbar");
AddString(BarString.CustomizeButton, "&Customize ...");
AddString(BarString.ToolBarMenu, "&Reset$&Delete$!&Name$!Defau< style$&Text Only (Always)$Text &Only (in Menus)$" + "Image &and Text$!Begin a &Group$&Visible$&Most recently used");
AddString(BarString.ToolbarNameCaption, "&Toolbar Name:");
AddString(BarString.NewToolbarCaption, "New Toolbar");
AddString(BarString.NewToolbarCustomNameFormat, "Custom {0}");
AddString(BarString.NewMenuName, "Main menu");
AddString(BarString.NewToolbarName, "Tools");
AddString(BarString.NewStatusBarName, "Status bar");
AddString(BarString.RenameToolbarCaption, "Rename Toolbar");
AddString(BarString.CustomizeWindowCaption, "Customization");
AddString(BarString.MenuAnimationSystem, "(System default)");
也就是说,如果你可以重新编译源码,可以直接在这⾥翻译后编译。
当然本⼈未采⽤这种⽅法。
但是不同的控件使⽤的程序⽂件名不太⼀致,或是位置不太⼀致,所以有的也不太好找,或是不全。
后来发现每个Localizer ⼀般会提供⼀个CreateDefaultLocalizer.WriteToXml⽅法,但XtraPivotGrid控件的好象没有,还好⼜找到⼀个Localizer.Active.WriteToXml可能⽤,效果相同。
试着导出⼀看是这样的:
<?xml version="1.0" encoding="utf-8"?>
<root>
<data name="BarString.None">
<value>
</value>
</data>
<data name="BarString.PopupMenuEditor">
<value>Popup Menu Editor</value>
</data>
<data name="BarString.AddOrRemove">
<value>&Add or Remove Buttons</value>
</data>
<data name="BarString.ResetBar">
<value>Are you sure you want to reset the changes made to the '{0}' toolbar?</value>
</data>
<data name="BarString.ResetBarCaption">
<value>Customize</value>
</data>
<data name="BarString.ResetButton">
<value>&Reset Toolbar</value>
</data>
<data name="BarString.CustomizeButton">
<value>&Customize ...</value>
</data>
......
⽤这个⽅法导出所有字符串枚举名称及值到.XML⽂件中。
三、翻译。
上⾯的内容有了,剩下就是翻译了,我相信⼤家都会想,不会这么全都重新开始吧,当然,原来可⽤资源应当⽤上才对。
如官⽅汉化。
我是这样做的,如下:
(1)在数据库建⽴⼀个表,包括name,EN(原⽂,英语),CN(中⽂简体),TW(中⽂繁体)等字段。
将上述XML⽂件内容全部导⼊。
(2)编写⼀段代码。
将官⽅汉化的资源⽂件的内容取出(当然是不全啦)。
我写的是VB代码,谨供参考啦(如有需要C#请⾃⼰改⼀下吧)。
Private Sub SimpleButton1_Click(sender As System.Object, e As System.EventArgs) Handles SimpleButton1.Click
OpenFileDialog1.Filter = "resx⽂件|*.resx"
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
resxfilename = OpenFileDialog1.FileName
rsxr = New ResXResourceReader(resxfilename)
If Not IsNothing(rsxr) Then
resxdt = getDTread("SELECT * FROM Localizer WHERE name LIKE '" & TextEdit1.Text.Trim & "%' AND CN='' ORDER BY ID")
‘getDTread是读取表过程。
Dim d As DictionaryEntry
Dim s As Integer = 0
Dim dtrow() As DataRow
Dim cr As Integer = -1
MemoEdit1.Text = ""
Dim str As String = ""
For Each d In rsxr
If InStr(d.Key.ToString, TextEdit1.Text.Trim) > 0 Then
dtrow = resxdt.Select("name ='" & d.Key.ToString & "'")
If dtrow.Length > 0 Then
cr = resxdt.Rows.IndexOf(dtrow(0))
If cr >= 0 Then
resxdt.Rows(cr).Item("CN") = d.Value.ToString()
s += 1
str += d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString() + Chr(13) + Chr(10)
End If
End If
End If
Next d
MemoEdit1.Text = str
If s > 0 Then
getDTsave("Localizer", 1, resxdt.GetChanges)
‘getDTsave是提交表过程
End If
XXshow("共" & s.ToString.Trim & "⾏", Me)
MemoEdit1.Focus()
End If
rsxr.Close()
End Sub
在打开⽂件对话框中找到官⽅汉化包中的LocalizationRes.zh-CHS.resx ⽂件,把已经有的汉化内容存⼊数据库表中。
可以同时将繁体中⽂(LocalizationRes.zh-CHT.resx)也取出存⼊,便于以后使⽤或⽤来参照,并且它还⽐简体中⽂内容多⼀些,但也缺很多。
这样处理之后,完成了⼀半左右。
(3)查询未经翻译的记录并导⼊到EXCEL⽂件。
这样在参考繁体时可以块复制再简繁体转换,同时利于使⽤使⽤bing翻译,⽅法是将英⽂列块复制到WORD⽂档中,然使⽤WORD的全⽂翻译,之后在⽹页复制结果可成块粘贴到EXCEL中,之后再修改。
四、对象汉化代码。
编写下列代码(⽰例)。
重写GetLocalizedString⽅法。
Imports System.Resources
Imports System.Reflection
Imports DevExpress.XtraBars
Imports DevExpress.XtraBars.Localization
Public Class XLocallizerBar
Inherits DevExpress.XtraBars.Localization.BarLocalizer
Public Overrides ReadOnly Property Language() As String
Get
Return "Chinese"
End Get
End Property
Public Overrides Function GetLocalizedString(ByVal id As DevExpress.XtraBars.Localization.BarString) As String Dim ret As String = ""
Select Case id
Case BarString.AddOrRemove : Return "添加或删除按钮(&A)" '&Add or Remove Buttons
Case BarString.BarAllItems : Return "(所有项)" '(All Items)
Case BarString.BarUnassignedItems : Return "(未设定项)" '(Unassigned Items)
Case BarString.CloseButton : Return "关闭" 'Close
Case BarString.CustomizeButton : Return "⾃定义(&C)..." '&Customize ...
Case BarString.CustomizeRibbon : Return "⾃定义功能区(&R)..." 'Customize the &Ribbon...
Case BarString.CustomizeWindowCaption : Return "⾃定义" 'Customization
Case BarString.HelpButton : Return "帮助" 'Help
Case BarString.MaximizeButton : Return "最⼤化" 'Maximize
Case BarString.RenameToolbarCaption : Return "重命名⼯具栏" 'Rename Toolbar
Case BarString.ResetBarCaption : Return "⾃定义" 'Customize
......
Case Else
ret = id.ToString
End Select
Return ret
End Function
End Class
其中的CASE语句从数据库查询⾃动⽣成,⽣成时带上原⽂,便于以后修改:
SELECT 'CASE '+name+': RETURN "' + CN + '" '''+EN as case语句
FROM Localizer where name LIKE 'BarString%'
ORDER BY name;
五、完成Localizer的替换。
在主程序中加⼊下列代码:
DevExpress.Accessibility.AccLocalizer.Active = New XLocallizerAcc
DevExpress.XtraBars.Localization.BarLocalizer.Active = New XLocallizerBar
DevExpress.XtraCharts.Localization.ChartLocalizer.Active = New XLocallizerCharts
DevExpress.XtraEditors.Controls.Localizer.Active = New XLocallizerEditors
DevExpress.XtraGauges.Core.Localization.GaugesCoreLocalizer.Active = New XLocallizerGauges
DevExpress.XtraGrid.Localization.GridLocalizer.Active = New XLocallizerGrid
youtLocalizer.Active = New XLocallizerLayout
DevExpress.XtraNavBar.NavBarLocalizer.Active = New XLocallizerNavBar
DevExpress.XtraPivotGrid.Localization.PivotGridLocalizer.Active = New XLocallizerPivotGrid
DevExpress.XtraPrinting.Localization.PreviewLocalizer.Active = New XLocallizerPrinting
DevExpress.XtraReports.Localization.ReportLocalizer.Active = New XLocallizerReports
DevExpress.XtraRichEdit.Localization.XtraRichEditLocalizer.Active = New XLocallizerRichEdit
DevExpress.XtraRichEdit.Localization.RichEditExtensionsLocalizer.Active = New XLocallizerRichEditExtensions
DevExpress.XtraScheduler.Localization.SchedulerLocalizer.Active = New XLocallizerScheduler
DevExpress.XtraScheduler.Localization.SchedulerExtensionsLocalizer.Active = New XLocallizerSchedulerExtensions DevExpress.XtraSpellChecker.Localization.SpellCheckerLocalizer.Active = New XLocallizerSpellChecker
DevExpress.XtraTreeList.Localization.TreeListLocalizer.Active = New XLocallizerTreeList
DevExpress.XtraVerticalGrid.Localization.VGridLocalizer.Active = New XLocallizerVerticalGrid
DevExpress.XtraWizard.Localization.WizardLocalizer.Active = New XLocallizerWizard
总结。
这种看上去⿇烦,实际⽐较简单实⽤,后⾯发现错误时,可在源代码中搜索并替换,⽐较⽅便。
当然其他⽅法也可以使⽤。
由于本⼈是开发⼯程中完成的,代码也⽐较长,所以暂时不能提供完整的程序包,如果⽹友有需要,请在留⾔中留下QQ号码,可以提供源码。
⽂中有哪些错漏,亦请各位指正。
在DEVEXPRESS使⽤中,发现功能确实不错,便运⾏速度还是很慢,不知哪位有好的办法吗?。