作者hoyunxian (WildDagger)
看板WindowsPhone
標題[開發] 如何撰寫支援多語系的APP - Win8
時間Mon Mar 10 00:42:54 2014
這是前幾天在寫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)