看板 WindowsPhone 關於我們 聯絡資訊
這是前幾天在寫APP的時候因為碰到語系轉換問題, 稍作研究後得到的結果,分享出來班門弄斧一下 因為Windows 8/8.1與Windows Phone 7/8的處理方式不同, 這篇只會先講Windows 8/8.1的 (不過認真說來我比較喜歡Windows Phone 7/8的方法......如何增加支援語系除外) 言歸正傳,這篇討論的是多語系轉換, 雖然記得有人曾經分享過懶人型的多語系自動翻譯套件 不過有些時候自己知道怎麼翻的話,還是推薦自己手動翻譯比較好。 Android是使用/res附掛xml資源檔的方式達成多語系 但Windows 8/8.1使用的則是.resw這種專門格式的檔案 (雖然用文字編輯器一開你就會發現其實仍是個xml檔) 不同於Windows Phone 7/8,Windows 8/8.1的資源字串有兩種類型 一種是多半的教學都會告訴你的x:Uid型「資源名稱.目標屬性」 另外一種則是只有資源名稱的類型 兩者的分別在於x:Uid型的必須搭配XAML來使用,另外一種就不需要。 (不過另外一方面來說,其實前者如果不硬是分成兩部分的話和後者也無差別就是) 一般而言都會告訴你應該要把這類資源檔放在「/Strings/語系/」路徑下 雖然有聽說只要有分出語系的話系統不會管這麼多 不過還是照規矩來比較好,另外,資源檔的名字必須是相同, 這樣系統才會把這些檔案都當成不同語系的同名檔案 (預設的檔名是Resources.resw,建議就不用改了) 所以如果你的APP支援繁體中文與簡體中文, 那麼你應該會有以下兩個檔案: /Strings/zh-TW/Resources.resw (繁體中文) /Strings/zh-CN/Resources.resw (簡體中文) 編輯的時候可以只先編輯一個,其他的就等你編輯好後直接Copy過去即可 .resw打開後可以看到有三個欄位,一個是名稱,第二個是值,最後一個是附註 重要的是前兩個,附註只是讓你&負責翻譯的人知道這個資源字串是拿來做什麼的 回到前面說明資源字串有兩種,第一種的x:Uid型 首先必須在XAML檔裡面以手動輸入x:Uid屬性,告知這個標籤使用的資源名稱 (注意這個屬性Visual Studio不會在屬性窗格中顯示,所以要自己輸入) 接著在.resw檔裡面就可以輸入「資源名稱.屬性名稱」來告知程式說 要在某個被命名為「資源名稱」的XAML控制項內的「屬性名稱」屬性中使用這個資源的值 編譯之後以不同的語系檢視APP,APP就會針對有指定的語系來切換資源檔顯示了 不過這樣的方法有個很大的缺陷,就是必須要先寫好才行 如果是無法使用XAML的x:Uid屬性,比方說動態磚上的APP名稱 或者是必須動態產生的控制項的話,這個就不適用啦 這個時候就輪到另一種類型(不帶屬性名稱)的資源字串出場了 首先是APP動態磚名稱的部分,可以在Package.appxmanifest的顯示名稱中 打上「ms-resource:(資源名稱)」的方式,這樣就會自動讀取resw檔中的資源名稱了 至於動態讀取資源字串,則是必須要使用ResourceLoader這個物件。 因為使用的機會可能不少,這邊是建議直接在App.xaml.cs裡面用static的方式建立 ResourceLoader本身並不是靜態物件,還是必須要去建立的 其使用的命名空間是Windows.ApplicationModel.Resources Windows 8與Windows 8.1的建立方式不太一樣, 在Windows 8可以直接使用new ResourceLoader()來建立 但是在Windows 8.1的話會跳出警告提示你以後可能會拿掉這個方法, 因此必須要改成ResourceLoader.GetForCurrentView()這個方法, 也就是下面這行: public static ResourceLoader ResourceLoader; 不過有件事還是得注意, 如果直接在App.xaml.cs裡面使用ResourceLoader.GetForCurrentView()方法的話, 系統在執行時會丟錯給你(可能是因為剛啟動就建立,所以抓不到主畫面?) 所以最好的方法應該是在呼叫ResourceLoader的程式碼前加這段 if (App.ResourceLoader == null) App.ResourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView(); 這樣就能確保ResourceLoader能夠載入也不會出錯了 至於載入資源字串的方式是使用ResourceLoader的GetString("(資源名稱)")方法 Windows Phone 7/8的資源字串使用方式雖然有差 不過從SDK文件看來Windows Phone 8.1的資源字串使用方式似乎跟這文章用的方法差不多 這大概會是移植前要先克服的事情吧...... Windows Phone 7/8的方式下篇再說(趴 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.112.253
felaray:下次分類直接改 [開發]好了~ 03/10 01:54
felaray:今天才仔細看了內容 原來是指多語言資源阿XD 03/10 13:44
嗯,老實說我不確定該怎麼稱呼而且標題字數有限制(默 ※ 編輯: hoyunxian 來自: 111.250.112.253 (03/10 14:01)
felaray:因為靜態字串讓我之前以為是變數之類 沒仔細看內容XDDD 03/10 14:07
YahooTaiwan:靜態通常是指static吧 03/10 17:59
內標題順便改一下 ※ 編輯: hoyunxian 來自: 111.250.112.253 (03/10 19:26)