根据区域性本地化数据注释错误消息

问题描述 投票:0回答:3

在我的WPF应用程序中,我具有如下定义的属性

[Required(AllowEmptyStrings =false, ErrorMessageResourceName ="Msg1", ErrorMessageResourceType =typeof(*<AssemblyName>*.Resources.*<ResourceFileName>*))]
public string Name
{
    get
    {
        return _name;
    }

    set
    {
        if (_name == value)
        {
            return;
        }
        _name = value;
    }
}

我在单独的程序集中定义了错误消息,该程序集具有用于不同区域性的资源文件,例如Resources.resx,Resources.en-GB.Resx,Resources.fr-FR.Resx,Resources.en-US.Resx等]

有了上面的代码,我能够从我的附属程序集中的默认资源文件中检索错误消息,但是我看不到任何从区域性特定资源文件中找到字符串资源的规定。我的意思是,如果将CurrentUICluture设置为english(英国),那么我想从文件“ Resources.en-GB.Resx”而不是默认文件(即Resources.Resx)中检索资源值。

我在“必填”属性定义中看不到任何传递区域性信息的方法。另外,我已经测试了它并不是基于当前区域性集固有地查看区域性特定资源文件。

我想要的是一种使资源检索机制具有文化意识的方法。

谢谢,

c# .net wpf localization cultureinfo
3个回答
0
投票

[如果您想让您的网站了解文化,则需要在system.web元素下的web.config中修改全球化属性:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" culture="auto" uiCulture="auto" enableClientBasedCulture="true" />

然后,它将根据浏览器的首选语言设置来寻找资源。

或者,您可以明确指定它:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="" culture="en-US" uiCulture="en-US" />

0
投票

最后我从this link获得了解决我的问题的方法>

在我的应用程序中,我通过在app.xaml.cs文件中放置以下代码来设置启动应用程序时的区域性。

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        InitializeCultures();
    }

    private static void InitializeCultures()
    {
        var culture = ConfigurationManager.AppSettings.Get("Culture");
        if (!String.IsNullOrEmpty(culture))
        {
            Thread.CurrentThread.CurrentCulture =  new CultureInfo(culture);
        }

        var UICulture = ConfigurationManager.AppSettings.Get("UICulture");
        if (!String.IsNullOrEmpty(UICulture))
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(UICulture);
        }
    }

但是即使我最初设置了区域性,也并非所有线程最初都将使用我设置的相同区域性。因此,正在为我读取资源值的线程仍在使用默认区域性,这导致总是从默认区域性资源文件而不是区域性特定资源文件中读取资源字符串。

因此,诀窍是将应用程序中的所有线程设置为使用最初设置的相同区域性。有两个属性

  1. CultureInfo.DefaultThreadCurrentCulture
  2. CultureInfo.DefaultThreadCurrentUICulture
  3. 首先将必需的区域性值设置为这两个属性将确保应用程序中使用的所有后续线程将具有与用户设置相同的区域性。这两个属性在当前应用程序域中的所有线程上设置区域性。

一旦正确设置了区域性,读取资源值将固有地成为区域性文化,并从区域性特定资源文件中读取资源值。

所以下面是InitializeCulture方法的更新版本:

    private static void InitializeCultures()
    {
        var culture = ConfigurationManager.AppSettings.Get("Culture");
        if (!String.IsNullOrEmpty(culture))
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture =  new CultureInfo(culture);
        }

        var UICulture = ConfigurationManager.AppSettings.Get("UICulture");
        if (!String.IsNullOrEmpty(UICulture))
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(UICulture);
        }
    }

P.S。在Web应用程序中使用此修补程序时要小心。请在原始链接上阅读有关它的信息。

希望这有帮助...


0
投票

我想出一个简单的主意,使我免于单独装饰所有属性。确实是一个令人讨厌的解决方案,因为它涉及反射但有效。

© www.soinside.com 2019 - 2024. All rights reserved.