本地化.NET;使用ResourceManager时的后备语言

时间:2010-02-16 12:13:43

标签: vb.net localization resources embedded-resource

最近我正在深入研究.NET的本地化。基本上,我学习了如何自定义表单(使用Language和Localizable属性),然后相应地更改文化。

但是,我发现在将我的硬编码英文字符串迁移到自动生成的资源文件中时,使用.GetString(“Key”) - 好吧,让我们说它不开心:P。

我决定将一组独立的resx文件专门用于硬编码字符串翻译。他们遵循[name]的惯例/要求。[culture-code] .resx。我为每种相关语言制作了这些;例如 appstrings.de.resx (对于德语)和 appstrings.resx (作为不变基线)。

为了利用这些新资源,我创建了一个ResourceManager和资源集

的实例
Dim resManager As New ResourceManager("LanguageTest.appstrings", Assembly.GetExecutingAssembly)
Dim resSet As ResourceSet = resManager.GetResourceSet(My.Application.UICulture, True, True)

使用

设置当前的UI文化(例如,设置为德语)
My.Application.ChangeUICulture("de")

原始问题

除非在 appstrings.de.resx 中明确定义了resSet.GetString(“Key”),否则它将返回一个空字符串。无论如何我可以回退到 appstrings.resx (其中“Key”确实存在),我认为这是默认基线?

更新

Rhapsody在下面提出了一个建议,而实际的提示本身并不起作用,事实上它确实引发了一个有趣的点,使用resManager.GetString(“Key”)而不是resSet.GetString(“Key”)。到目前为止,这似乎没有任何缺陷。也就是说,返回专用语言文件中存在的值,而当通过单个键访问时,“缺失”值会回退到默认文化。

后续问题

唯一剩下的问题是使用ResourceManger而不是缓存的ResourceSet对性能的影响是否会有害?

3 个答案:

答案 0 :(得分:4)

您可以尝试为应用程序声明默认文化,如下所示

[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.Satellite)]

此代码声明您的默认文化是en-US。在您的示例中,如果当前文化是“de-DE”,它在“de-DE”中查找资源,然后查找父“de”文化等等,并且Ultimatly转到定义的文化(en-US)资源文件。资源管理的后备策略see MSDN。 上面的代码通常在assenblyInfo.cs中。第二个参数告诉资源管理器位于主程序集或卫星中的资源在哪里。

不幸的是,在此解决方案中,您必须使用区域性名称,而不是资源文件名。但是你可以扩展RM以按文件名使用特定资源,但是更简单的方法是选择默认文化并将资源文件重命名为该文化,并且你有开箱即用的解决方案。

答案 1 :(得分:2)

尝试

Public Function GetString(ByVal Name As String) As String
    Return My.Resources.Strings.ResourceManager.GetString(Name)
End Function

其中Strings是项目中resx文件的名称。 当当前文化不可用时,这将自动返回基线值。

这是一个简单的例子,你可能想让它更加简单。

答案 2 :(得分:0)

我之前创建了一个网络应用程序,它使用en-US作为后备语言,但根据用户Web浏览器中的设置,还有其他更具体的内容,如.de

基本上为了让它工作,我在web.config中设置了xml

<globalization uiCulture="auto" culture="auto" requestEncoding="utf-8" responseEncoding="utf-8"/>

从那里我使用了.cs文件中的内部静态ResourceManager,它提供了您的默认语言,例如。

Resources.<ResourceFileName>.ItemSearchNoResultsErrorText

和.aspx文件:

<%$ Resources:<ResourceFileName>, TimeSelect %>

据我了解,那么包含ResourceManager类的.cs文件存在的地方是重要的,它是在.de语言文件或后备语言之后吗?由于它是作为一个单独的卫星组件编译的,因此它取决于编译.cs类的位置以及它所属的卫星组件。

作为一项规则,我总是将ResourceManager类作为en-US语言背后的代码,因为如果找不到更具体的语言,那就是我想用作后备语言的那个

使用此设置我从来没有得到空白值,它总是使用后备语言,即使我在运行时更换了附属程序集。