WindowsRuntime8.1/WindowsPhoneSilverLight8.1での日本語フォントが中華フォントになることの回避方法

さて、以前からWindowsPhoneアプリの開発で日本語フォントが中華フォントに置き換えられることがあり、これを回避する方法のコードがテンプレートにも取り込まれていたのですが、WindowsPhone8.1から消えていました。

現在私は「universal Apps」を優先的に行っているので、環境としては「WindowsRuntime 8.1」での開発となっています。

そこで、これまで通り下記コードを書いていたのですが、これが返す値がアプリに設定された言語を返すようになっています。
「en」のみで作成している場合、以前は実行環境の「ja」が返ってきたのですが、「en」が返ってくるようになっています。

                rootFrame = new Frame();

                rootFrame.Language = System.Globalization.CultureInfo.CurrentUICulture.Name;

Twitter上で話題が出た際にBluewaterSoftの山本氏が、その原因となった変更と新しく使用するとよいAPI「GlobalizationPreferences」を見つけていただけました。
そのAPIを利用するのが下記のコードです。

                rootFrame = new Frame();

                var resLang = System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;

                if (0 == System.String.Compare(resLang, "zh", System.StringComparison.OrdinalIgnoreCase))
                {
                    rootFrame.Language = System.Globalization.CultureInfo.CurrentUICulture.Name;
                }
                else
                {
                    rootFrame.Language = Windows.System.UserProfile.GlobalizationPreferences.Languages[0].ToString();
                }

これにより、英語など日本語以外の言語アプリでも日本語設定のWindows環境で日本語フォントが正常に表示されます。
TwoLetterISOLanguageNameは2桁(ISO 639-2形式の言語コードISO)Languageを返します。

さて、ここまではWindowsRuntimeでの話です。
WindowsPhone8.1にはWindowsRuntime8.1とWindowsPhoneSilverLight8.1環境があります。
WindowsPhoneSilverLight8.1でのアプリテンプレートでは、下記のコードが入っています。

private void InitializeLanguage()
{
        RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);
…

ResourceLanguageVer
読み込むresourceの「ResourceLanguage」を元に言語設定されています。
残念なことに「GlobalizationPreferences」はWindowsPhoneSilverLight8.1では使用できないため、対処できません。

そこで下記のように書き換えます。

private void InitializeLanguage()
{
                //var resLang = AppResources.ResourceLanguage;

                //if (resLang.StartsWith("zh", StringComparison.CurrentCultureIgnoreCase))
                //{
                //    RootFrame.Language = XmlLanguage.GetLanguage(resLang);
                //}

                var resLang = AppResources.ResourceLanguage.Substring(0,2);
                
                if (0 == System.String.Compare(resLang, "zh", System.StringComparison.OrdinalIgnoreCase))
                {
                    RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);
                }
                else
                {
                    RootFrame.Language = XmlLanguage.GetLanguage("ja");
                }
…

CurrentUICultureVer
WinRTでは返ってこなかったのですが、WPSL8.1ではきちんと「ja」が返ってきて表示が正常になります。
(コードを変更しました)
これでSilverLight8.1環境でも日本語フォントが使用されるようになります。
※Substringを使用した時に1文字だった場合、例外が発生するので、StartsWithでの判定も記載しておきます。
 ただ、ResourceLanguageは二文字以上帰ってくるとは思いますが、色々なケースがあると思うので、併記します。

アプリによってはSilverLight8.1環境で作成せざるを得ないものもあるので、この方法で英語のみのアプリでも日本語フォントを正常に表示することができます。
もっとも、これも今後何かで変更になる可能性はあるので、過信はできないのですが。

で、ここで問題になることも実はあります。
上記の方法は結局のところRootFrameの言語設定とResourceの言語設定が整合しないということです。
ええ、中国語のアプリどうすんだということです。
個別対応か、起動後のオプションで設定で切り替えられるようにするというのが考えられるところですが、どうするのがいいんでしょうね、、、

コードを追記しました。
単純に中国語アプリだった場合はそのまま使用、そうでないなら端末情報でという形ですね。
カルチャはMSのWindowsデベロッパーセンター「言語の選択」で確認したものに「zh」を追加しました。
WPSL8.1は「zh-CN」「zh-TW」だけのようですが、念のためWinRTと同じにしています。

先頭2文字だけ取り出してチェックする形にしました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください