C#:如何从某种文化中获取资源字符串

时间:2009-12-01 11:28:22

标签: c# .net localization resources

我有一个资源程序集,其中包含各种语言的翻译文本。项目类似于:

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
  • ...

我可以使用这样的静态属性来获取文本:

var value = FooBar.Hello;

或者使用这样的反射:

var value = resourceAssembly
      .GetType("Namespace.FooBar")
      .GetProperty("Hello")
      .GetValue(null, null) as string;

两种方式都可以获得属于当前线程的当前UI文化的值。这很好,完全是我通常喜欢的。

但是,如果我明确地想要瑞典的价值,而不必改变UI文化,我能做些什么吗?

5 个答案:

答案 0 :(得分:19)

您可以手动更改Visual Studio生成的FooBar类的Culture属性。或者,如果您直接使用ResourceManager class,则可以使用GetString的重载,将所需的区域性作为参数。

答案 1 :(得分:13)

尝试以下代码。它至少对我有用:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))

答案 2 :(得分:1)

这里有一些我习惯用文化名称获取资源文件的代码 - 它是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

答案 3 :(得分:0)

您可以手动更改资源访问类中的区域性。但这有点不受推荐,因为它会导致许多其他国际化问题。

E.g。你必须:

  • 处理文化重载的所有数字格式
  • 确保您使用的其他库具有与您相似的机制
  • 在上述情况不可能的情况下(例如BCL)为可能具有文化特色的所有内容创建包装器(这是很多东西)。

因此,如果可能的话,改变当前线程的当前UI文化。

答案 4 :(得分:0)

使用GetValue的第二个重载: -

 .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))