【问题标题】:ResourceManager.GetString() method returns wrong string from different assembliesResourceManager.GetString() 方法从不同的程序集中返回错误的字符串
【发布时间】:2012-09-25 16:35:27
【问题描述】:

我有 2 个资源文件,一个是英文的,另一个是外文的。当我打电话时

ResourceManager.GetString("Hello") 

从 .Designer.cs 文件中,它总是返回英文翻译。我检查了我的语言环境和语言等,一切都是正确的。

它从我的主程序集中返回正确翻译的字符串,但从加载的程序集中它总是返回英文。

【问题讨论】:

  • 你是如何设置语言的?它应该使用 UICulture 进行设置。你这样做了吗?
  • 你能贴出你用来实例化 ResourceManager 的代码吗?
  • 是的设置语言,一切都是正确的。事实证明,将其作为嵌入式资源是问题所在。它似乎忽略了语言环境并加载了英语。将其作为资源解决此问题并加载正确的语言。只发生在嵌入式程序集上,现在调查原因。
  • 我没有实例化资源管理器,但我正在寻找并看到它被调用但将英语而不是外国传回给我。我只是调用 Namespace.Strings.Hello 并且它应该返回正确的,它除了加载的程序集之外。将它们作为资源并将它们打包到外部程序集 dll 中而不是嵌入,它似乎可以工作。

标签: c# resources resourcemanager


【解决方案1】:

这就是发生的事情。我有一个包含几个翻译资源文件的程序集。这些都是嵌入式资源。

当我编译程序集时,它会将默认英语放入其 .dll 中。至于其他语言,它正在使用其中的语言创建文件夹,fr、da、de 等。

如果我想让它们被加载到所有其他程序集中的主应用程序拾取,我也必须移动所有这些。当我告诉程序集它们都是嵌入式资源文件时,我想它实际上会嵌入它们!

我现在有一个AssemblyLoader,当它无法从当前位置找到它们时,它会加载所有必需的 .dll,打包它将取决于我是要包含所有语言还是在构建项目之前选择我想要的语言.工作量超出了我的预期,但最终解决了。

任何人有任何问题,请随时提问。

【讨论】:

  • 您究竟是如何解决这个问题的?我有这个确切的问题。
  • 您是否设置了应用程序的 NeutralLanguage?也许这就是你的全部问题
  • Batmaci 的评论对我很有用。我遇到了同样的问题,除了默认(英语)之外的每种语言都生成了一个 dll。然后我将中性语言设置为无(程序集信息>中性语言),我正确地得到了翻译的字符串,而不是总是英语
  • 单独的文件夹是重要的部分。我支持英语以外的一种语言,所以我所要做的就是在我的主项目中引用 projectname.resources.dll 文件,而 ResourceManager 会负责其余的工作。
【解决方案2】:

不确定您是如何实例化 ResourceManager,但是当您调用 ResourceManager.GetString() 时,您可以指定 CultureInfo,它可以帮助您在正确的语言环境中获取字符串。所以你可以这样做:

var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));

这将确保字符串键来自 en-GB 特定资源文件。

【讨论】:

  • 我的问题是那些带有外国翻译的资源文件没有被加载。发现这是因为它将它们打包到每个语言文件夹中的单独 dll 中,这是有道理的,但认为它首先会将它们嵌入到我的 .dll 中
【解决方案3】:

GetString 的第一个重载 ResourceManager.GetString(string) 使用当前线程的 CurrentUICulture (Thread.CurrentThread.CurrentUICulture)。

参考MSDN:-

返回的资源针对当前线程的 UI 区域性进行本地化,由 CurrentUICulture 属性定义。

在后台线程中,不要假设线程的 CurrentUICulture 与您的主(或 UI)线程的 CurrentUICulture 相同。

从后台线程访问资源的更好方法是使用类似以下的内容来获取正确的本地化字符串:-

var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);

【讨论】:

    【解决方案4】:

    尝试将构建操作更改为“嵌入式资源” 我最近在添加泰米尔语资源时遇到了这个问题。花了几个小时后,我发现添加资源文件后错过了这个简单的步骤。

    【讨论】:

      【解决方案5】:

      就我而言,问题在于 resx 文件。无效资源字符串在 resx 文件中的格式不正确:

      <data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
        <settings>
          Month   Date    Department
          01.05.2015  01.05.2015  OIR
          01.05.2015  02.05.2015  OIR
        </settings>
      </data>
      

      正确的格式:

      <data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
        <value>
          Month   Date    Department
          01.05.2015  01.05.2015  OIR
          01.05.2015  02.05.2015  OIR
        </value>
      </data>
      

      【讨论】:

        【解决方案6】:

        我发现动态解决此问题的最简单快捷的方法是获取当前在运行应用程序的操作系统中使用的语言,然后调用适当的资源。这是完成此操作的代码。

        string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
                    return resourceManager.GetString(text, new CultureInfo(lg));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多