另一个简单的问题。 我有不同语言的网站。如果我想从资源文件中访问一个字符串,我会像这样使用它
Resources.MyResourceFile.MyStringIdentifier
很简单。这样我在编译期间就知道资源字符串存在。
现在,只有当我想使用当前的Culture时,这才有效。有时我需要指定一种特定的文化(假设当前用户使用德语作为语言,但他的操作会触发将消息发送给其他用户,这些用户将使用收件人的语言)。现在,我看到两个选项:
Resources.MyResourceFile.ResourceManager.GetString("MyStringIdentifier", neededCulturInfo)
另一种方法是更改当前线程的文化信息,我需要多次这样做。
还有第三种方式吗?在编译时告诉我资源存在但不需要一直改变线程文化的东西?
答案 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。:这是一个很好的例子,为什么静态依赖是坏的,一切都应该是接口&实例