【问题标题】: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

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

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

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

【问题讨论】:

    标签: c# winforms localization globalization culture


    【解决方案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 文化结合使用。

    注意

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

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

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

    【讨论】:

    • 有关使用 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");
    

    【讨论】:

    • 对于演示,这没关系。在实际工作应用程序中是可能的。如何在实际应用程序中为这些提供支持,例如,我的控件将默认支持核心中同一表单上的两种不同文化。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多