如何同时为单个表单上的两个不同控件设置两种不同的文化?

Posted

技术标签:

【中文标题】如何同时为单个表单上的两个不同控件设置两种不同的文化?【英文标题】:How to set two different Cultures for two different Controls on a single Form at the same time? 【发布时间】:2017-01-02 06:16:11 【问题描述】:

我需要演示如何使用附属程序集对控件进行本地化。这样做时,我一直坚持一个地方,我在一个表单上有两个控件,两者都是相同的。我曾经从标签派生它。 现在我需要显示带有文化fr-FRcontrol1 和带有文化de-DEcontrol2

是否有任何选项可以为表单中显示的相同控件设置不同的文化。

下面的截图将显示我的需要。

请建议我是否可能。如果可能,请告诉我如何实现这一目标。

【问题讨论】:

【参考方案1】:

您可以依赖 Windows 窗体的localization 功能。这样,您可以为不同的文化设置具有不同属性的控件。然后,您可以显示具有为特定文化设置的属性的整个表单。

您还可以选择以不同的文化显示每个控件。为此,在您的表单Load 事件处理程序中使用此类代码就足够了:

System.Threading.Thread.CurrentThread.CurrentUICulture =
    System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
var resources = new System.ComponentModel.ComponentResourceManager(this.GetType());
resources.ApplyResources(button1, button1.Name);

对于button2,只需将上述代码与de-DE 文化结合使用。

注意

    以上方案不限于Text属性,它支持所有Localizable属性。

    您可以简单地将其作为控件类的扩展方法。

    它具有设计器支持,可用于创建控件的本地化外观。

【讨论】:

有关使用 windows 窗体的多语言应用程序的更多信息,请参阅:How to make multi language app in winforms 是不是ApplyResources只需要从resx文件中获取本地化字符串。 在本地化形式中,ApplyResources 将在 InitializeComponent 中为每个控件自动调用。我们在这里所做的是在将CurrentUICulture 设置为特定文化之后调用ApplyResources 以获得特定控件。如果我们需要,这种方式可以为不同的控件加载不同的文化。 感谢您的宝贵回复。它可以帮助我找到解决问题的方法。【参考方案2】:

尝试使用以下代码。

if(langCode=="fr-FR")

Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");

if(langCode=="de-DE")

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");

【讨论】:

您传递“langCode”值及其后续语句的位置。【参考方案3】:

因为您想为您的应用程序演示本地化功能,您可以在更新控件的值时更改当前线程文化

private void SetLocalizedTextForLabel(Label label, string language)

    var original = Thread.CurrentThread.CurrentUICulture;
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);

    // Here value will be retrieved from YourResource based on the current culture
    label.Text = Properties.YourResource.YourText;

    Thread.CurrentThread.CurrentUICulture = original;

那就用吧

SetLocalizedTextForLabel(frenchLabel, "fr-FR");
SetLocalizedTextForLabel(germanLabel, "de-DE");

【讨论】:

对于演示,这没关系。在实际工作应用程序中是可能的。如何在实际应用程序中为这些提供支持,例如,我的控件将默认支持核心中同一表单上的两种不同文化。

以上是关于如何同时为单个表单上的两个不同控件设置两种不同的文化?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个视图中处理多个分段控件的事件

如何在ngui的单个label中设置不同大小的文字

VBA迭代主窗体上的控件,同时忽略子窗体

如何将表单控件添加到角度 8 中的文本区域

对于具有不同类型控件的单个视图,我是不是需要多个控制器?

如何调整窗体上的控件大小以适应不同的分辨率?