语言资源文件未在其他环境的类库中加载

时间:2015-02-20 15:40:24

标签: c# .net wpf localization resx

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

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

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ónCancelada”,在英语中它表示“取消操作”。

毕竟这个故事,这在我的开发环境中非常有用。我运行我的测试项目,我用英语看,然后我改变数据库中的语言,再次运行它并繁荣!西班牙。

但是

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

我尝试了一些选择:

将资源dll的Build Action更改为Resource而不是Embedded Resource。它不起作用。

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

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

提前谢谢你。

2 个答案:

答案 0 :(得分: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您实际通过的内容。

答案 1 :(得分:1)

嗯,最后很简单。

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

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

  • EN
  • ES-MX

在每个文件夹中,ther是一个文件: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,主可执行文件可以加载一切正常。快乐的结局。

我希望我很清楚,它可以帮助别人。欢呼声。