莫名其妙的Silverlight资源文件引用问题

使用资源文件实现C#国际化(Silverlight中英文的实现) 利用资源文件实现中英文多语言,以下是实现步骤: 1.创建资源文件 右键单击项目名称,在“添加新项”对话框中,选择“资源文件” 可以命名为 MainLabelResources.resx。此文件包含应用程序默认语言的资源。 最常用的是字符串资源。字符串资源是一种键-值(还有备注)方式的表,如下图: //(默认语言的资源 Access Modifier 需设置成Public) 接着创建 阅读详情

问题描述

最近项目中遇到一个和资源文件相关的很奇怪的问题。有一个Silverlight应用会根据当前Url中的某个特定参数来决定使用什么文化的资源文件(关于资源的文件的使用见Silverlight 2 RTM 多国语言支持)。在其他机器上运行没有问题,传入zh-Hans和en-US界面都能正确显示相应语言的文字。但是在我的系统上却不管传入什么都是显示的英文文字。

问题分析

打开工程看了一下,在资源文件夹下只定义了两个资源,一个是主资源XXX.resx,一个是英文中立资源XXX.en.resx。编译之后,主资源会被打包到主程序集中,而其他资源则被编译成独立的程序集,称为卫星程序集。Silverlight代码中在提取Url参数的时候也加上了一个检测逻辑,就是如果传入的语言不是英文,那么就使用zh-Hans。也就是说在其他人的机器上,如果你输入了fr,那么也是显示中文。分析加调试弄了好一会之后,我判定应该不是程序代码的bug。因为在某些人的机器上是正常的,而在我的机器还有另外一个同事的机器上却不正常,而且问题是可重现的。这说明了问题和本地环境有关。

清缓存,清Silverlight独立存储之后发现问题依然存在。难道是操作系统的问题?!我用的是win7,同事用的是win2008,都是高版本的windows,而其他人用的不是xp就是2003。为了证实我的想法,我又找了一台2008的机器,测试结果和我机器上的一样。看来很有可能问题就在这。可是,为什么呢?

为了查找问题的原因,我重新查阅了一下Silverlight使用资源文件的相关材料(和DotNet其实差不多)。

Silverlight的资源查找方式

Silverlight采用中心辐射型结构来打包和部署资源文件程序集。围绕在中心的是主程序集里面的资源,这个资源也被称为中立或者默认资源。如果主程序集没有显式设定语言,那么一个资源要是查找失败,最终会使用主程序集中的资源。每个辐射点指向的是每一种语言对应的卫星程序集。

Silverlight在查找资源文件的时候采用了如下的方式:

image

最顶级是应用程序的默认程序集。第二级是语言相关程序集,它代表的是地域无关的语言文化,如英文,简体中文,繁体中文(zh-Hant)等;第三级是和地域相关的文化程序集,如美国英语,英国英语,大陆简体中文,新加坡简体中文。Silverlight在加载本地资源的时候首先会根据CultureInfo.CurrentUICulture属性来判断应该加载哪一种文化对应的资源。在查找的时候是按照上面的层次结构从下到上进行查找的。具体说来,当ResourceManager在查找一个资源时会经过以下几个步骤:

1. 查找具体语言相应的程序集是否存在。如设置了zh-CN,那么就查找XXX.zh-CN.resx资源文件是否存在(存在于卫星程序集中),如果程序集不存在或者在该程序集中找不到此资源的定义,那么查找失败。如果操作系统支持回溯(Fallback)逻辑,那么跳到第二步;否则跳到第三步。

2. 操作系统提供一份推荐的语言回溯清单,上面包含了具体语言文化字符串(如en-US)和相应的中立语言字符串(如en)。Resource Manager会根据这份清单去查找相应的卫星程序集和程序集内指定资源是否存在。如果查找失败,则跳到下一步。

3. 如果上面两步都失败,那么查找此具体文化的上一级文化的卫星程序集,也就是地域无关的文化,例如en-US查找失败,则查找en是否存在。

4. 如果上面3步都失败的话,那么Silverlight会查看主程序集的NeutralResourcesLanguageAttribute属性。NeutralResourcesLanguageAttribute是用在程序集上的属性,它是用来告知ResourceManager,某个程序集使用的语言是什么。ResourceManager会查看此属性的值,看是否满足条件。如果主程序集没有指定此属性,那么将会使用主程序集中的资源作为默认资源。

5. 如果第4步也查找失败,那么ResourceManager将使用文化无关(Invarient Culture)的资源。

问题所在

在网上查到MSDN的文章说,自打Vista开始,操作系统开始支持这种“Fallback”的逻辑了。通过系统API GetThreadPreferredUILanguages可以获取操作系统核心推荐使用的语言清单。

