使用.NET中的CultureInfo访问资源字符串

时间:2010-10-11 13:50:10

标签: asp.net resources internationalization cultureinfo currentuiculture

另一个简单的问题。 我有不同语言的网站。如果我想从资源文件中访问一个字符串,我会像这样使用它

Resources.MyResourceFile.MyStringIdentifier

很简单。这样我在编译期间就知道资源字符串存在。

现在,只有当我想使用当前的Culture时,这才有效。有时我需要指定一种特定的文化(假设当前用户使用德语作为语言,但他的操作会触发将消息发送给其他用户,这些用户将使用收件人的语言)。现在,我看到两个选项:

Resources.MyResourceFile.ResourceManager.GetString("MyStringIdentifier", neededCulturInfo)

另一种方法是更改​​当前线程的文化信息,我需要多次这样做。

还有第三种方式吗?在编译时告诉我资源存在但不需要一直改变线程文化的东西?

7 个答案:

答案 0 :(得分:1)

(对于您的场景)ResourceManager的想法是在运行时提供文化特定信息,而不是在编译时(也就是后备并排)。
所以答案是“不”,没有建立方法来确定编译时这些资源文件的存在 - 这样做你需要对每个语言中的所有字符串进行一种“硬编码”,并且还需要代码访问那些。并排的想法恰恰与硬编码相反;)

您可以做的是,对资源进行单元测试,检查您的语言并检查是否使用了默认值或本地化值。此外,如果您使用的是提供签到策略(例如TFS)的源控制系统,您可以将此单元测试作为签到策略的一部分。

答案 1 :(得分:0)

你试过了吗?

public static Object GetLocalResourceObject (
    string virtualPath,
    string resourceKey,
    CultureInfo culture)

试试此链接Click here

您也可以尝试:

public static Object GetGlobalResourceObject (
    string classKey,
    string resourceKey,
    CultureInfo culture)

试试此链接Click here

答案 2 :(得分:0)

ResourceSet有一个方法

public virtual IDictionaryEnumerator GetEnumerator()

可以访问资源文件的键值对 例如。 (假设我们只处理字符串 - N.B.键值对是对象类型):

while (set.MoveNext())
     {
         string key = (string)set.Key;
         // string value = (string)set.Value; 
         string value = ResourceManager.GetString(key, neededCulturInfo); 
     }

这不是你应该做的,因为事情变得复杂 - 只是指出来 您可以为不同的文化创建不同的资源文件,并在switch作为参数的方法中使用CultureInfo代码块。

答案 3 :(得分:0)

您构建一个查看资源内部或使用Enumerator解决方案的类,查找该值,如果该值不存在,请使用默认语言中的值。 但是在编译时,它无法验证。

最简单的选项是try-catch,并以catch中的常规语言返回值。

尽管如此,如果我们使用资源,所有密钥必须始终存在于所有相关文件中,即使您使用通用语言值复制它们也是如此。

我的解决方案应该是什么,所有资源应该是一致的,如果不是我们正在使用这个伟大的工具。

答案 4 :(得分:0)

生成的Resources.MyResourceFile类具有静态Culture属性,您可以将其设置为neededCultureInfo以覆盖当前线程的CurrentUICulture。

答案 5 :(得分:0)

1)在开始时,将UICulture存储到会话中可能很有用,为了在需要时更改它,在开始时您可以从那里更改它。

2)您可以覆盖preRender中的UICulture并从那里进行设置,然后将其存储到会话中。

您也可以将其存储在cookie中,但不是最佳解决方案。

答案 6 :(得分:0)

您可以使用WorkItem以异步方式发送消息。由于您现在在不同的线程上运行,因此您应该能够根据需要修改CurrentUICulture。

P.S。:这是一个很好的例子,为什么静态依赖是坏的,一切都应该是接口&实例