gpt4 book ai didi

c# - 在运行时更改语言的正确方法

转载 作者:IT王子 更新时间:2023-10-29 04:30:47 24 4
gpt4 key购买 nike

在运行时更改表单语言的正确方法是什么?

  1. 使用递归手动设置所有控件,如 this
  2. 将语言选择保存到文件 > 重新启动应用程序 > 加载语言InitializeComponent();
  3. 之前的选择
  4. 使用 Form 构造函数替换 active from 的实例(如果这甚至可能的话)
  5. 其他

有很多关于此的半写线程,但没有一个提供真正的答案来说明什么是正确的方法?

更新:
澄清我的问题:

做这样的事情:

public Form1()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
this.InitializeComponent();
}

工作正常,我所有的控件和资源中的所有其他内容都得到了正确的翻译。并做类似的事情:

private void button1_Click(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
}

什么都不做,表单保持在我之前设置的语言 InitializeComponent();

最佳答案

我相信 Hans Passant 评论中显示的解决方案可能是唯一(通用)的解决方案。

就个人而言,我将这个基类用于所有需要本地化的表单:

public class LocalizedForm : Form
{
/// <summary>
/// Occurs when current UI culture is changed
/// </summary>
[Browsable(true)]
[Description("Occurs when current UI culture is changed")]
[EditorBrowsable(EditorBrowsableState.Advanced)]
[Category("Property Changed")]
public event EventHandler CultureChanged;

protected CultureInfo culture;
protected ComponentResourceManager resManager;

/// <summary>
/// Current culture of this form
/// </summary>
[Browsable(false)]
[Description("Current culture of this form")]
[EditorBrowsable(EditorBrowsableState.Never)]
public CultureInfo Culture
{
get { return this.culture; }
set
{
if (this.culture != value)
{
this.ApplyResources(this, value);

this.culture = value;
this.OnCultureChanged();
}
}
}

public LocalizedForm()
{
this.resManager = new ComponentResourceManager(this.GetType());
this.culture = CultureInfo.CurrentUICulture;
}

private void ApplyResources(Control parent, CultureInfo culture)
{
this.resManager.ApplyResources(parent, parent.Name, culture);

foreach (Control ctl in parent.Controls)
{
this.ApplyResources(ctl, culture);
}
}

protected void OnCultureChanged()
{
var temp = this.CultureChanged;
if (temp != null)
temp(this, EventArgs.Empty);
}
}

然后我没有直接更改 Thread.CurrentThread.CurrentUICulture,而是在静态管理器类中使用此属性来更改 UI 文化:

public static CultureInfo GlobalUICulture
{
get { return Thread.CurrentThread.CurrentUICulture; }
set
{
if (GlobalUICulture.Equals(value) == false)
{
foreach (var form in Application.OpenForms.OfType<LocalizedForm>())
{
form.Culture = value;
}

Thread.CurrentThread.CurrentUICulture = value;
}
}
}

关于c# - 在运行时更改语言的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com