6

我在使用资源本地化 Silverlight 应用程序时遇到问题。我想让我的多语言机制成为跨平台的,这就是为什么我将所有可本地化的资源放在 Portable Class Library 类型的项目中。在这个项目中,我创建了两个资源文件 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”,但我的应用程序仍然是英语语言。但是,如果我在 Windows Phone 应用程序中使用相同的代码,一切正常 - 我什至可以在运行时更改应用程序语言。本地化 Silverlight 应用程序和本地化 Windows Phone 应用程序有什么区别吗?

这是我的申请

http://www.fileserve.com/file/TkQkAhV/LocalizationSolution.rar

正如我之前提到的,Windows Phone 中的本地化工作正常,但在 Silverlight 应用程序标签中没有翻译

4

2 回答 2

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" />
于 2013-04-09T14:25:05.783 回答
0

您应该使用完全限定的 ISO 3166 和 639 代码以及Rumplin描述的连字符。

于 2012-02-08T08:10:58.633 回答