我在使用资源本地化Silverlight应用程序时遇到问题。我想让我的多语言机械成为跨平台的,这就是为什么我把所有可本地化的资源都放在可移植类库类型的项目中。在这个项目中,我创建了两个资源文件Localization.resx和Localization.en.resx,我在这两个文件中都将和"访问修饰符"设置为public。然后我创建了一个名为"LocalizationProxy"的代理类,它是一个启用绑定的代理类。
public class LocalizationProxy : INotifyPropertyChanged
{
public Localization LocalizationManager { get; private set; }
public LocalizationProxy()
{
LocalizationManager = new Localization();
}
public void ResetResources()
{
OnPropertyChanged(() => LocalizationManager);
}
#region INotifyPropertyChanged region
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged<T>(Expression<Func<T>> selector)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(GetPropertyNameFromExpression(selector)));
}
}
public static string GetPropertyNameFromExpression<T>(Expression<Func<T>> property)
{
var lambda = (LambdaExpression)property;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else
{
memberExpression = (MemberExpression)lambda.Body;
}
return memberExpression.Member.Name;
}
#endregion
}
在下一步中,我修改了Silverlight csproj文件,并将"en"区域性添加到支持的类型中
<SupportedCultures>en</SupportedCultures>
此外,在我创建的应用程序资源和LocalizationProxy类的实例中
<Application.Resources>
<Localization:LocalizationProxy x:Key="LocalizationProxy"></Localization:LocalizationProxy>
</Application.Resources>
我还将程序集信息中的"中性语言"更改为"波兰语"——这应该是默认的应用程序语言。在最后一步中,我将一些值从视图绑定到资源
<TextBlock TextWrapping="Wrap" x:Name="PageTitle" Text="{Binding Source={StaticResource LocalizationProxy},Path=LocalizationManager.Title,Mode=TwoWay}" />
不幸的是,尽管Thread.CurrentThread.CurrentCulture是"pl pl",但我的应用程序仍然是英语。然而,如果我在WindowsPhone应用程序中使用相同的代码,一切都会很好——我甚至可以在运行时更改应用程序语言。本地化Silverlight应用程序和本地化Windows Phone应用程序有什么区别吗?
这是我的应用
http://www.fileserve.com/file/TkQkAhV/LocalizationSolution.rar
正如我之前提到的,Windows Phone中的本地化工作得很好,但在Silverlight应用程序标签中没有翻译
您应该使用完全合格的ISO 3166和639代码,并使用Rumplin所描述的连字符。
参见
- http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
- http://en.wikipedia.org/wiki/ISO_3166-1
请确保正确执行了下面的所有步骤。
创建ViewModel类
实现INotifyPropertyChanged接口:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
创建将返回正确语言的属性:
public object MainResourcesSmart
{
get
{
var myCulture = Thread.CurrentThread.CurrentUICulture.Name.ToUpper();
switch (myCulture)
{
case "EN-US":
return new MyResourceEn();
case "ES-AR":
return new MyResourceEs();
default:
return new MyResource();
}
}
}
将所有资源设置为公共
每次更改语言时,使用以下方法在屏幕上刷新:
private void MainResourcesSmartRefresh()
{
OnPropertyChanged("MainResourcesSmart");
}
将ViewModel绑定到视图(主页),例如:
public MyViewModel ViewModel
{
get { return (MyViewModel)DataContext; }
set { DataContext = value; }
}
public MainPage()
{
ViewModel = new MyViewModel();
}
将资源属性绑定到UserControl,如:
<TextBlock Height="20" HorizontalAlignment="Left" VerticalAlignment="Bottom" Foreground="#7F4F8AB2" FontSize="10.667" Text="{Binding MainResourcesSmart.NameOfTheCompany}" FontFamily="Trebuchet MS" />