由于工程里面并没有指定zh-Hans的资源文件(于是也就没有zh-Hans的卫星程序集),也没有设置主程序集使用的语言是什么(通过NeutralResourcesLanguageAttribute属性指定)因此在第一步的时候查找失败;这个时候,在我win7的机器上,由于操作系统支持fallback逻辑,因此Silverlight会使用操作系统提供的语言清单去查找,由于我的系统是中文系统,因此清单上第一项肯定是zh-CN,接下来的猜测应该是en-US和en(老美搞的操作系统嘛,当然要把自家语言排前一点了)。查找zh-CN肯定又失败,但是查找en却能够找到,因此就出现了不管你参数中输入什么语言文化字符串,都会显示英文。

而在其他低版本的windows上,因为操作系统不支持这份清单,那么Silverlight始终没有办法找到zh-Hans相关的卫星程序集,而主程序集又没有显式的设置语言,因此ResourceManager就会使用主程序集里面的资源文件,也就是中文。

这就是为什么在低版本windows上,乱输入语言,显示的默认是中文,而在Vista等高版本windows上,默认显示的是英文的缘故。

再插一句,如果在主程序集中显式设置了NeutralResourcesLanguageAttribute为zh-Hans,然后在低版本的windows上访问此应用程序的时候输入例如fr等不支持的语言,那么Silverlight将会使用语言无关的资源(语言无关的资源具体被定义在哪不是很确定,可能是dotnet类库,也可能是本地操作系统),如果该语言无关的资源没有定义,则ResourceManager得到的是空字符串。因为此时ResourceManager就不会把主程序集里的资源当作最终Fallback的资源了。

解决问题的办法

经过上面的分析,解决问题的办法已经很清楚了,要么再添加一个zh-Hans的资源文件,要么显式的使用NeutralResourcesLanguageAttribute通知ResourceManager,主程序集使用的资源语言是zh-Hans。

——Kevin Yang

解决silverlight无法卸载的方法 情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中的原始安装包文件呢   这种错误会令人抓狂 不过 还是有解决方法的:   打开注册表工具regedit 在“开始 >运行”中执行命令regedit 找到路径 My Computer >   HKEY CLASSES ROOT > INSATLLER > PRODUCTS > {D7314F9862C648A4DB8BE2A5B47BE100} 然后删除它(注意 在删除注册表键值之前 请右键点击要删除的键值 通过导出功能来做备份 一旦删除之后发生问题 可以通过双击之前导出的注册表文件进行恢复) 退出注册表工具   再试试安装silverlight或升级 是否成功了 反正我是成功了 祝你也好运   情况二及解决方法:   如果在使用windows update更新时 发现某个更新总是安装失败 并且错误代码是643 那么通常都是由于该更新所对应的组件损坏 导致该更新无法安装成功 要解决这个问题 通常都需要将该组件卸载之后重新安装来进行修复 如果无法安装的更新是Microsoft Silverlight的更新 首先需要做好准备的是下载独立的Microsoft Silverlight安装包   方法一:下载Windows Installer clean up工具并安装 在开始菜单中打开它并找到与silverlight相关的项目 将其删除 完成后重新启动计算机 再次安装Microsoft Silverlight并尝试更新 ">情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中 [更多] 立即下载

相关推荐

逆向工程实战:从零解析微信PC版协议,并用开源代码构建你的私有化接口

本文详细解析了微信PC版的通信协议架构,从逆向工程基础到网络流量捕获、关键函数定位与HOOK技术实践,最终通过开源代码构建私有化接口。文章重点介绍了协议特征分析、HOOK技术应用以及安全实践,帮助开发者深入理解企业级通信协议的设计逻辑和安全机制。

weixin_30496999的博客 391

资源与本地化(三)

本文来自:http://www.csharpwin.com/csharpspace/327.shtml Satellite Assemblies(卫星程序集) 当你编译有如图6所示本地化资源的工程时,Visual Studio不会把所有的资源都编译进一个单独的输出程序集,相反它把每个本地化资源文件单独编译进它自己的程序集。每个本地化程序集仅仅包含资源没有代码,这种仅仅有本地化资源的程序集被称之

chengj814957005的专栏 1148

SpringBoot 自定义注解来实现动态切换数据源

/ 初始化数据源@Override@Inherited@Pointcut(“@annotation(包名.aop.DataSource)”) public void@Pointcut 注解定义了一个切点,名称为 dynamicDataSource。@annotation(包名.aop.DataSource) 表示这个切点匹配所有带有 @DataSource 注解的方法。

晴天飛 雪的博客 1836

提高 ASP.NET Web 应用性能的 24 种方法和技巧

在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧。众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员。 那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点。 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置...

weixin_34249678的博客 326

如何用 Python 实现自动化测试?详细步骤和代码示例

