網頁 貼吧 文章 作者 工作  
網頁搜尋
 
 愛PO吧 >> 史萊姆好玩遊戲 >> 瀏覽文章
回覆 加入我的最愛 與好友分享

關於讓WPF軟件界面支持全球化和本地化

本被文章 0 次, 共有回覆 5  
0
 
0
?于?WPF?件界面支持全球化和本地化 關於讓WPF軟件界面支持全球化和本地化
周??有朋友??如何?WPF?用能?提供多?言支持(中文,英文,日文.....),我的建?是:(1)??WinForm?代的?源存?方式(2)利用WPF的???源特性. 周銀輝有朋友詢問如何讓WPF應用能夠提供多語言支持(中文,英文,日文.....),我的建議是:(1)拋棄WinForm時代的資源存儲方式(2)利用WPF的動態資源特性.
下面??介?一下并打造一???的DEMO: 下面簡單介紹一下並打造一個簡單的DEMO:

1,?言?源文件怎?存?
我?知道以前(WPF以前)我??界面上的各??言分?存?在.resx?型的文件中,然后利用ResourceManager?得到相??源并根据?地的CultureInfo??界面文本?值.?是可行的.但在WPF中存在的一???是:我?必??每?控件在后台代?中?Code?些??,因?XAML是找不到.resx?型中的?源的.但WPF中?大多?界面元素都是在XAML中定?的?是一件很麻?的事情.所以我???????的做法. 1,語言資源文件怎樣存儲
我們知道以前(WPF以前)我們將界面上的各國語言分別存儲在.resx類型的文件中,然後利用ResourceManager來得到相應資源並根據當地的CultureInfo來給界面文本賦值.這是可行的.但在WPF中存在的一個問題是:我們必須為每個控件在後台代碼中來Code這些邏輯,因為XAML是找不到.resx類型中的資源的.但WPF中絕大多數界面元素都是在XAML中定義的這是一件很麻煩的事情.所以我們應該拋棄這樣的做法.
WPF中的?源?承了以前的多种存?形式,但可以在XAML和C#(或其他)中通行的有?中,一?是Content,一?是Resource,前者是"?容",既是松散的?源?接,后者是被??并嵌入的?源,注意,你在?置?源文件?性的?候????有一?很?人混淆的FTP傳輸.下載.遠端控制工具Embedded Resource ,?也是?嵌的?源,但其被???二?制形式,既和以前WinForm的?嵌?源相同,Resource和Embedded Resource在??上的??是前者可以通?Uri找到,?是XAML需要的DVD卡通.戲劇(電腦撥放)方式,后者可以通?Stream找到,?可以通???c#代??查找?源. WPF中的資源繼承了以前的多種存儲形式,但可以在XAML和C#(或其他)中通行的有兩中,一個是Content,一個是Resource,前者是"內容",既是鬆散的資源鏈接,後者是被編譯並嵌入的資源,注意,你在設置資源文件屬性的時候會發現還有一個很讓人混淆的Embedded Resource ,這也是內嵌的資源,但其被壓縮為二進制形式,既和以前WinForm的內嵌資源相同,Resource和Embedded Resource在編碼上的區別是前者可以通過Uri找到,這是XAML需要的方式,後者可以通過Stream找到,這可以通過編寫c#代碼來查找資源.
所以,在?里看?Content是我?保存?言?源的良好方式,由于其是松散的?源?接,所以??用程序添加新的?言包?就可以不重新??了,只需??象的?言文件拷?到指定的文件?即可. 所以,在這裡看來Content是我們保存語言資源的良好方式,由於其是鬆散的資源鏈接,所以為應用程序添加新的語言包時就可以不重新編譯了,只需將對象的語言文件拷貝到指定的文件夾即可.

2,界面元素如何?接到?言文本
?是StaticResource 和DynamicResource要做的事情,比如: 2,界面元素如何鏈接到語言文本
這是StaticResource和DynamicResource要做的事情,比如:
< Button Content = " {DynamicResource OK} " /> < ButtonContent = " {DynamicResourceOK} " /> 至于是使用StaticResource ?是DynamicResource,?取?于你是否要在?行???切?,如果??是?件??的?候才切??言StaticResource就可以了.至於是使用StaticResource還是DynamicResource,這取決於你是否要在運行時動態切換,如果僅僅是軟件啟動的時候才切換語言StaticResource就可以了.

3,OK ??一下: 3,OK實戰一下:
3.1 新建?目,并在?目中新建一?Lang文件?用于保存我?的?言文件 3.1新建項目,並在項目中新建一個Lang文件夾用於保存我們的語言文件

3.2 在Lang文件?中,新建"ResourceDictionary(WPF)",命名?" DefaultLanguage.xaml ",并?其BuildAction?置?Page,?是一?默??言?源文件,其?被??(而不是松散?接,??可以确保在?件?言包?失或?有某?家或地?的???言包?可以有一种默?的界面?言):我??里采用英文作?默??言: 3.2在Lang文件夾中,新建"ResourceDictionary(WPF)",命名為" DefaultLanguage.xaml ",並將其BuildAction設置為Page,這是一個默認語言資源文件,其將被編譯(而不是鬆散鏈接,這樣可以確保在軟件語言包丟失或沒有某國家或地區的對應語言包時可以有一種默認的界面語言):我們這裡採用英文作為默認語言:
< ResourceDictionary xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation " < ResourceDictionaryxmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
xmlns:sys = " clr-namespace:System;assembly=mscorlib " >

