【问题标题】:Accessing resource strings with CultureInfo in .NET在 .NET 中使用 CultureInfo 访问资源字符串
【发布时间】:2010-10-11 13:50:09
【问题描述】:

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

Resources.MyResourceFile.MyStringIdentifier

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

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

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

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

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

【问题讨论】:

  • 您应该使用 CurrentUICulture 访问可翻译的字符串,而不是 CurrentCulture。 CurrentCulture 负责格式化。
  • 是的,谢谢,我自然用的是CurrentUICulture
  • 如果您在编译时不知道要显示哪种语言,编译器应该如何为您解决?
  • 我很想知道如何优雅地解决这个问题,因为我遇到了同样的问题,并且不特别喜欢您描述的第一种或第二种方式,尽管它们似乎是唯一可用的选项。

标签: asp.net resources internationalization cultureinfo currentuiculture


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你试过了吗:

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

    试试这个链接Click here

    你也可以试试:

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

    试试这个链接Click here

    【讨论】:

    • 但是我仍然需要提交像“MyStringID”这样的资源密钥,并且只会在运行时知道该密钥不存在,对吗?对我来说似乎与 GetString() 相同。
    • 哦,好吧,我只是明白你想要什么对不起。但是好吧,我不知道你怎么能做到这一点......顺便说一句,知道是否有办法很有趣!我关注这个话题!
    【解决方案3】:

    ResourceSet 有方法

    public virtual IDictionaryEnumerator GetEnumerator()
    

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2011-05-08
              • 2017-04-16
              • 2013-05-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多