ToggleSwitch.Contentのローカライズ

提供されているリソースを上書きしてデータテンプレートを使ってかなり面倒なことをやるのかな、と思ったのだが存外簡単だった。

ローカライズ用のリソースを用意する

状態二値である"On"と"Off"をキーに持つリソースを用意する。取り敢えずインバリアントと日本語(ja-JP)を用意した。

キー
On On
Off Off

インバリアント(Resource.resx)

キー
On オン
Off オフ

ja-JP(Resource.ja-JP.resx)

リソースは「埋込リソース」として.Designer.csが生成されるようにしておく。

値コンバータクラスを用意する

ToggleSwitchはContentControlの継承クラスだがこのクラスは内部にConverterプロパティを持つことで、スイッチの値に対応したコンテンツの値コンバータの実装を挿げ替えることができる(素晴らしい設計だと思う)

用意するのはIValueConverterインタフェースを実装したクラスである。

  • BoolToOnOffConverter.cs
    public class BoolToOnOffConverter : IValueConverter  
    {
        private readonly string _offValue = Resource.Off;
        private readonly string _onValue = Resource.On;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return _offValue;
            }
            else
            {
                return value.Equals("On") 
                    ? _onValue 
                    : _offValue;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value != null && value.Equals(_onValue);
        }
    }
XAML上でコンバータをバインドする

あとは用意したコンバータを使ってContentプロパティ内部のConverterプロパティを変えてやれば良い。そのためにXAMLのStaticResource輪要素でBoolToOnOffConverterクラスのインスタンスを用意しておく。


XAML(リソース定義部)

XAML(Converterプロパティのバインド記述部)

通常の.NETローカライズであればここまでで作業は完了と言いたい所だが、Windows Phone 7の場合は更に一手間必要だ。

プロジェクトファイル(.csprj)のサポートカルチャを修正する

該当のプロジェクトファイル(.csprj)をエディタで開いて、サポートされるカルチャを直接記述する

    :
    <SupportedCultures>ja-JP,</SupportedCultures>
    :
実行結果

コンテンツが日本語リソースのそれに差し替わっていれば成功だ。

このようにToggleSwitch等のContenControlは比較的簡単にローカライズすることができる。