< sys:String x:Key = " OK " > < sys:Stringx:Key = " OK " >
OK


< sys:String x:Key = " Cancel " > < sys:Stringx:Key = " Cancel " >
Cancel


然后,我?添加另一??言,比如中文,在Lang文件?中,新建"ResourceDictionary(WPF)",命名?" zh-CN.xaml ",并?其BuildAction?置?Content,?CopyToOutputDirctory?置?"if new",??,我?的中文?言文件??被拷?到?用程序目?下的Lang目?下,其他的ULEAD軟體非默??言的?言文件都??采取?种方式.然後,我們添加另一國語言,比如中文,在Lang文件夾中,新建"ResourceDictionary(WPF)",命名為" zh-CN.xaml ",並將其BuildAction設置為Content,將CopyToOutputDirctory設置為"if new",這樣,我們的中文語言文件為將被拷貝到應用程序目錄下的Lang目錄下,其他的非默認語言的語言文件都應該採取這種方式.
< ResourceDictionary xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation " < ResourceDictionaryxmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
xmlns:sys = " clr-namespace:System;assembly=mscorlib " >

< sys:String x:Key = " OK " > < sys:Stringx:Key = " OK " >
确定 確定


< sys:String x:Key = " Cancel " > < sys:Stringx:Key = " Cancel " >
取消 取消



3.3 ?了???人?在??器(比如VS,Blend)中所?即所得地看到界面文本,我????默??言?源加入到?用程序的?源列表中: 3.3為了讓編碼人員在設計器(比如VS,Blend)中所見即所得地看到界面文本,我們應該將默認語言資源加入到應用程序的資源列表中:
< Application x:Class = " LangDemo.App " < Applicationx:Class = " LangDemo.App "
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
StartupUri = " Window1.xaml "
>

< Application.Resources >
< ResourceDictionary >
< ResourceDictionary.MergedDictionaries >
< ResourceDictionary Source = " lang\DefaultLanguage.xaml " /> < ResourceDictionarySource = " lang\DefaultLanguage.xaml " />




??我?就可以在??器中使用?些?源了:這樣我們就可以在設計器中使用這些資源了:

我?可以看到由于我?加?的默??言是英文,??器中我?的窗口界面上?示的是??的英文文本.我們可以看到由於我們加載的默認語言是英文,設計器中我們的窗口界面上顯示的是對應的英文文本.

3.4 ?件???加???的本地化的?言: 3.4軟件啟動時加載對應的本地化的語言: public partial class App : Application public partial class App:Application
{

protected override void OnStartup(StartupEventArgs e) void OnStartup(StartupEventArgse)
{
base .OnStartup(e);
LoadLanguage();
}

private void LoadLanguage()
{
CultureInfo currentCultureInfo = CultureInfo.CurrentCulture; CultureInfocurrentCultureInfo = CultureInfo.CurrentCulture;

ResourceDictionary langRd = ResourceDictionarylangRd = null ;

try
{
langRd =
Application.LoadComponent(
new Uri( @" Lang\ " + currentCultureInfo.Name + " .xaml " , UriKind.Relative)) " .xaml " ,UriKind.Relative))
as ResourceDictionary;
}
catch
{
}

if (langRd != null )
{
if ( this .Resources.MergedDictionaries.Count > 0 )
{
this .Resources.MergedDictionaries.Clear();
}
this .Resources.MergedDictionaries.Add(langRd);
}


}
} ??件???,我?根据?地的CultureInfo?加???的?言文件(如果??言文件存在的?),由于界面上的文本不是硬???去的,而是采用DynamicResource,?后台Resource改??,前台的引用也???改?,OK,??件??后,我?的界面就自?的切?了,我?台??上是中文:當軟件啟動時,我們根據當地的CultureInfo來加載對應的語言文件(如果該語言文件存在的話),由於界面上的文本不是硬編碼進去的,而是採用DynamicResource,當後台Resource改變時,前台的引用也會動態改變,OK,當軟件啟動後,我們的界面就自動的切換了,我這台電腦上是中文:


當然,本地化還有很多內容,比如貨幣數字,閱讀順序等,這裡僅僅提供了一個思想,你還可以在這裡下載DEMO

逛上一篇:   逛下一篇:

作者: ebqukpae
  (2010-01-26 15:50)
推薦文章: 將本文章推薦到【百度收藏】 將本文章推薦到【YouPush】 將本文章推薦到【udn共享書籤】 將本文章推薦到【Fiigo】書籤

 本文章共有回覆 5 篇,分 1 頁
 聲明:以上內容不代表本站立場,且內容由網友發表提供,若有爭議或違法由發表者承擔,本站將不負責連帶責任,謝謝。

 IPoBar  愛PK  愛遊戲  愛online
新手教學 客服中心 站務公告 交換連結 合作提案 關於我們
 
版權所有©ipobar Ltd., All Rights Reserved.
論壇內會員言論僅代表個人觀點,不代表本站同意其說法,本討論區不承擔由該言論所引起的法律責任