各国のUIフォントに対するための対応方法

#wp7dev_jp

より簡単な方法ができましたのでこちらをご参照ください。→ 各国のUIフォントに対するためのより簡単な対応方法

Windows Phone アプリケーション開発時の対応策。とりあえずということでPhoneApplicationPage に Language="jaーJP" をハードコーディングする方法をご紹介していましたが....

マルチランゲージに対応したエレガントなやり方

Language="jaーJP" をハードコーディングするのではなく、コンストラクターで地域を取得して設定する方法@ChiiAyano さんがご提案してくれました。ナイス!やり方は、PhoneApplicationPage のクラスのコンストラクタにこちらを入れるだけ。

using System.Globalization;
using System.Windows.Markup;

public partial class MainPage : PhoneApplicationPage
{
    // コンストラクター
    public MainPage()
    {
        InitializeComponent();
        this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.Name);
    }
}

もしくは、1行だけで対応したい場合はこちらですね。

public partial class MainPage : PhoneApplicationPage
{
    // コンストラクター
    public MainPage()
    {
        InitializeComponent();
       this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.Name);
}
}

この方法で、Twitter クライアントなども対応していただけるよう、お願いしてみようかと思います。

テンプレート化

これで、簡単にできるわけですが、毎回入れるのは面倒です。ページを追加したら毎回入れないといけません。面倒。なのでテンプレートを書き換えちゃいました。Project Template を5つ(AgentとClassはUIがないので不要)とItemTemplate 5つ。

WindowsPhoneApplicationTemplate.zip :Windows Phone アプリケーション
WindowsPhoneDataboundApplication.zip :データバインドアプリケーション
WindowsPhonePanoramaApplication.zip :パノラマアプリケーション
WindowsPhonePivotApplication.zip :ピボットアプリケーション
WindowsPhoneSlXnaApplication.zip :ハイブリッドアプリケーション

WindowsPhoneLandscapePageTemplate.zip :横のページ
WindowsPhonePanoramaPageTemplate.zip :パノラマページ
WindowsPhonePivotPageTemplate.zip :ピボットページ
WindowsPhonePortraitPageTemplate.zip :縦のページ
WindowsPhoneUserControlTemplate.zip :ユーザーコントロール

で、あちこちのマシンに入れるのに楽をするための、上書きするバッチファイルも作って完成。解凍したらバッチを「管理者として実行」すればOK。

WpJpSupporyProject.zip

実行するとテンプレートを上書きします。(一応オリジナルは残していますが)使う方は自己責任で。 テンプレートは以下のフォルダに入っています。それぞれにOriginal フォルダを作って、元のテンプレートをバックアップで置いてあります。手動で行う場合は %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\devenv /setup をお忘れなく。

%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Silverlight for Windows Phone\1041
%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\Silverlight for Windows Phone\1041

...あ、C#で力尽きました。

 

もう一つのエレガントな方法

そのほか、@tmyt さんの紹介してくれた、App.xaml に定義しておいて、xamlで設定する方法なんかも検討してみたけど、App.xaml 側にちゃんと作られていないと Page.xaml 側が対応できないので残念した。どうしてもプロジェクト名がからんじゃう部分があるからテンプレート化しないと面倒になってしまう面も...。きれいな実装なんだけどね。

でも、エレガントです。@tmyt ♪

App.xaml

<Application
x:Class="PhoneApp1.App"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:local="clr-namespace:PhoneApp1"
    >

    <!--アプリケーション リソース-->
    <Application.Resources>
        <local:CultureProvider x:Key="CurrentCulture" />
    </Application.Resources>

App.xaml.cs

namespace PhoneApp1
{
    public partial class App : Application
    {

    }
}

public class CultureProvider
{
public XmlLanguage CurrentLanguage
{
get { return XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name); }
}
}

MainPage.xaml

<phone:PhoneApplicationPage
: 
     shell:SystemTray.IsVisible="True"
    Language="{Binding Source={StaticResource CurrentCulture},Path=CurrentLanguage}">