6

リソースを使用した Silverlight アプリケーションのローカライズに問題があります。多言語メカニズムをクロスプラットフォームにしたかったので、すべてのローカライズ可能なリソースをポータブル クラス ライブラリ タイプのプロジェクトに配置しました。このプロジェクトでは、2 つのリソース ファイル 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

Rumplinが説明しているように、完全に修飾された ISO 3166 および 639 コードをハイフンと組み合わせて使用​​する必要があります。

見る

于 2012-02-08T08:10:58.633 に答える