天天看點

【Windows 10 應用開發】細說文本資源檔案(resw)

最近,小戲骨版《紅樓夢》很是火熱,老周一口氣看完了9集,一直看到 Surface 的風扇呼呼響。林黛玉和薛寶钗這兩個角色都演得不怎麼樣,倒是演史湘雲的娃娃演得不錯,老周甚是喜歡。

于是,昨晚就不寫代碼了,讓機器也休息一下。有人會問,看視訊能看到發熱?是的,一來,南方的天氣,雖說秋分已過,但仍然暑氣不消;二來嘛,老周是在網頁上看的,Flash 那個播放元件,你懂的,特特的耗性能。

好了,F話就不扯太多,今天咱們聊聊 UWP 開發中,一個比較重要,可很多人不當回事的知識點——文本資源。

别以為這個沒啥用,當你開發的應用需要多種語言的UI時,就會很TMD有用了。比如有中文版、英文版、法文版、雞文版、狗語版等。

在 UWP 應用中,文本資源有一類專用的檔案來存放,字尾名為.resw,後面那個“w”可能是 Windows 的意思,也可能是 Word 的意思。不管它,反正你知道這類檔案是專用于存放文本資源的就可以了。其實啊,resw 檔案本質上就是一個 XML 文檔,就跟 .net 項目中的 .resx 檔案差不多。resw 檔案的架構也确實和 .resx 一樣,隻不過,它隻能加入字元串類型的資源條目罷了。

這是純技術性的玩意兒,你了解老周的,老周向來特特地不喜歡說太多玄之又玄的理論,拿到某個東西,我隻要知道它是啥,幹啥用,咋用就夠了,其實的事情老周不關心。

估計很多學程式設計的人,也會像老周這樣,最迫不及待的,就是馬上用用。好,接下來老周就細細說一下。

既然存放文本資源的是一個resw檔案,當然是在項目中【建立項】了,這個會用吧,不用我說了,你要是沒用 VS 的話,那你還不能開發 UWP 應用,該去學點幼稚園的課程。

在“建立項”視窗中,你會找到一項叫“資源檔案”的,如下圖。

【Windows 10 應用開發】細說文本資源檔案(resw)

 再次嚴重強調一下,這個資源檔案是放文本内容專用的,不是用來放片子的,記住了,放片子你可以直接以檔案形式放到 Assets 目錄下,或者你自己建的目錄。

老周的示範項目是這樣的,先是在項目中建了個叫 TextDecs 的目錄,目錄名字是随便取的,不動聽,請原諒,本來想叫“小薇”的,但擔心筆畫太多,截圖後看不清。然後下面建了兩個.resw檔案。如下圖所示。

【Windows 10 應用開發】細說文本資源檔案(resw)

你一定猜到了,老周肯定想弄成簡體中文版和繁體中文版。對的,你很聰明。為什麼不弄英文版呢。是這樣的,老周心裡一直有一個痛處,當年英語四級考得特别好,差兩分才及格,是以心裡一直放不下,雖然佛祖也勸了我幾次,不要太在意,但有時候還是得在意一下的,畢竟那是一次人生經曆。

如果你 UWP 境界比較高,你肯定看出來了,老周你這檔案名不對。是的,這個命名待會兒運作的時候,一定會報錯的,但為了忽悠大家去看懂,是以我故意寫錯了。

那麼,怎麼寫才對呢?很 easy ,在語言标記前面加上“lang-”,或者你可以用完整的單詞“language-”,修改後就是這樣。

【Windows 10 應用開發】細說文本資源檔案(resw)

你一定又要問了,不是可以不加 lang 的嗎,為啥要加呢?是這樣的,這裡有個規範,分兩種情況讨論:

1、對于目錄,可以不加,你可以直接這樣命名:zh-CN、zh-TW。

2、對于檔案,你應該加上 lang,比如:lang-zh-CN、lang-dog-KK。

因為我這個項目隻用一個資源檔案就夠了,是以,我直接在檔案名上加語言标記,這是為了節約地球上的氧氣。如果你的應用項目需要有 N 個資源檔案,例如,你每種語言都要兩個資源檔案,那你就要建目錄了,把語言标記寫在目錄名上,然後每個目錄下的檔案名相同即可。就像這樣。

-- zh-cn

   | -- Res1.resw

   | -- Res2.resw

-- zh-hk

這樣就很直覺了。

上面說的是如何安排資源檔案,下面咱們聊聊怎麼往裡面輸入資源條目。

在項目中添加.resw 檔案後,可以直接輕按兩下打開,VS 會使用.net 的資源檔案編輯視窗打開。然後,這裡頭的操作就跟以往的.net 項目一樣了。

比如,老周添加了以下内容。

【Windows 10 應用開發】細說文本資源檔案(resw)

 這裡重點說說資源項怎麼命名,大夥兒看到,我上面的命名,中間有個“.”,這個點是用來指定屬性名的。首先,你得确認一下,你的這條資源是要應用到哪個控件上的。比如我這裡,名字為 demo1 的資源條目是應用到 TextBox 控件上的,是以整個條目的名字為 demo1.Header ,即,如果UI上某個 TextBox 控件引用了這條資源,那麼,就會自動使用該資源條目中的值來填充 TextBox 控件的 Header 屬性。

第二個條目中的道理也一樣,用該條目中的文本值來填充 TextBox 控件的 PlaceholderText 屬性。一樣的道理,demo2 的用途一樣,其應用目标依然是 TextBox 控件。

demo3 是用到 Button 控件上的,我們都知道,Button 控件有 Content 屬性,如果某個按鈕引用了 demo3 資源,那麼,就會用對應的資源值去填充按鈕的 Content 屬性。

