1

私は最初のアプリを開発していて、それを多言語にしようとしています。AppHubの例
と他のリンクを 使用して、リソースファイルを作成し、コンポーネントのバインディング文字列を修正して、設定ページを設定しました。 私が抱えていた最初の問題は、メニュー項目とappbarボタンがローカリゼーション文字列を使用できないことでした(プロジェクトは起動時に文句を言いました)ので、私は次のことをしました:

  • ローカライズされた文字列でバインドされたTextBlocksおよびその他のコンポーネント
  • ローカライズされた文字列をロードする手順を使用して手動でローカライズされたAppbarボタンとアイテム

設定ページができたので、ユーザーが変更できる項目の1つは言語です。
さて、ユーザーの選択に応じて正しいCultureInfoが選択され、次に使用します

Thread.CurrentThread.CurrentUICulture = Settings.Language;

戻るボタンを押してメインページに戻ると、appbarアイテムは正しくローカライズされていますが、他のすべてはローカライズされていません。
唯一の回避策(私が本当に好きではない、それはただ理解することです)はこれです:

public MainPage()
{
    Thread.CurrentThread.CurrentUICulture = Settings.Language;
    InitializeComponent();
    // Everything else I need here
}

そのため、コンポーネントを作成する前に言語を設定して機能させる必要があります。
どうしたの?バインドされた文字列を使用して言語を変更した後にページを更新する正しい方法はどれですか?
基本的にリンクで提供されているものを使用したので、多くのコードを入れませんでしたが、さらに情報が必要な場合は、質問を編集します。

4

1 に答える 1

2

私はついに、言語の変更に反応してアプリケーションコンポーネントを自動的に更新するソリューションを見つけました。
良いチュートリアルはここにあります; 簡単に言うと、ローカライズされたリソースが変更されたことをアプリに通知する方法を見つける必要があります。

  public class LocalizedStrings : ViewModelBase
  {
      private static AppResources localizedresources = new AppResources();

      public AppResources LocalizedResources
      {
          get { return localizedresources; }
      }

      public void UpdateLanguage()
      {
          localizedresources = new AppResources();
          RaisePropertyChanged(() => LocalizedResources);
      }

      public static LocalizedStrings LocalizedStringsResource
      {
          get
          {
              return Application.Current.Resources["LocalizedStrings"]
                     as LocalizedStrings;
          }
      }
  }

これにより、ユーザーが言語を変更するときに、単に実行する必要があります

LocalizedStrings.LocalizedStringsResource.UpdateLanguage();

そして仕事は終わりました。

于 2012-06-08T09:16:47.080 に答える