作者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)
→ Cypresslin:請問關於新增resx是在 專案->加入新項目嗎? 08/23 09:43
→ KawasumiMai:是的,裡面會看到能夠新增資源檔 08/23 11:11
→ KawasumiMai:而且獨立出來之後以後還可能可以選擇既有resx匯入 08/23 11:12
→ KawasumiMai:沒有耶,剛開始就可以了,在下是Win7+VS 2010 08/23 16:57
→ KawasumiMai:不然你可以試著將資料夾內的Form1.resx複製之後 08/23 16:57
→ KawasumiMai:重新命名並且匯入看看能不能用,應該是可以吃才對 08/23 16:58
→ Cypresslin:嗯...謝謝 有機會再來試試看 08/24 21:25