我目前正在开发一个必须支持 6 种不同语言的项目。我已经有了一个工作实现,使用字符串的资源文件和控件的表单本地化。实现的最后一部分涉及在程序运行时实时更改语言。我已经看到了有关如何执行此操作的建议,最终我使用了 ApplyResources 方法的修改版本。一般来说,我说的是这样的事情:
ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
CultureInfo culture = new CultureInfo("fr-FR");
resources.ApplyResources(_mybutton, _mybutton.Name, culture);
因此,按钮“_mybutton”文本将更改为法语本地化版本。这适用于我所有的表单和控件,除了特定的 ListView 控件。此 ListView 有 5 列对象类型 ColumnHeader。我正在尝试使用 ApplyResources 将列标题的文本更改为新语言。我已经在 .fr.resx 资源文件中为列标题添加了适当的法语文本,当我将表单本地化切换为法语时,Designer View 会向我显示法语翻译版本,正如预期的那样。
更进一步,我尝试在构造函数中表单的 InitializeComponent() 方法之前将全局线程 currentUICulture 属性更改为法语。我验证这将为列表视图中的列标题加载正确的法语资源。
但是,当我尝试手动将区域性应用于 ColumnHeader/ListView 资源时,就会出现问题。例如,我会说代码看起来大致如下:
ComponentResourceManager resources = new ComponentResourceManager(typeof(myUserControl));
CultureInfo culture = new CultureInfo("fr-FR");
resources.ApplyResources(_myListView, _myListView.Name, culture);
resources.ApplyResources(_myColumnHeader1, _myColumnHeader1.Name, culture);
this.Refresh();
无论我尝试什么,我都无法将法语资源应用于列标题文本。我也试过:
resources.ApplyResources(_myListView.Columns[0], _myListView.Columns[0].Name, culture);
在 stackoverflow 上搜索解决方案后,我尝试了类似的方法:
var lv = (ListView)_myListView;
foreach (ColumnHeader col in lv.Columns)
{
resources.ApplyResources(col, col.Name, culture);
}
相同的效果 - 没有语言变化。我查看了 Designer.cs 代码,看看是否有任何关键的差异或我遗漏的行,看起来我做得正确。所有其他控件都正确更改语言,但我的列表视图中的列标题拒绝动态更改文本。有没有人见过这个?我在这里做错了什么?
在最坏的情况下,我可以将列标题的文本移动到外部资源文件,然后手动设置每个列标题的文本,但我发现这很麻烦,特别是如果我必须处理列表视图以后有很多列,或者如果文本需要为每种语言提供多个值。非常感谢您的帮助!