我有本地化的资源字符串,如
每个都有像
这样的内部字符串如果我从参数中知道语言,如何创建将返回字符串Page的扩展方法,我不想麻烦线程。
public static string LocalizeString(this string text, string lang)
{
if(lang == "EN"){
return localizedEnStrings.Page; // how to return string?
}
}
答案 0 :(得分:2)
在我看来,您并没有充分利用.NET本地化功能。
首先,我建议您更改资源:
到此:
以上命名符合模式{resource_name}.{locale_name}
。 resource_name
部分是您想要命名资源的方式。 locale_name
部分是区域设置或区域文化的标准化名称(有效的将是“en”,“en-GB”,“de”,“de-DE”等)。
这将指示框架将localizedStrings
文件视为同一个资源,这可能因文化而异(请参阅System.Globalization.CutlureInfo.CurrentCulture
或CurrentUICulture
)。我将在这篇文章中详细介绍下面的文化。
获取资源的最简单方法是将生成的类用于相应的资源文件。在您的情况下,它将被称为localizedStrings
。然后访问相应的资源键作为属性。例如,假设您定义了“HelloString”条目,localizedStrings.HelloString
将有效。您也可以使用其他标准方法来获取.NET框架所公开的资源。
根据当前文化的价值,您将获得英语或德语文本。
优良作法是在此名称中使用没有语言环境的资源文件 - localizedString.resx
,如果任何具体文件没有为给定键定义的条目,则会有后备值。这是有效的,因为.NET资源管理以某种方式运行以查找资源。例如,如果您有此文件texts.en-US.resx
,您的文化设置为en-US
并且您请求名为“HelloString”的资源,框架将执行此操作:
texts.en-US.resx
- 因为它具有最详细的区域设置名称(en-US)。如果找不到该文件,或者文件中未定义资源,则将继续执行下一步。texts.en.resx
中的字符串。在这里,en
被认为是所有英语资源的某种形式的超文化,并且作为所有en-XX文化的后备。如果找不到文件或资源条目,我们将再次进行。texts.resx
文件中的字符串,如果到目前为止还没找到。如果指定区域性不存在资源文件,或者没有与所请求密钥匹配的条目,则这是最终回退文件。上述情况对您来说是透明的,您只需要调整Thread.CurrentThread.CurrentCulture
和Thread.CurrentThread.CurrentUICulture
的值。
为了总结这一点,您的扩展方法应如下所示:
public static string LocalizeString(this string text, string lang)
{
return localizedStrings.Page;
}
它将取决于当前文化的价值。
Thread.CurrentThread.CurrentCulture
和Thread.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示例。