VB.Net Form已设置localization如何删除及运行时切换语言问题咨询
VB.Net 本地化问题解决方案
问题1:删除本地化资源文件的正确操作
误删附属语言资源文件导致设计器报错,本质是窗体设计器代码中仍残留对应语言的资源引用,正确操作步骤如下:
- 不要直接删除资源文件,先打开目标窗体设计器,在属性面板将
Language属性切换回Default,保存当前默认语言的界面配置。 - 打开项目资源管理器,找到对应窗体的附属语言资源文件(命名格式为
窗体名.语言代码.resx,例如Form1.zh-CN.resx),右键直接删除即可,无需手动修改设计器自动生成的代码。 - 若已误删导致设计器无法加载,按以下步骤修复:
- 右键窗体文件选择「查看设计器代码」,搜索已删除语言对应的资源键,删除所有相关的
resources.ApplyResources调用、对应语言的资源对象声明。 - 关闭所有窗体设计器页面,重启Visual Studio后重新加载项目,将窗体
Language属性重置为Default后再次保存即可恢复,无需回滚整个项目。
- 右键窗体文件选择「查看设计器代码」,搜索已删除语言对应的资源键,删除所有相关的
问题2:运行时全局动态切换语言的实现方法
原有代码只更新控件直接属性,是因为ApplyResources默认不会递归处理控件内部子对象,也未主动应用窗体自身的资源,无需全量手动遍历所有对象的实现方案如下:
- 切换语言前先修改当前线程的全局区域配置,这是全应用生效的基础:
Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(lang) Threading.Thread.CurrentThread.CurrentCulture = New CultureInfo(lang)
- 调用
ComponentResourceManager自带的资源应用逻辑,无需手写全量遍历:
Dim resources As New ComponentResourceManager(GetType(你的窗体类名)) ' 应用窗体自身资源,解决标题不更新问题 resources.ApplyResources(Me, "$this") ' 遍历所有控件并自动应用资源,特殊控件的子对象单独适配即可 For Each c As Control In Me.Controls resources.ApplyResources(c, c.Name) ' 适配ListView列头 If TypeOf c Is ListView Then For Each col As ColumnHeader In CType(c, ListView).Columns resources.ApplyResources(col, col.Name) Next End If ' 其他带内部子对象的控件(如MenuStrip、ToolStrip)可参照上述逻辑适配 Next
- 若需要全应用所有窗体同步切换,可在公共切换方法中遍历
Application.OpenForms集合,对每个已打开的窗体执行上述逻辑即可;后续新打开的窗体会自动读取当前线程的CurrentUICulture加载对应语言资源,无需额外处理。
内容的提问来源于stack exchange,提问作者ByteCarp
相关产品推荐
相关产品推荐

