【Windows 10 应用开发】细说文本资源文件(resw)
最近,小戲骨版《紅樓夢》很是火熱,老周一口氣看完了9集,一直看到 Surface 的風扇呼呼響。林黛玉和薛寶釵這兩個角色都演得不怎么樣,倒是演史湘云的娃娃演得不錯,老周甚是喜歡。
于是,昨晚就不寫代碼了,讓機器也休息一下。有人會問,看視頻能看到發熱?是的,一來,南方的天氣,雖說秋分已過,但仍然暑氣不消;二來嘛,老周是在網頁上看的,Flash 那個播放組件,你懂的,特特的耗性能。
好了,F話就不扯太多,今天咱們聊聊 UWP 開發中,一個比較重要,可很多人不當回事的知識點——文本資源。
別以為這個沒啥用,當你開發的應用需要多種語言的UI時,就會很TMD有用了。比如有中文版、英文版、法文版、雞文版、狗語版等。
在 UWP 應用中,文本資源有一類專用的文件來存放,后綴名為.resw,后面那個“w”可能是 Windows 的意思,也可能是 Word 的意思。不管它,反正你知道這類文件是專用于存放文本資源的就可以了。其實啊,resw 文件本質上就是一個 XML 文檔,就跟 .net 項目中的 .resx 文件差不多。resw 文件的架構也確實和 .resx 一樣,只不過,它只能加入字符串類型的資源條目罷了。
這是純技術性的玩意兒,你了解老周的,老周向來特特地不喜歡說太多玄之又玄的理論,拿到某個東西,我只要知道它是啥,干啥用,咋用就夠了,其實的事情老周不關心。
估計很多學編程的人,也會像老周這樣,最迫不及待的,就是馬上用用。好,接下來老周就細細說一下。
?
如何創建文本資源
既然存放文本資源的是一個resw文件,當然是在項目中【新建項】了,這個會用吧,不用我說了,你要是沒用 VS 的話,那你還不能開發 UWP 應用,該去學點幼兒園的課程。
在“新建項”窗口中,你會找到一項叫“資源文件”的,如下圖。
?
?再次嚴重強調一下,這個資源文件是放文本內容專用的,不是用來放片子的,記住了,放片子你可以直接以文件形式放到 Assets 目錄下,或者你自己建的目錄。
老周的演示項目是這樣的,先是在項目中建了個叫 TextDecs 的目錄,目錄名字是隨便取的,不動聽,請原諒,本來想叫“小薇”的,但擔心筆畫太多,截圖后看不清。然后下面建了兩個.resw文件。如下圖所示。
你一定猜到了,老周肯定想弄成簡體中文版和繁體中文版。對的,你很聰明。為什么不弄英文版呢。是這樣的,老周心里一直有一個痛處,當年英語四級考得特別好,差兩分才及格,所以心里一直放不下,雖然佛祖也勸了我幾次,不要太在意,但有時候還是得在意一下的,畢竟那是一次人生經歷。
如果你 UWP 境界比較高,你肯定看出來了,老周你這文件名不對。是的,這個命名待會兒運行的時候,一定會報錯的,但為了忽悠大家去看懂,所以我故意寫錯了。
那么,怎么寫才對呢?很 easy ,在語言標記前面加上“lang-”,或者你可以用完整的單詞“language-”,修改后就是這樣。
你一定又要問了,不是可以不加 lang 的嗎,為啥要加呢?是這樣的,這里有個規范,分兩種情況討論:
1、對于目錄,可以不加,你可以直接這樣命名:zh-CN、zh-TW。
2、對于文件,你應該加上 lang,比如:lang-zh-CN、lang-dog-KK。
?
因為我這個項目只用一個資源文件就夠了,所以,我直接在文件名上加語言標記,這是為了節約地球上的氧氣。如果你的應用項目需要有 N 個資源文件,例如,你每種語言都要兩個資源文件,那你就要建目錄了,把語言標記寫在目錄名上,然后每個目錄下的文件名相同即可。就像這樣。
-- zh-cn
?? | -- Res1.resw
?? | -- Res2.resw
-- zh-hk
?? | -- Res1.resw
?? | -- Res2.resw
這樣就很直觀了。
?
上面說的是如何安排資源文件,下面咱們聊聊怎么往里面輸入資源條目。
?
在項目中添加.resw 文件后,可以直接雙擊打開,VS 會使用.net 的資源文件編輯窗口打開。然后,這里頭的操作就跟以往的.net 項目一樣了。
比如,老周添加了以下內容。
?
?這里重點說說資源項怎么命名,大伙兒看到,我上面的命名,中間有個“.”,這個點是用來指定屬性名的。首先,你得確認一下,你的這條資源是要應用到哪個控件上的。比如我這里,名字為 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 來指定資源條目的名字就可以了,比如這樣。
<TextBox x:Uid="/Res/demo1"/><TextBox x:Uid="/Res/demo2"/>這個引用路徑是個相對路徑,它的寫法是:/<resw文件名>/<資源條目名>
但你要注意,書寫路徑時,不包括文件擴展名,也不包括語言區域標記名。.resw文件名為 Res.lang-zh-hans.resw,所以寫uid時,只寫 Res 就可以了。
不管你的資源文件放在項目的根目錄下,還是嵌套了多少層的子目錄,文件夾的路徑是不用寫的,只寫資源文件的名字即可,目錄路徑被忽略。正因為如此,resw 文件的名字必須在整個項目中是唯一的,因為應用程序在識別時是不管你在哪個目錄下的。
如果A目錄下有個t.resw,B目錄下又有個t.resw,就會沖突。
?
咱們不妨來試驗一下。我們建兩個名字相同的資源文件,然后放在不同的目錄下(同一目錄下當然不能放同名文件的),然后,我們分別在這兩個文件中添加一條目,都命名為 item1。如下圖所示。
這時候,你發現有兩個 Any.resw 文件,然后,按【F5】運行,會得到以下錯誤。
看到了吧,重復了吧。
?
這說明,無論 Any.resw 文件放在啥地方,應用程序只識別相對路徑 /Any。
現在,我們改一下,把其中一個 Any.resw 文件中的 item1 改為 item2。按照這邏輯,它應該識別為 /Any/item1 和 /Any/item2,這樣估計不會重復。
果然,這樣修改之后,就可以順利編譯了。
?
?
如何運行時改變語言
你可以在如下圖所示的應用清單文件編輯器中設置默認語言。
?
?這一般與SDK或VS的語言版本一致,其實,修改這里的默認語言是不能在應用程序中起作用的。比如,我改為 zh-hant,在運行后,并沒有顯示繁體的UI。
語言與區域的應用優先級相當的復雜,比解剖一頭豬還要復雜。既受應用程序設置的影響,也受系統設置的影響。微軟的官方文檔中,在“全球化與本地化”主題下列了個表格來說明問題,有興趣的話你可以看看,鏈接請點這里。
?
我們有一件比較要緊的事,就是在清單文件中指定一下你的應用支持哪些語言,當然,你不做這事也沒啥影響,經老周測試,不指定語言列表也照樣能扔上應用商店的。
不過嘛,咱們還是負責一點好,老周還是說說如何指定語言列表吧。這個你要做一個誠實的孩子,你應用中定義了幾種語言的資源,就寫上幾個。比如我剛剛那個,我定義了簡體中文和繁體中文,所以,我就寫上這哥兒倆。
方法是,右擊清單文件,執行【查看代碼】菜單,清單編輯器中沒有相關的位置讓你設置,所以就直接手動寫了。
找到?Resources 節點,默認的是?x-generate ,這個我也不知道是啥意思,大概跟編譯器的語言保持一致吧。因為我們要為自己的應用列個語言清單,所以這個?x-generate 就可以不要了。
我這個示例應用就應當這么寫。
<Resources><!--<Resource Language="x-generate" />--><Resource Language="zh-hant"/><Resource Language="zh-hans"/></Resources>反正,你做了幾種語言的資源,就寫上去就OK了。
?
如果你不想遵守地區語言的應用優先級,那設置應用的UI語言,最好的做法就是自己寫代碼來干活。此法是最自由,最能體現人格魅力的。
下面老周向各位介紹一些方法,是不是都可行呢,老周是無法保證的。來,咱們試試看。
?
方法A:XAML 法,這個方法失敗率大約為 98%,不信?試試。
<StackPanel Margin="16" Language="zh-hant"><TextBox x:Uid="/Res/demo1"/><TextBox x:Uid="/Res/demo2"/><Button Margin="0,13,0,0" x:Uid="/Res/demo3"/></StackPanel>我們知道,XAML 繼承了 XML 的許多特性,所以,這個 Language 也不例外。運行一下,結果……
呵呵,依然顯示簡體中文。
?
方法B:這個方法成功率為 100%,信不信由你。而且非常簡單,一行代碼就行。
如果不考慮動態切換,這個最好寫在APP的 OnLaunched 方法上。
if (e.PrelaunchActivated == false){ApplicationLanguages.PrimaryLanguageOverride = "zh-hant";if (rootFrame.Content == null){rootFrame.Navigate(typeof(MainPage), e.Arguments);}// 確保當前窗口處于活動狀態 Window.Current.Activate();}其實就這么一行。
?? ApplicationLanguages.PrimaryLanguageOverride = "zh-hant";
?
為什么要寫在判斷?PrelaunchActivated 屬性的代碼中呢。別忘了,UWP 有預啟動,在預啟動時是不顯示UI的,所以,只有需要顯示界面時再設置語言,這樣才有意義。當然,這只是適用于資源文件完全用于UI的情形,如果你要在代碼中動態加載一些內容,就不能等正式啟動了,應該在應用入口處就加載。
這樣一改后,然后運行,你會發現,界面顯示為繁體中文了。
?
因為上面那行代碼會強行修改當前應用的語言區域,所以它起作用了。
?
?
今天就說到這里,下回咱們說說如何在代碼中動態讀取資源。
本文示例源碼下載
?
總結
以上是生活随笔為你收集整理的【Windows 10 应用开发】细说文本资源文件(resw)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KEBA 控制器通过 NT50 连接西门
- 下一篇: otrs软件_OTRS首页、文档和下载