【问题标题】:Language resources files not loaded in class library on other environment其他环境的类库中未加载的语言资源文件
【发布时间】:2015-02-20 15:40:23
【问题描述】:

我有一个类库项目(c#、.net 4.0)。它有一些 WPF 用户控件,可以根据数据库中配置的文化以英语或西班牙语显示内容。

为此,在主窗口构造函数中,我收到一个 CultureInfo 参数,我用它来设置要在本地化命名空间中使用的区域性,如下所示:

public MainWindow(Entities.TransactionContext transactionContext, CultureInfo culture)
        {
            Localization.Resources.Culture = culture;

            InitializeComponent();

            //Some other unrelated code here
        }

这是从调用我的 dll 的主程序中使用的。在那里,进行查询以获取默认文化。它可以是“en-US”或“es-MX”,然后作为第二个参数发送。第一个暂时不重要。

正如我所说,我有一个名为 MyProject.Localization 的命名空间(我正在更改我的项目名称,因为内部政策,你明白)。在那个文件夹中,我有三个资源文件:

  • Resources.resx
  • Resources.en-US.resx
  • Resources.es-MX.resx

Resources.resx 中的默认条目具有西班牙语值,因为您知道,我是墨西哥人。

另外,在我的代码中,当我需要显示消息或设置标签文本时,我会使用如下内容:

this.lblStatusMessage.Content = Localization.Resources.OperationCancelled;

在此示例中:“OperationCancelled”是存在于所有资源文件中的条目。在西班牙语中它的值是“Operación Cancelada”,在英语中它是“Operation Cancelled”。

在所有这些故事之后,这在我的开发环境中非常有用。我运行我的测试项目,我看到它是英文的,然后我更改了数据库中的语言,再次运行它并繁荣!西班牙语。

但是。

当我通过 SVN 提交对这个项目的更改时,它会通过一些自动化流程部署到 QA 环境中(这很棒)。然后我在那里进行测试,我总是看到西班牙语的内容(作为默认内容)。即使我更改了 QA 数据库上的语言,它也总是以西班牙语显示标签和消息。

我尝试了一些选项:

将资源 dll 的构建操作更改为资源而不是嵌入式资源。没用。

右键->属性,资源选项卡显示没有资源,所以我在那里创建了三个resx文件并将自定义命名空间设置为MyProject.Localization。接下来我排除了我的原始文件,因为现在有一些模棱两可的错误。它再次在我的开发机器上工作,但在 QA 中却没有。

对此有什么想法吗?我的假设是它与 resx 文件有关,也许它们没有包含在最终构建的文件中或类似的东西中,这就是应用程序无法获取本地化文本的原因。

提前谢谢你。

【问题讨论】:

    标签: c# .net wpf localization resx


    【解决方案1】:

    这是我基于个人经验的回答:构建操作“嵌入式资源”应该可以工作。将包括所有资源。

    Localization.Resources.Culture = culture; 
    // "Overrides's the current thread's CurrentUICulture property for all
    // resources lookups using this this strongly typed resource class."
    

    我没有亲自使用过这个方法,但这也意味着它可以在你不知情的情况下改回Localization.Resources.Culture = null;。而是考虑使用System.Threading.Thread.CurrentThread.CurrentUICulture = culture;。如果您打算使用多种语言的应用程序,这里有一个电话建议:

    public void SetUICulture(CultureInfo culture)
    {
        CultureInfo savedUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture;
        try
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = uiCultureInfo;
    
            // Do culture-specific stuff...
            this.lblStatusMessage.Content = Localization.Resources.OperationCancelled;
        }
        finally 
        { 
            System.Threading.Thread.CurrentThread.CurrentUICulture = savedUICultureInfo
        }
    }
    

    如果您以后有多个不同的资源文件,这也很有用。总的来说,我建议您看看 CultureInfo 你实际上传递了什么。

    【讨论】:

      【解决方案2】:

      嗯,最后很简单。

      这是我的解释,也许它不完整,但我就是这样理解并为我工作的。

      当您使用资源文件进行本地化并构建解决方案时,VS 会为每个资源文件创建一个 DLL。它们是在与其语言对应的文件夹中创建的。就我而言,创建了两个文件夹:

      • zh
      • es-MX

      在每个文件夹中,都有一个文件:MySolution.resources.dll。两个文件中的名称相同。这样,在运行时,应用程序就知道使用哪个 dll 来加载本地化文本。

      因此,您需要这些文件夹来使用本地化逻辑。如果它们不存在,则应用只能使用默认资源文件中的文本。

      在我的情况下,再次,当我测试我的应用程序时,它运行良好,因为 Debug 文件夹有我的 MySolution.exe 文件和语言文件夹。但它在 prod 环境中失败了,因为主要部署没有考虑这些文件夹。

      而且,部署配置是这样设置的:

      -MainFolder
      --MainApp.exe
      --MainApp.configfile
      --other files
      --Folder
      ----MySolution.dll
      ----en
      ------MySolution.resources.dll
      ----es-MX
      ------MySolution.resources.dll
      

      所以我不得不与负责部署的人交谈,这样可以更改为:

      -MainFolder
      --MainApp.exe
      --MainApp.configfile
      --other files
      --MySolution.dll
      --en
      ----MySolution.resources.dll
      --es-MX
      ----MySolution.resources.dll
      

      这样,我的 dll 可以加载语言 dll,而主可执行文件可以加载一切正常。快乐的结局。

      我希望我很清楚,它可以帮助别人。干杯。

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多