Silverlight 5 中的资源文化问题

Posted

技术标签:

【中文标题】Silverlight 5 中的资源文化问题【英文标题】:Resources Culture issue in Silverlight 5 【发布时间】:2013-12-17 17:03:50 【问题描述】:

对不起,我的英语提前,这是我在这里的第一篇文章。 我对 RESX 有一个奇怪的问题,Silverlight 中支持的文化。 它的 Silverlight 应用程序有 1 个启动整个 silverlight 应用程序的 web(asp.net)项目、1 个主项目(silverlight、sl.Application)和其他在主项目中用作模块(silverlight)的项目(解决方案资源管理器屏幕:http://i.imgur.com/A4sHWRI.png?1) . Sl.Application 可以调用其他项目并将他们的视图用作放置在 sl.application 中的主视图的一部分

我尝试添加不同的文化,所以:

我将支持的文化 EN 和 CS 添加到我的应用到每个 cs.proj。

<SupportedCultures>pl;en;cs;de;ru;cz;sk</SupportedCultures>

我的中立文化在每个项目的程序集信息中设置为 PL。

[assembly: NeutralResourcesLanguageAttribute("pl-PL")]

为不同的文化创建 resx 文件,此处为 PL、EN、CS:http://i.imgur.com/P6woiV2.png

在启动应用程序时,您可以通过单击特定标志来选择您想要的文化。 首先让我们从 PL 开始——它的中立文化,所以我不必改变任何东西。使用

var culture = System.Threading.Thread.CurrentThread.CurrentUICulture;

var test_en = Resources.DrivesBook.ResourceManager.GetString("AdresArrival", culture);

我检查了文化设置为 PL 并且资源 (DriveBook.resx) 在 PL 中返回正确的字符串

下一步: 让我们试试 EN,启动应用程序,选择 EN 标志 - 将文化更改为 en-GB。

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-GB");

使用与上面相同的代码,返回 EN 字符串,所以它仍然很好

当我尝试使用 CS 时,最好的开始。 同上,我选择 CS flag - change culture to cs-CZ 在 SL.Application 中使用

var culture = System.Threading.Thread.CurrentThread.CurrentUICulture;

它返回我 cs-CZ 文化,所以我认为当我打电话时会好的

var test_cs = Resources.DrivesBook.ResourceManager.GetString("AdresArrival", culture);

它从 CS 文化返回我的字符串,仍然一切正常,那么问题出在哪里?

当我在其他项目(来自 Common 或 Modules 文件夹)中尝试相同时,魔法就来了 :)

同上 在 Modules.Auxiliary 中使用

var culture = System.Threading.Thread.CurrentThread.CurrentUICulture;

还可以,我们有 cs-CZ 文化,似乎工作正常,但是

var test_cs = Resources.DrivesBook.ResourceManager.GetString("AdresArrival", culture);

它返回我来自 PL 文化的字符串,而不是来自 CS

总结: 更改文化效果很好,对于 EN,整个应用程序从 resx 文件中获取了 EN 字符串,但是当我更改为 CS 时,只有 SL.Application 可以解析 *.cs.resx 文件,其他项目看起来他们没有看到 *.cs.resx文件。虽然添加 En 和 CS 我对两者的工作完全相同,并且 EN 工作正常,但 CS 不是。它有可能在 cs.proj 中有一些属性限制当前项目中支持的最大文化,或者你知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

好的,我自己解决了 问题出在我的自定义框架中,该框架负责差异加载资源。仅通过文件名解析dll,不包括filePath(此处为文件夹cs,不同文化的en)导致根据词法顺序覆盖文件,因此首先加载CS.resx,但后来我加载EN资源并覆盖cs.resx。这个框架在加载主 xap 时开始工作。主要 sl 项目有效,因为它是较早加载的,例如用于加载屏幕,因此当我的框架无法损坏它时加载了 resource.cs.resx

【讨论】:

以上是关于Silverlight 5 中的资源文化问题的主要内容,如果未能解决你的问题,请参考以下文章

我可以从页面类设置 Silverlight 应用程序的文化吗?

WCF 轮询双工绑定和非 Silverlight 客户端

WPF 与 Silverlight - 资源中的数据绑定

Asterisk 中的 BackgroundDetect() 应用程序

找不到适合指定文化或中性文化的任何资源

确定 UWP 中的 Windows 10 选择了哪种资源文化回退