我在使用资源本地化Silverlight应用程序时遇到问题。我想让我的多语言机制成为跨平台,这就是为什么我将所有可本地化的资源放在Portable Class Library类型的项目中。 在这个项目中,我创建了两个资源文件 Localization.resx和Localization.en.resx以及我在两个文件中将public和“access modifier”设置为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”,我的应用程序仍然是英语。但是如果我在Windows Phone应用程序中使用相同的代码一切正常 - 我甚至可以在运行时更改应用程序语言。本地化Silverlight应用程序和本地化Windows Phone应用程序有什么区别吗?
这是我的申请
http://www.fileserve.com/file/TkQkAhV/LocalizationSolution.rar
正如我之前提到的,Windows Phone中的本地化工作正常,但在Silverlight中,应用程序标签未翻译
答案 0 :(得分:0)
您应该使用完全合格的ISO 3166和639代码以及Rumplin描述的连字符。
见
答案 1 :(得分:0)
确保您正确地完成了所有步骤。
创建 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绑定到查看(MainPage),例如:
public MyViewModel ViewModel
{
get { return (MyViewModel)DataContext; }
set { DataContext = value; }
}
public MainPage()
{
ViewModel = new MyViewModel();
}
将Resouce属性绑定到 UserControl ,如:
<TextBlock Height="20" HorizontalAlignment="Left" VerticalAlignment="Bottom" Foreground="#7F4F8AB2" FontSize="10.667" Text="{Binding MainResourcesSmart.NameOfTheCompany}" FontFamily="Trebuchet MS" />