Windows Phone 8でのアプリケーションの移植とローカライズ

以前の記事で、 Windows 8.1用の数独開発する方法について説明しましたが、この記事では、アプリケーションをWindows Phone 8に移植し、複数の言語でローカライズする方法を説明します。



画像



最初に、Windows Phoneテンプレートプロジェクトを作成します



Windows Phoneアプリケーションテンプレート



このソリューションでは、必要なコントロールをWindows 8.1プロジェクトからWindows Phoneプロジェクトにコピーしました。 このソリューションは最適ではありませんが、最速です。 次の記事では、クロスプラットフォームソリューションの作成方法を示します。

ここで、アプリケーションの移植に戻ります。 電話でのゲームでは、ページネーションを行うことが決定されました。 4ページ作成:



数独ページ



ゲームはGamePageページから始まります。 保存されたゲームがない場合は、新しいゲームを作成するための画面にユーザーを送信する必要があります。



ソースコード
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); GameState game = SettingsProvider.LoadSavedGame(); if (game == null) { NavigationService.Navigate(new Uri("/Pages/NewGame.xaml", UriKind.Relative)); } else { //... } }
      
      







Windows 8.1でファイルとセッションを操作する



Windows 8.1テンプレートでは、セッション保存メカニズムを実装するSuspensionManager



クラスが自動的に作成されます。 次に、ページクラスで、 NavigationHelperSaveState



メソッドとNavigationHelperSaveState



メソッドを定義する必要があります。 NavigationHelperLoadState



コードを以下に示します。状態の保存は同様の方法で行われます。



ソースコード
  private async void NavigationHelperLoadState(object sender, LoadStateEventArgs e) { try { if (SuspensionManager.SessionState.ContainsKey("game-data")) { string previousGame = SuspensionManager.SessionState["game-data"] as string; if (!string.IsNullOrEmpty(previousGame)) { GameStateModel game = GameStateModel.FromJson(previousGame); if (game != null) { LoadGameToBoard(game.ToGameState()); } } } } catch (FileNotFoundException fileNotFound) { } catch (Exception) { } }
      
      







Windows Phone 8でファイルとセッションを操作する



電話では、ファイルの操作は少し異なります。 IsolatedStorageSettingsなどの概念があります。 この概念は、Silverlightバージョン2から生まれました。名前が示すように、このタイプは、ファイルとデータをローカルファイルシステムに分離して格納するように設計されています。 これは、自分以外のアプリケーションがこのデータにアクセスできないことを意味します。



ゲームデータダウンロードコード
  public static GameState LoadSavedGame() { try { IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; if (settings.Contains(SavedGame)) { string previousGame = settings[SavedGame] as string; if (!string.IsNullOrEmpty(previousGame)) { GameStateModel game = GameStateModel.FromJson(previousGame); if (game != null) { return game.ToGameState(); } } } } catch (Exception exception) { } return null; }
      
      







見つかった機能



Windows Phone 8では、xamlリソースにフォントを保存できません。 WP8プラットフォーム上のこのようなコードは無効です。



 <!-- Fonts --> <FontFamily x:Key="ThemeFontFamily">Segoe UI Light</FontFamily> <FontWeight x:Key="ThemeFontWeight">SemiLight</FontWeight>
      
      







したがって、リソースファイルを分割し、WP8から余分なものを削除する必要がありました。



マークアップを使用する



マークアップを使用した作業に非常に満足しました。 まず、Win 8.1(Full、Filled、Snapped)のように3種類のアプリケーションのレイアウトを作成する必要はありません。 画面全体のレイアウトを正しく作成することが重要です。 数独では、画面の垂直位置のみがサポートされます(水平は99%でサポートされません)。

オブジェクトのレイアウト、スタイル、サイズを調整した後、さまざまなデバイスと画面でテストする必要があります。



Windows Phone 8



アプリケーション名のローカリゼーション



Windows 8.1とは異なり、アプリケーションの説明は、パブリケーションのセットアップ時にhttps://dev.windowsphone.comサイトで行われます。 そして、名前はアプリケーションに保存されます。 しかし、それほど単純ではありません:)



表示名タイルタイトルなどがあります。 最初のものは、市場と電話のアプリケーションのリストで使用されます。 このオプションが選択されている場合、2番目はタイルの碑文として使用されます。



MSDNの「Windows Phoneのアプリタイトルのローカライズ方法(最後のリンク)」で説明したように、タイルの名前とタイトルの2つのフィールドを含むリソースファイルがあるC ++ DLLを作成する必要があります。 言語ごとに、独自のdllを作成する必要があります。 はい、これは悲しいです。 しかし、 WP8 Localizeプロジェクトが助けになります。 ツールをダウンロードし、フィールドに入力して、必要なすべての言語のdllを自動的に作成します。 確かに数時間節約できました。



すべてのdllを作成した後、それらをプロジェクトに追加する必要があります。 それらをすべて別のフォルダに入れる方が便利です。 私は彼女のラングを呼び出して、すべてをそこに置きました。 BuildAction = Contentを変更することを忘れないでください。



アプリケーションWindows Phone 8の名前のローカライズ



WPAppManifest.xmlファイルで、名前とタイルをそれぞれ@ Langs / AppResLib.dll -100および@ Langs / AppResLib.dll -200に変更します。



アプリケーション名を変更する



この段階で、アプリケーション名とタイルのローカライズが完了しました。 アプリケーションコンテンツの言語を変更します。



Xamlローカリゼーション



Windows Phone 8では、ローカライズツールはバージョン7よりもはるかに優れています。 LocalizedStringsクラスを作成または検索します。



ソースコード
 /// <summary> /// Provides access to string resources. /// </summary> public class LocalizedStrings { private static AppResources _localizedResources = new AppResources(); public AppResources LocalizedResources { get { return _localizedResources; } } }
      
      







プロジェクトにResourcesフォルダーを作成します。 サポートされている言語ごとに、AppResources.LOCALE.resxリソースファイル(たとえば、 AppResources.resxおよびAppResources.ru.resx )を作成します。 2番目のステップは、App.xamlファイルにリソースを作成することです。



 <Application.Resources> <winPhone8:LocalizedStrings xmlns:local="clr-namespace:Oxozle.Sudoku.WinPhone8" x:Key="LocalizedStrings"/> </Application.Resources>
      
      







したがって、xamlでバインドする機会を与えます。



WPローカリゼーション



ファイル自体は次のとおりです。



ローカリゼーションファイル



重要な違いは、ここでは特にオブジェクトではなくテキストリソースのファイルであることです。 なぜなら バインディング(バインディング)およびリソースコードの生成が発生します-ドット区切り文字は使用できません。 次に、大量のテキスト要素をリソースに設定する必要があります。



 <TextBlock Text="{Binding LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}" Style="{StaticResource PhoneTextNormalStyle}"/>
      
      







新しいゲームページの場合:



ローカライズされたマークアップを作成する



ローカリゼーションはレイアウトモードでもサポートされています(Expression Blendですべてが正しく選択されます)



コードからのローカライズ



ApplicationBarは、バインダーのローカライズをサポートしていません。 これを行うには、プロジェクトを作成するときに、 BuildLocalizedApplicationBar



メソッドのコードをコメントアウトしてBuildLocalizedApplicationBar



ます。 しかし、アプリケーションメニューを作成するために数行を書くのは難しいことではありません。



BuildLocalizedApplicationBar
 private void BuildLocalizedApplicationBar() { // Set the page's ApplicationBar to a new instance of ApplicationBar. ApplicationBar = new ApplicationBar(); //// Create a new button and set the text value to the localized string from AppResources. //ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/edit.png", UriKind.Relative)); //appBarButton.Text = AppResources.GamePage_Pencil; //ApplicationBar.Buttons.Add(appBarButton); // Create a new menu item with the localized string from AppResources. ApplicationBarMenuItem appBarNewGame = new ApplicationBarMenuItem(AppResources.NewGameTitle); appBarNewGame.Click += delegate { NavigationService.Navigate(new Uri("/Pages/NewGame.xaml", UriKind.Relative)); }; ApplicationBar.MenuItems.Add(appBarNewGame); ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.GamePage_ButtonAbout); appBarMenuItem.Click += delegate { NavigationService.Navigate(new Uri("/Pages/AboutPage.xaml", UriKind.Relative)); }; ApplicationBar.MenuItems.Add(appBarMenuItem); ApplicationBarMenuItem appBarRate = new ApplicationBarMenuItem(AppResources.WinGame_Rate); appBarRate.Click += delegate { MarketplaceReviewTask marketplaceReviewTask = new MarketplaceReviewTask(); marketplaceReviewTask.Show(); }; ApplicationBar.MenuItems.Add(appBarRate); }
      
      







ローカライズを有効にする





Windows 8.1とは異なり、ローカライズを手動で有効にする必要があります。 これを行うには、Appメソッドのapp.xaml.csで、 InitializeLanguage



メソッドへの呼び出しを追加します。



InitializeLanguage
 // Language display initialization InitializeLanguage(); //  (    ). private void InitializeLanguage() { try { // Set the font to match the display language defined by the // ResourceLanguage resource string for each supported language. // // Fall back to the font of the neutral language if the Display // language of the phone is not supported. // // If a compiler error is hit then ResourceLanguage is missing from // the resource file. RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage); // Set the FlowDirection of all elements under the root frame based // on the ResourceFlowDirection resource string for each // supported language. // // If a compiler error is hit then ResourceFlowDirection is missing from // the resource file. FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); RootFrame.FlowDirection = flow; } catch { // If an exception is caught here it is most likely due to either // ResourceLangauge not being correctly set to a supported language // code or ResourceFlowDirection is set to a value other than LeftToRight // or RightToLeft. if (Debugger.IsAttached) { Debugger.Break(); } throw; } }
      
      









AssemblyInfoで、デフォルトのカルチャを指定します。



 [assembly: NeutralResourcesLanguageAttribute("en-US")]
      
      







[ パッケージング ]タブのWPAppManifest.xmlファイルで、アプリケーション設定を指定します:サポートされている言語のリスト、デフォルトの言語。



言語の選択



結論



一部の場所でのWindows Phone 8アプリケーションのローカライズは、Windows 8.1の同じローカリゼーションと根本的に異なります。 ただし、これについて複雑なことは何もありません。 ローカライズを作成したり、新しい言語のサポートを追加したりする前に、完全な指示があることが重要です。 この記事が多言語アプリケーションの作成に役立つことを願っています。 ここで結果を見ることができます:



数独+



ソース






All Articles