看板 Visual_Basic 關於我們 聯絡資訊
※ 引述《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
Cypresslin:唔...我的沒有 怪哉 http://ppt.cc/-rgU 有啥要設定嗎 08/23 11:45
KawasumiMai:沒有耶,剛開始就可以了,在下是Win7+VS 2010 08/23 16:57
KawasumiMai:http://i.imgur.com/hclgc.png 看圖案好像真的沒有 08/23 16:57
KawasumiMai:不然你可以試著將資料夾內的Form1.resx複製之後 08/23 16:57
KawasumiMai:重新命名並且匯入看看能不能用,應該是可以吃才對 08/23 16:58
Cypresslin:嗯...謝謝 有機會再來試試看 08/24 21:25