10

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

Resources.MyResourceFile.MyStringIdentifier

很容易。这样我在编译时就知道资源字符串存在。

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

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

另一个是更改当前线程的文化信息,我需要做几次。

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

4

7 回答 7

1

(对于您的场景)ResourceManager 的想法是在运行时而不是在编译时提供文化特定信息(也就是与后备并行)。
所以答案是“否”,没有一种内置方法可以在编译时确定这些资源文件的存在 - 为此,您需要对每种语言中的所有字符串和代码进行一种“硬编码”访问那些。并排的想法与硬编码完全相反;)

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

于 2010-11-15T16:36:10.890 回答
0

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

最简单的选项是 try-catch 并在 catch 中以通用语言返回值。

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

我的解决方案是应该的,所有的资源都应该是一致的,否则我们使用这个很棒的工具很糟糕。

于 2010-10-30T21:35:19.420 回答
0

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

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

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

于 2010-11-10T11:53:02.783 回答
0

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

PS:这是一个很好的例子,为什么静态依赖关系不好,一切都应该是接口和实例。

于 2010-11-12T12:21:21.920 回答
0

ResourceSet有方法

public virtual IDictionaryEnumerator GetEnumerator()

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

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

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

于 2010-10-22T14:33:09.230 回答
0

生成的Resources.MyResourceFile类有一个静态Culture属性,你可以设置它neededCultureInfo来覆盖当前线程的 CurrentUICulture。

于 2010-11-03T13:18:54.823 回答
0

你试过了吗:

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

试试这个链接点击这里

你也可以试试:

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

试试这个链接点击这里

于 2010-10-15T19:47:52.300 回答