Python自动化测试实战指南 本文系统介绍了使用Python构建自动化测试体系的完整方案。主要内容包括: 环境搭建:Python 3.8+虚拟环境配置,安装pytest、Selenium等核心测试库 分层测试实现: 单元测试:通过计算器示例演示pytest断言和异常测试 API测试:使用requests库进行RESTful接口验证 UI测试:Selenium WebDriver实现网页交互测试 高级特性: 使用fixture管理测试依赖 参数化实现数据驱动测试 生成HTML和Allure测试报告 GitH

m0_64424835的博客 448

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute'

原因: In .Net 4.5 the ExtensionAttribute class was moved from System.Core to mscorlib.ExtensionAttribute 类在4.5中从System.Core迁移到mscorlib中,项目运行时会按4.5的方法寻找导致异常。 有人会说,项目都是按4.0编译的,4.5也卸载了,为什么还会出现此问题?原因在于引用的...

技术专栏 8182

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 373

莫名其妙的 Silverlight资源文件引用问题

 莫名其妙的Silverlight资源文件引用问题莫名其妙的 Silverlight资源文件引用问题<br />本文来自Kevin Yang博客 作者:Kevin Yang<br />问 题描述<br />最近项目中遇到一个和资源文件相关的很奇怪的问题。有一个Silverlight应用会根据当前Url中的某个特 定参数来决定使用什么文化的资源文件(关于资源的文件的使用见Silverlight 2 RTM 多国语言支持 )。在其他机器上运行没有问题,传入zh-Hans和en-US界面都能正确显示相

lionzl的专栏 724

qq对接openclaw,通过qq发送命令

把 OpenClaw 接入 QQ 和微信,目前主流的微信文章和教程主要提供了两种截然不同的路径。我为你梳理了它们的核心区别和关键步骤,你可以根据自己的需求来选择。

suny8的专栏 270

OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战

【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。

m0_67505153的博客 187

Silverlight资源文件

  资源文件通常是您的应用程序使用的任意非可执行的数据文件,如图像、音频和视频文件。资源文件在某些上下文中还可能具有特定的含义。例如,在应用程序本地化的上下文中,资源文件指代 .resx 文件,您可以在本地化的附属程序集中部署这些文件。 使用 Silverlight,您可以通过以下方式部署资源文件: 作为应用程序包中的单个文件。 作为按需检索的单个文件。

光脚丫思考的专栏 1841

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4677

Silverlight中资源文件的引用

1、新建一个资源文件,比如: Gaugestyle.xaml和MenuButton.xaml2、在App.xaml中添加该资源:<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml

分享经验,共同进步. 2456

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分析silverlight里的URI引用资源文件的各种情况

主要介绍一下在silverlight里的资源文件(图片, 视频, 字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题. 就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项, 并可以更改) 假如我们有两个图片文件分别叫silverlight.png和sl.jpg, 把silver

手机程序开发技术文章集锦(iPhone&amp;amp;Window phone) 967

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Silverlight中URI引用的资源文件

 主要介绍一下在silverlight里的资源文件(图片, 视频, 字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题. 就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项, 并可以更改) 假如我们有两个图片文件分别叫silverlight.png和sl.jpg, 把si

z1072187222的专栏 344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Silverlight, RIA Services, Data Annotation与本地化资源文件共享

在RIA Services中使用Data Annotations可以非常方便的实现数据验证,并且Data Annotation可通过资源文件.resx实现本地化。这里最大的挑战是如何在Silverlight端与WCF端共享资源文件。 如何实现资源文件的共享? 服务端项目文件设置(VB.NET项目)如下: 图1-1: 服务端资源文件 - ValidationStrings.D

个人沉淀 4185

silverlight 如何引用其它程序集

今天遇到个问题!!!!虽然不是我遇到的但是我还是灰常感兴趣,于是想解决掉。 具体问题,假如你有个silverlight的项目现在你想引用 非silverlight的程序集。 那么VS2010会提示说,亲不好意思╭(╯3╰)╮。你不能引用非silverlight的其它程序集哦,我整个人都凌乱了。 经过了一早上的思想斗争,我最终还是没找到办法。撒子办法都想过了。 最后老夫疯了...

weixin_30765475的博客 194

解决Silverlight引用中文字体的问题(转)

(http://www.imkevinyang.com/2009/09/%E8%A7%A3%E5%86%B3silverlight%E5%BC%95%E7%94%A8%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93%E7%9A%84%E9%97%AE%E9%A2%98.html)问题描述<br />在Silverlight程序中,对文字设置了中文字体之后不起任何作用。问题分析<br />Silverlight内置了十几种常见拉丁字体,如Arial,Comic Sans MS,Cour

梦泣的专栏 894
上一篇: 跨域下请求Silverlight Xap包引起的问题
下一篇: Silverlight的依赖属性与附加属性
丰盘ECM产研团队博客
博客等级 码龄20年 123粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值