Silverlight4的當地語系化和全球化對於我們構建全球化應用來說提供一定的便利性,下來我們就來探討如何實現其當地語系化和全球化。
我們啟動VisualStudio2010,並構建一個Silverlight Application:
ApplicationName:Jeriffe.SL.LocalGlobleApp
勾選:Host the Silverlight Application
New Web project type我們選擇ASP.NET Web Application Project
接著我們來構建Resource檔,這裡我們創建Resources資料夾,並添加Resource.resx、Resource.en-US.resx及Resource.zh-CN.resx 3個資源檔(注意:這3格資源檔共用一個Resources.Designer.cs),截圖如下:

1640293U9-0  

我們打開Resource.resx並添加2對Name Value串:
Label_EName EmployeeName
Label_Header Header
並且設置AccessModifier為Public:

16402953E-1  

以同樣的方式我們在Resource.zh-CH.resx添加如下:

1640292E3-2  

我們添加一個資源包裝類ResourceWraper,我們為什麼要添加這樣一個類呢,我解釋下緣由:
我們的資源檔(這裡是Resource.resx、Resource.en-US.resx及Resource.zh-CN.resx)在我們每次修改後都會設置其後台Resources.Designer.cs內部的構造器
訪問性修飾符為:Internal,如下圖:

1640291630-3  

對於我們一般的C#應用來說internal是程式集內部可訪問的,這個不存在什麼問題,可是Silverlignt不知道為什麼就不行,必須在這修改為Public才可以正常訪問我們
的Resource,那麼我們就會在每次修改完資源檔後還要修改這裡的修飾符,這給我們的程式設計帶來的一定的麻煩,有時候我們忘記修改這裡會導致異常,所有我們這裡
引入了一個包裝類ResourceWraper,在包裝類內部封裝我們的資源檔類為一個唯讀的屬性,這樣我們就沒有如上所述的困惑及麻煩,我們只需通過訪問包裝類來調用資源檔即可。包裝類的代碼如下:
namespace Jeriffe.SL.LocalGlobleApp.Resources
{
public class ResourceWraper
{
private static Resource resource = new Resource();
public Resource Resource
{
get
{
return resource;
}
}
}
}
接著我們在MainPage.xaml中添加如下:
<UserControl x:Class="Jeriffe.SL.LocalGlobleApp.MainPage"
xmlns="HTTP://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="HTTP://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="HTTP://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="HTTP://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:res="clr-namespace:Jeriffe.SL.LocalGlobleApp.Resources"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">
<UserControl.Resources>
<res:ResourceWraper x:Name="GlobleResource"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock
Name="lblHeader"
Grid.Row="0"
Foreground="Red"
FontSize="20"
Text="Design-Time"/>

 

<TextBlock
Grid.Row="1"
Margin="10"
FontSize="16"
Text="{Binding Resource.Label_EName,Source={StaticResource GlobleResource}}"/>
<TextBlock/>
<StackPanel
Grid.Row="2"
Orientation="Horizontal" >
<Button
Content="en-US"
Margin="5"
Name="btnen_US"
Click="btnen_US_Click"/>
<Button
Content="zh-CH"
Margin="5"
Name="btnzh_CN"
Click="btnzh_CN_Click"/>
</StackPanel>
</Grid>
</UserControl>

 

如上所示,加粗的字體有2部分:
第一部分資源聲明,這裡我們直接聲明的是我們的資源包裝類
第二部分是我們通過包裝類來調用我們的資源檔寫法。
接著就是我們的MainPage.xaml.cs檔的代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Jeriffe.SL.LocalGlobleApp.Resources;
using System.IO.IsolatedStorage;

 

namespace Jeriffe.SL.LocalGlobleApp
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}

 

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
lblHeader.Text = Resource.Label_Header;
}

 

private void btnen_US_Click(object sender, RoutedEventArgs e)
{
StorageLanguage("en-US");
}

 

private void btnzh_CN_Click(object sender, RoutedEventArgs e)
{
StorageLanguage("zh-CN");
}

 

private void StorageLanguage(string language)
{
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains(ConstDef.Language))
{
settings[ConstDef.Language] = language;
}
else
{
settings.Add(ConstDef.Language, language);
}
}
}
}
代碼功能如下:
我們在頁面Loaded事件中實現了資源檔的運行時載入
我們UI有2格Button,他們Click事件來實現Language的轉變
我們把設置的Language存儲到隔離存儲中:IsolatedStorageSettings
最後我們在App.xaml.cs中添加如下代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Globalization;
using System.Threading;
using System.IO.IsolatedStorage;

namespace Jeriffe.SL.LocalGlobleApp
{
public partial class App : Application
{
......
private void Application_Startup(object sender, StartupEventArgs e)
{
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
string language = "en-US";
if (settings.Contains(ConstDef.Language))
{
language = settings[ConstDef.Language].ToString();
}
CultureInfo culture = new CultureInfo(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;

this.RootVisual = new MainPage();
}

......
}
}
//輔助類
namespace Jeriffe.SL.LocalGlobleApp
{
public class ConstDef
{
public static string Language
{
get { return "language"; }
}
}
}
至此我們的應用已經構建完畢,但是我們還遺漏了最後也是最重要的一點,預設情況下Silverlight不會打包我們的語言資源檔到
XAP包中,我們必須需改Jeriffe.SL.LocalGlobleApp.csproj來使其自動的打包語言檔到XAP包:
這裡我們用UE或者記事本打開Jeriffe.SL.LocalGlobleApp.csproj找到節點:並修改如下:
<SupportedCultures>zh-CN;en-US</SupportedCultures>
截圖如下:
1640291102-4  
編譯我們的應用,在HostWebProject的ClientBin目錄下打開Jeriffe.SL.LocalGlobleApp.XAP包(修改副檔名XAP為zip打開,其實這就是格zip包,只是MS以XAP命名而已)
我們會看到如下:
1640295593-5  
好了,我們應用現在已經OK,運行Host Web Project我們的應用如下所示:
1640296205-6  
Click zh-CH按鈕並刷新UI:
1640295014-7  
至此我們的應用就構建完畢了。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()