使用扩展方法进行简单定位

时间:2016-11-02 10:13:00

标签: c# .net asp.net-mvc

我有本地化的资源字符串,如

  • localizedEnStrings.resx
  • localizedDeStrings.resx

每个都有像

这样的内部字符串
  • 主页
  • ...

如果我从参数中知道语言,如何创建将返回字符串Page的扩展方法,我不想麻烦线程。

public static string LocalizeString(this string text, string lang)
{
    if(lang == "EN"){
        return localizedEnStrings.Page; // how to return string?
    }
}

2 个答案:

答案 0 :(得分:2)

在我看来,您并没有充分利用.NET本地化功能。

资源如何在.NET中运行

首先,我建议您更改资源:

  • localizedEnStrings.resx
  • localizedDeStrings.resx

到此:

  • localizedStrings.en.resx
  • localizedStrings.de.resx

以上命名符合模式{resource_name}.{locale_name}resource_name部分是您想要命名资源的方式。 locale_name部分是区域设置或区域文化的标准化名称(有效的将是“en”,“en-GB”,“de”,“de-DE”等)。

这将指示框架将localizedStrings文件视为同一个资源,这可能因文化而异(请参阅System.Globalization.CutlureInfo.CurrentCultureCurrentUICulture)。我将在这篇文章中详细介绍下面的文化。

获取资源的最简单方法是将生成的类用于相应的资源文件。在您的情况下,它将被称为localizedStrings。然后访问相应的资源键作为属性。例如,假设您定义了“HelloString”条目,localizedStrings.HelloString将有效。您也可以使用其他标准方法来获取.NET框架所公开的资源。

根据当前文化的价值,您将获得英语或德语文本。

优良作法是在此名称中使用没有语言环境的资源文件 - localizedString.resx,如果任何具体文件没有为给定键定义的条目,则会有后备值。这是有效的,因为.NET资源管理以某种方式运行以查找资源。例如,如果您有此文件texts.en-US.resx,您的文化设置为en-US并且您请求名为“HelloString”的资源,框架将执行此操作:

  1. 查找当前文化的资源文件 - 即texts.en-US.resx - 因为它具有最详细的区域设置名称(en-US)。如果找不到该文件,或者文件中未定义资源,则将继续执行下一步。
  2. 查找texts.en.resx中的字符串。在这里,en被认为是所有英语资源的某种形式的超文化,并且作为所有en-XX文化的后备。如果找不到文件或资源条目,我们将再次进行。
  3. 查找texts.resx文件中的字符串,如果到目前为止还没找到。如果指定区域性不存在资源文件,或者没有与所请求密钥匹配的条目,则这是最终回退文件。
  4. 上述情况对您来说是透明的,您只需要调整Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture的值。

    为了总结这一点,您的扩展方法应如下所示:

    public static string LocalizeString(this string text, string lang)
    {
        return localizedStrings.Page;
    }
    

    它将取决于当前文化的价值。

    什么是Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture

    我在相关问题中回答了这个问题:What is the difference between CurrentCulture and CurrentUICulture properties of CultureInfo in .NET?。查看帖子和其他答案,以更好地了解这两个属性。

答案 1 :(得分:1)

解决方案1:

如果您知道该语言,则可以覆盖InitializeCulture()方法并设置

string culture = "EN";
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

解决方案2:

如果要加载每个资源:

// Page.GetLocalResourceObject()
//
string text = GetLocalResourceObject("text_id").ToString();

此处MSDN示例。