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

來源:互聯網
上載者:User

標籤:修改   https   右擊   eof   net   img   window   panel   意思   

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

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

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

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

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

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

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

 

如何建立文本資源

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

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

 

 再次嚴重強調一下,這個資源檔是放常值內容專用的,不是用來放片子的,記住了,放片子你可以直接以檔案形式放到 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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.