C#: 如何从特定的文化中获取资源字符串。

28

我有一个资源程序集,其中包含各种语言的翻译文本。项目看起来像这样:

  • 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个回答

29

尝试下面的代码。它在我的电脑上至少可以正常运行:

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

22
你可以手动更改Visual Studio生成的FooBar类的Culture属性。或者,如果你直接使用ResourceManager类,可以使用带有所需区域设置参数的GetString重载函数。

2
资源管理器是否可以轻松创建和丢弃,还是需要清理或者只应该创建一次并长期使用? - Svish
最终使用了ResourceManagers :) - Svish

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

0

您可以在资源访问类中手动更改文化。但这种做法不太推荐,因为它会导致许多其他国际化问题。

例如,您需要:

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

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


-1
使用GetValue的第二个重载:
 .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))

嗯...我尝试了这个,但它似乎只返回了相同的值。得再试一次... - Svish
我猜这取决于属性的实现方式,你并没有展示属性的实现。 - AnthonyWJones
那是因为我还没有实现它。这只是默认的 Visual Studio 生成的东西。 - Svish
无法弄清如何使其工作,所以最终使用了ResourceManagers。真希望我能够只使用那个GetValue重载。哦,算了... - Svish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接