使用资源本地化Silverlight应用程序

时间:2012-01-18 23:23:30

标签: windows-phone-7 silverlight-4.0 localization localizable.strings

我在使用资源本地化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中,应用程序标签未翻译

2 个答案:

答案 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" />