resw 資源一般可以将能夠直接以文本形式指派的内容來填充控件屬性,除了上面說的屬性外,像 Width、Height 這些屬性也是可以的,比如,你可以添加這樣的資源條目。

demo4.Width   -->   700

這裡資源條目的名字為 demo4 ,它可以設定控件的寬度為 700。

盡量使用文本内容,或者可以直接轉化為文本的值,不要使用過于複雜的内容,複雜對象許多時候用文本無法表示的。

資源檔案做好了,那麼如何在XAML代碼中引用呢。這裡要用到一個叫 uid 的擴充标記。

還是用前面的例子,剛才大夥看到了,老周添加的資源條目分别為 demo1、demo2、demo3,對的,你在要引用資源的控件聲明中,直接使用 uid 來指定資源條目的名字就可以了,比如這樣。

這個引用路徑是個相對路徑,它的寫法是:/<resw檔案名>/<資源條目名>

但你要注意,書寫路徑時,不包括檔案擴充名,也不包括語言區域标記名。.resw檔案名為 Res.lang-zh-hans.resw,是以寫uid時,隻寫 Res 就可以了。

不管你的資源檔案放在項目的根目錄下,還是嵌套了多少層的子目錄,檔案夾的路徑是不用寫的,隻寫資源檔案的名字即可,目錄路徑被忽略。正因為如此,resw 檔案的名字必須在整個項目中是唯一的,因為應用程式在識别時是不管你在哪個目錄下的。

如果A目錄下有個t.resw,B目錄下又有個t.resw,就會沖突。

咱們不妨來試驗一下。我們建兩個名字相同的資源檔案,然後放在不同的目錄下(同一目錄下當然不能放同名檔案的),然後,我們分别在這兩個檔案中添加一條目,都命名為 item1。如下圖所示。

【Windows 10 應用開發】細說文本資源檔案(resw)

這時候,你發現有兩個 Any.resw 檔案,然後,按【F5】運作,會得到以下錯誤。

【Windows 10 應用開發】細說文本資源檔案(resw)

看到了吧,重複了吧。

這說明,無論 Any.resw 檔案放在啥地方,應用程式隻識别相對路徑 /Any。

現在,我們改一下,把其中一個 Any.resw 檔案中的 item1 改為 item2。按照這邏輯,它應該識别為 /Any/item1 和 /Any/item2,這樣估計不會重複。

果然,這樣修改之後,就可以順利編譯了。

你可以在如下圖所示的應用清單檔案編輯器中設定預設語言。

【Windows 10 應用開發】細說文本資源檔案(resw)

 這一般與SDK或VS的語言版本一緻,其實,修改這裡的預設語言是不能在應用程式中起作用的。比如,我改為 zh-hant,在運作後,并沒有顯示繁體的UI。

語言與區域的應用優先級相當的複雜,比解剖一頭豬還要複雜。既受應用程式設定的影響,也受系統設定的影響。微軟的官方文檔中,在“全球化與本地化”主題下列了個表格來說明問題,有興趣的話你可以看看,連結請點這裡。

我們有一件比較要緊的事,就是在清單檔案中指定一下你的應用支援哪些語言,當然,你不做這事也沒啥影響,經老周測試,不指定語言清單也照樣能扔上應用商店的。

不過嘛,咱們還是負責一點好,老周還是說說如何指定語言清單吧。這個你要做一個誠實的孩子,你應用中定義了幾種語言的資源,就寫上幾個。比如我剛剛那個,我定義了簡體中文和繁體中文,是以,我就寫上這哥兒倆。

方法是,右擊清單檔案,執行【檢視代碼】菜單,清單編輯器中沒有相關的位置讓你設定,是以就直接手動寫了。

找到 Resources 節點,預設的是 x-generate ,這個我也不知道是啥意思,大概跟編譯器的語言保持一緻吧。因為我們要為自己的應用列個語言清單,是以這個 x-generate 就可以不要了。

我這個示例應用就應當這麼寫。

反正,你做了幾種語言的資源,就寫上去就OK了。

如果你不想遵守地區語言的應用優先級,那設定應用的UI語言,最好的做法就是自己寫代碼來幹活。此法是最自由,最能展現人格魅力的。

下面老周向各位介紹一些方法,是不是都可行呢,老周是無法保證的。來,咱們試試看。

方法A:XAML 法,這個方法失敗率大約為 98%,不信?試試。

我們知道,XAML 繼承了 XML 的許多特性,是以,這個 Language 也不例外。運作一下,結果……

呵呵,依然顯示簡體中文。

方法B:這個方法成功率為 100%,信不信由你。而且非常簡單,一行代碼就行。

如果不考慮動态切換,這個最好寫在APP的 OnLaunched 方法上。

其實就這麼一行。

   ApplicationLanguages.PrimaryLanguageOverride = "zh-hant";

為什麼要寫在判斷 PrelaunchActivated 屬性的代碼中呢。别忘了,UWP 有預啟動,在預啟動時是不顯示UI的,是以,隻有需要顯示界面時再設定語言,這樣才有意義。當然,這隻是适用于資源檔案完全用于UI的情形,如果你要在代碼中動态加載一些内容,就不能等正式啟動了,應該在應用入口處就加載。

這樣一改後,然後運作,你會發現,界面顯示為繁體中文了。

【Windows 10 應用開發】細說文本資源檔案(resw)

因為上面那行代碼會強行修改目前應用的語言區域,是以它起作用了。

今天就說到這裡,下回咱們說說如何在代碼中動态讀取資源。

本文示例源碼下載下傳