我有一个类库项目(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中的默认条目具有西班牙语值,因为您知道我是墨西哥人。
另外,在我的代码中,当我需要显示消息或设置标签文本时,我会使用以下内容:
this.lblStatusMessage.Content = Localization.Resources.OperationCancelled;
在此示例中:“OperationCancelled”是存在于所有资源文件中的条目。在西班牙语中,它的价值是“OperaciónCancelada”,在英语中它表示“取消操作”。
毕竟这个故事,这在我的开发环境中非常有用。我运行我的测试项目,我用英语看,然后我改变数据库中的语言,再次运行它并繁荣!西班牙。
但是
当我通过SVN提交对该项目的更改时,它会通过一些自动化过程部署到QA环境(这很棒)。然后我在那里测试,我总是看到西班牙语的内容(作为默认的)。即使我在QA数据库中更改语言,它也始终以西班牙语显示标签和消息。
我尝试了一些选择:
将资源dll的Build Action更改为Resource而不是Embedded Resource。它不起作用。
右键单击 - >属性,“资源”选项卡显示没有资源,因此我在那里创建了三个resx文件,并将自定义命名空间设置为MyProject.Localization。接下来我排除了我的原始文件,因为现在有一些歧义错误。它再次在我的开发机器上工作,但在QA中却没有。
有关于此的任何想法?我的假设是它与resx文件有关,也许它们没有被包含在最终构建或类似的东西中,这就是应用程序无法获取本地化文本的原因。
提前谢谢你。
答案 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。它们是在与其语言相对应的文件夹中创建的。就我而言,创建了两个文件夹:
在每个文件夹中,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,主可执行文件可以加载一切正常。快乐的结局。
我希望我很清楚,它可以帮助别人。欢呼声。