酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneでサポートされているフォントを言語設定によって適切に使用する

Windows Phone Advent Calendar "ひとり" 2011」第20日目です。 (遅延実行中です)

Windows Phoneアプリケーションでサポートされるフォントについてまとめてみました。

ラテン文字、キリル文字、ギリシャ語のベース言語

すべてのラテン文字、キリル文字、ギリシャ語ベースの言語では、Segoe WPフォントを使用してレンダリングされます(日本語版Windows Phoneデバイスであってもこのフォントは入っています。)。

  • Segoe WP Light
  • Segoe WP SemiLight
  • Segoe WP
  • Segoe WP Semibold
  • Segoe WP Bold
  • Segoe WP Black

東アジア言語

我々の使っている日本語を含め東アジアの言語は特殊で、それぞれの言語に応じて異なるフォントが用意されています。

  • 簡体字中国語
    • DengXian
  • 繁体字中国語
    • Microsoft MHei
  • 日本語
    • Yu Gothic
  • 韓国語
    • Microsoft NeoGothic

デフォルト設定が使用されることによる問題点

コントロールの基底クラスとして用意されているFrameworkElementクラスには、Languageプロパティが存在しており、指定した言語に応じて適切に中国語、日本語、韓国語のフォントが使用されます。下記のような問題が発生します。

http://ch3cooh.jp/wp-content/uploads/2011/12/LocalizedFont-01.png

デフォルトでは、ラテン文字、キリル文字、ギリシャ語のベース言語として、Segoe WPフォントが使用されます。俗に中華フォントと呼ばれる日本語としては適切でない表示となってしまいます。

XAML上で「Language="ja-JP"」と指定するのも良いのですが、この方法だと日本語版以外対応出来ないため、中国語や韓国語のユーザーから見ると違和感の残る結果となってしまいます。

この状態を回避する為に各ページのコンストラクタにて、Languageプロパティにその時のUI表示言語を設定してやることで、使用するフォントを適切なものにしています。

    public partial class MainPage : PhoneApplicationPage {
        public MainPage() {
            InitializeComponent();

            // 言語の設定を行う
            Language = System.Windows.Markup.XmlLanguage.GetLanguage(
                System.Globalization.CultureInfo.CurrentUICulture.Name);
        }

もしくは、App.xaml.csにてRootFrameを生成した時点で、Languageプロパティを指定します。RootFrameの子要素であるPhoneApplicationPageに言語設定が引き継がれますので、各ページ毎にLanguageプロパティを指定する必要がなくなります。

        // このメソッドに新たなコードを追加しないでください
        private void InitializePhoneApplication() {
            if (phoneApplicationInitialized)
                return;

            // フレームを作成しますが、まだ RootVisual に設定しないでください。
            // これによって、アプリケーションがレンダリングできる状態になるまで、
            // スプラッシュ スクリーンをアクティブなままにすることができます。
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Language = System.Windows.Markup.XmlLanguage.GetLanguage(
                System.Globalization.CultureInfo.CurrentUICulture.Name);
            RootFrame.Navigated += CompleteInitializePhoneApplication;

日本語フォントが無い時代は、「Windows Phone 7での任意のフォントを埋め込む方法について - 酢ろぐ!」のような対応をしましたが、他のWindows Phoneアプリケーションとの一貫性を考えるのであれば、標準の日本語フォントを使用するのが良いでしょう。