【发布时间】:2018-02-10 22:56:02
【问题描述】:
我一直在搜索如何更改将 Localizable 属性设置为 true 的表单的语言。
https://msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture(v=vs.110).aspx
这是设置表单的语言,但是这个需要在我们实例化表单之前设置。此事件后无法调用。
搜索信息时,我看到了以下问题:https://stackoverflow.com/a/11738932/3286975 但是,正如评论所说,我在 TabControl 和 MenuStrip 中有控件,因此它们不受影响。
我试图通过获得表单的所有控件来修改这一点,但没有运气。
在此菜单中,我调用以下回调:
private void englishToolStripMenuItem_Click_1(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
private void spanishToolStripMenuItem_Click(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
我通过使用标签来改变文化。
当我点击它时,什么也没有发生。另外,我已经从提到的答案中稍微修改了 ApplyResources 方法。
private void ApplyResources(Control parent, CultureInfo culture)
{
this.resManager.ApplyResources(parent, parent.Name, culture);
foreach (Control ctl in parent.IterateAllChildren())
{
//this.ApplyResources(ctl, culture);
this.resManager.ApplyResources(ctl, ctl.Name, culture);
}
}
IterateAllChildren 如下:https://stackoverflow.com/a/16725020/3286975
另外,我尝试使用 (System.LINQ):Controls.OfType<Label>()(因为我有一个标签可以测试这个),但没有运气......
但是当我选择西班牙语时,文本没有改变。
所以也许,我对孩子们不满意。或者可能通过调用方法CreateCulture,我不知道。
提前致谢!
编辑:
我已经测试通过文化信息获取我表单的资源管理器,它每次都返回默认值:
ResourceSet resourceSet = new ResourceManager(typeof(frmCredentials)).GetResourceSet(new CultureInfo(lang), true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value; //resourceSet.GetString(resourceKey);
if (resource.GetType().Equals(typeof(string)))
Console.WriteLine("Key: {0}\nValue: {1}\n\n", resourceKey, (string) resource);
}
new CultureInfo(lang),我也测试过:new CultureInfo("es") & Thread.CurrentThread.CurrentCulture (CurrentUICulture) 没有运气。就像它永远不存在或被替换,但在我的设计和文件资源管理器中我可以看到这些文件。
EDIT2:
也许是因为我正在使用 ILMerge 将所有 dll 合并到一个唯一的 dll 中。我正在审查这个:Single-assembly multi-language Windows Forms deployment (ILMerge and satellite assemblies / localization) - possible?
回复 EDIT2:
是的,删除 ILMerge 问题就解决了,我给出的第一个解决方案解决了这个问题。但是由于某种原因,西班牙语被视为默认语言,当我尝试从中获取资源集时,它没有返回任何内容。
Aso,我已将 Localizable 属性设置为 false,并且它没有创建带有值的默认 resx 文件。我不知道这是否是一个好习惯。
我会尝试一些新的...
【问题讨论】:
-
我承认下面的方法不是很好,但是既然你知道你有一个
TabControl和一个MenuStrip,你可以修改你的IterateAllChildren方法来专门监视这些控件并进行特殊处理以确保您涵盖了他们所有的子控件。如果您可以处理表单中所有数据的清除(例如,首先保存),那么重新初始化表单(如@Isma 建议的那样)将是一种更好的方法。 -
> stackoverflow.com/questions/21067507/… StackOverflow 问题上指出的解决方案就像一个魅力。
-
嗯...如果您这样做,这是一个很好的方法:stackoverflow.com/questions/5411694/… 感谢您的帮助,但我更喜欢更简单的方法,如果没有更多选择,我会试试这个。
-
您可以使用
AppDomain.CurrentDomain.AssemblyResolve,而不是使用ILMerge,这解决了ILMerge 经常引起的命名空间问题。 There is even a library that will automatically embed the files and add the assembly load code for you。 (其实 IL 合并的创建者在第一个链接的 cmets 中回应 “作为 ILMerge 的作者,我认为这太棒了!如果我知道这一点,我永远不会写 ILMerge。” )
标签: c# winforms currentculture