C#:如何从某种文化中获取资源字符串
我有一个资源程序集,其中包含各种语言的翻译文本。 项目类似于:
- FooBar.resx
- FooBar.nb-NO.resx
- FooBar.sv-SE.resx
- …
我可以使用这样的静态属性来获取文本:
var value = FooBar.Hello;
或者通过使用这样的reflection:
var value = resourceAssembly .GetType("Namespace.FooBar") .GetProperty("Hello") .GetValue(null, null) as string;
两种方式都将获得属于当前线程的当前UI文化的值。 这很好,完全是我通常喜欢的。
但是,如果我明确地想要瑞典的价值,而不必改变UI文化,我能做些什么吗?
您可以手动更改Visual Studio生成的FooBar类的Culture
属性。 或者,如果您直接使用ResourceManager类 ,则可以使用GetString的重载,该重载将所需的区域性作为参数。
请尝试以下代码。 它至少对我来说很好:
FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
您可以手动更改资源访问类中的区域性。 但这有点不受推荐,因为它会导致许多其他国际化问题。
例如,你必须:
- 处理文化重载的所有数字格式
- 确保您使用的其他库具有与您相似的机制
- 在上述情况不可能的情况下(例如BCL)为可能具有文化特色的一切创造包装(这是很多东西)。
因此,如果可能的话,改变当前线程的当前UI文化。
这里有一些我习惯用文化名称获取资源文件的代码 – 它是vb.net,但是你明白了。
Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture))
如果你想把它作为字典返回:
If reader IsNot Nothing Then Dim d As New Dictionary(Of String, String) Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator() While enumerator.MoveNext d.Add(enumerator.Key, enumerator.Value) End While Return d End If
使用GetValue的第二个重载: –
.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))