作者KawasumiMai (モウソウ×ボウソウ)
看板Visual_Basic
标题Re: [.NET] resx索引参照
时间Wed Aug 22 18:00:15 2012
※ 引述《Cypresslin (啊哈哈~~)》之铭言:
感谢大大的回应
目前软体已经大致完成了
解决的方法就是自己独立一个resx这样
: 发现整个要重打真的很令人崩溃
: 更惨的是我还不知道要怎麽独立一个resx出来,囧
: 翻了一下自己之前的发问文发现已经是2010年的文章了...
第一个问题在於,不管新增什麽字串在Form1.resx里面
只要变更了里面元件的属性,就算是text也一样
为了重编resx,他会把新增的部分全部删除的
因此才会选择把resx给独立出来
方法是新增项目,然後选择资源档
多出一个resx之後,重新命名(不能有"."符号)
resx = New Resources.ResourceManager("WindowsApplication1.lang_zh",
Me.GetType().Assembly)
假设你的程式识别名称叫做WindowsApplication1
新增的资源档叫做lang_zh.resx
那麽只要这行程式码就可以宣告吃哪个resx
接着resx.GetString("String1")
就是资源档里面的String1项目的内容
: 有点好奇为什麽会需要这个判断呢?如果跟着点部落的作法来做的话,只要在
: 预设语系以及新增语系的资源档中都有一共同名称之变数即可,程式启动时会
: 自己抓对应的语系下的变数,你会这样做不知道跟你是用独立的resx有没有关系?
: 还是说你是想要让所有zh开头的语系像是zh-Hant等等都指向使用正体中文这样?
是的,会使用Substring的原因
就是想要让zh等等的都使用正体中文
此外的确是跟独立resx有关系
原因後述
总之这里的程式码是
If(Thread.CurrentThread.CurrentUICulture.ToString.Substring(0, 2) = "zh")Then
resx = New Resources.ResourceManager("WindowsApplication.lang_zh",
Me.GetType().Assembly)
Else
resx = New Resources.ResourceManager("WindowsApplication.lang_ja",
Me.GetType().Assembly)
End If
: 怎麽个无法正确显示法?一片空白吗?
: 你可以在载入表单时让程式印出他所使用的CurrentUICulture看看
: 我记得程式启动时会抓对应的语言,万一没有找到就会用Default
: 还有如果程式给别人,记得要附上该语系的资料夹(如debug下的zh-TW资料夹)
这里是原因,VS设定的多语系介面真的非常麻烦
就算使用Localizable并且设定language了
不知道因为他判定的标准是CurrentCulture而非CurrentUICulture还是怎样
(一个是地区,一个是使用语言)
我的预设值是日文,只有繁体中文会用繁体
先别管一开始设定在zh而非zh-TW,结果抓语系出现一堆错误以外
就算独立出resx
留下介面的部分使用language切换制作
但是做好的程式丢给中文版XP的使用者
还是回报使用预设值(日文)
而且msgbox(CurrentUICulture)的结果也跟我说zh-TW
因此这个判定非常的麻烦
再加上每次只要更新之後,就得切换介面然後去找内容修改
而且跟前面所说的一样,只要修改过就会把新增的给砍掉
最後一气之下就直接把Form1.zh_TW.resx给砍掉了
直接新增lang_zh.resx自己写
: 这段我看不大懂,不过我遇上的问题就如前文所述,将msgbox的内文加入至资源档
: 後,只要对该介面有任何的变动那些变数都会被洗掉,最後处理方式是直接在主程
: 式空白处插入标签,并将其设定为不可见,这样不管新增几种语言,都会有一组对
: 应的标签可供修改,而且所有要改的东西都在上面,不用另外去检查资源档。
: 坏处嘛....要找程式空白处来塞这些标签也不大容易,另外开个表单的话应该就好办
我的作法是前面这样
使用CurrentUICulture判定抓取lang_zh.resx或lang_ja.resx之後
这两个资源档里面有着完全一样的字串名称
例如
lang_zh.resx
String1 这是中文
lang_ja.resx
String1 これは日本语
然後只要跟前面一样,判定CurrentUICulture之後
後面的程式码则是类似
Text1.text=resx.GetString("String1")
就会自动切换语系抓取了
缺点是
因为已经放弃依赖language的判定了,目前的程式只有预设值介面
然後Form1_load里面则会执行所有介面元件的文字指定
Text1.text=resx.GetString("String1")
Text2.text=resx.GetString("String2")
这样..
感觉整个就很落落长
不过只有需要依据语系判定的内容才要重新宣告
有些像是英文或是符号的,就直接让他保留预设值
所以其实也还好
优点则是
只要在判定CurrentUICulture之前
加上一行
Thread.CurrentThread.CurrentUICulture = New CultureInfo("zh-tw")
就可以很轻松的,直接测试中文语系的执行情况是否正常
而不需要丢给别人测试
或是自己切换中文语系之类的
非常方便
==
顺带一提
上面这种方法制作好的软体,不会产生任何语系dll
就结论来说
个人一定会选择将resx全部独立出来
至於Form1.resx就不管他去死了......
--
「问おう、贵方が私のマスターか。」
http://i.imgur.com/zIIBo.jpg
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.62.201.210
※ 编辑: KawasumiMai 来自: 61.62.201.210 (08/22 18:01)
1F:→ Cypresslin:请问关於新增resx是在 专案->加入新项目吗? 08/23 09:43
2F:→ KawasumiMai:是的,里面会看到能够新增资源档 08/23 11:11
3F:→ KawasumiMai:而且独立出来之後以後还可能可以选择既有resx汇入 08/23 11:12
5F:→ KawasumiMai:没有耶,刚开始就可以了,在下是Win7+VS 2010 08/23 16:57
7F:→ KawasumiMai:不然你可以试着将资料夹内的Form1.resx复制之後 08/23 16:57
8F:→ KawasumiMai:重新命名并且汇入看看能不能用,应该是可以吃才对 08/23 16:58
9F:→ Cypresslin:嗯...谢谢 有机会再来试试看 08/24 21:25