對于本地化這個功能我個人一直覺得在需求階段就要确定該項目需不需要實行本地化,這樣後面就可以減輕許多工作量,Sl中對本地化功能的支援與ASP.NET
中一樣,主要使用CultureInfo類來完成的。
下面來看實作本地化的具體流程,先來看一看我的項目結構:

這裡我是把資源檔案放入單獨的項目中,這樣結構上也比較的清晰。
第一步:
先在Languages項目下添加幾個資源檔案,這裡對于資源的命名要遵循.NET命名規範,比如說目前文化是中文的話,系統就會自動到Localization.zh-CN.resx中擷取相關的字元。這裡如果對多語言的文化的命名不熟悉的話,可以檢視.NET全球化
我們設定一個簡單的值,
我們這裡定義了一個Country字段,在中文和英文兩種文化中值分别為中國與China
第二步:
建立值轉化類AppResource.cs
namespace Languages
{
public class AppResource:IValueConverter
{
public readonly static ResourceManager manager = new ResourceManager("Languages.Localization", typeof(Localization).Assembly);
private static CultureInfo culture = Thread.CurrentThread.CurrentCulture;
public static CultureInfo UICultrue
{
get { return culture; }
set { culture = value; }
}
public string Get(string resource)
{
return manager.GetString(resource, UICultrue);
}
public static string GetValue(string resource)
{
return manager.GetString(resource, UICultrue);
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var reader=(AppResource)value;
return reader.Get((string)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
這個類主要使用了ResourceManager對象對本地化進行操作的
第三步:
編譯之後,我們在LocalilizationInSilverlight項目中引入Languages.dll
在App.xaml中我們引入這個dll,并且将其設為資源
<Application
x:Class="LocalilizationInSilverlight.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Languages;assembly=Languages"
>
<Application.Resources>
<local:AppResource x:Key="Localization"></local:AppResource>
</Application.Resources>
</Application>
第四步:
這裡有一點需要注意的是,當你編譯解決方案時,vs并未将資源檔案打包至xap中,需要手動修改一下LocalilizationInSilverlight.csproj
中的SupporttedCultures節點
<SupportedCultures>zh-CN,en-GB
</SupportedCultures>
引入資源後,我們就在頁面中使用它了
<TextBlock Height="23"
Name="textBlock1"
Text="{Binding ConverterParameter=Country,
Converter={StaticResource Localization},Source={StaticResource Localization}}"
Width="90" />
運作之後我們就可以看到界面上出現中國二字,我們可以改目前文化來測試一下
public MainPage()
{
AppResource.UICultrue = new CultureInfo("en-GB");
InitializeComponent();
}
這樣,我們在頁面InitializeComponent()之前修改目前文化為en-GB,這時候TextBlock就會出現China這個值了
擴充:對DataGrid的Headers屬性應用本地化功能
public static string GetValue(string resource)
{
return manager.GetString(resource, UICultrue);
}
<data:DataGrid AutoGenerateColumns="False"
Height="200"
Name="dataGrid1"
Width="200">
<data:DataGrid.Columns>
<data:DataGridTextColumn CanUserReorder="True"
CanUserResize="True"
CanUserSort="True"
Width="Auto" />
</data:DataGrid.Columns>
</data:DataGrid>
this.dataGrid1.Columns[0].Header = AppResource.GetValue("Country");
完成之後可以利用上面的第四步的方法進行測試了