0

RESX ファイル内のリソースを動的に参照してローカリゼーションを有効にする XAML マークアップ拡張機能を提供する、多くの RESX マークアップ拡張サンプル (および Globalizer などの製品) があります。もみ殻から小麦を選ぶためにこれらすべてを見た人はいますか?つまり、XAML 用の優れた RESX マークアップ拡張機能を推奨する人はいますか?

利用可能なオプションの一部を次に示します。

4

1 に答える 1

2

これを実現するためにマークアップ拡張機能は必要ありません。シンプルな ValueConverter でそれを行うことができます。

  1. プロジェクトに .resx ファイルを追加します (この例では、Resource1.resx と呼び、"String1" 値 "Hello world!" という名前の文字列値を使用します)。

  2. 文字列をローカライズされた文字列に変換するコンバーターを作成します。

    namespace WpfApplication1.Converters
    {
        public class ResxLocalizationConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string result = Resource1.ResourceManager.GetString(value.ToString());
                if (result == null)
                {
                    result = value.ToString();
                }
                return result;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }
    
  3. コンバーター インスタンスを App.xaml に追加する

    <Application x:Class="WpfApplication1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="Window1.xaml" 
                 xmlns:converters="clr-namespace:WpfApplication1.Converters">
        <Application.Resources>
            <converters:ResxLocalizationConverter x:Key="ResxLocalizationConverter" />
      </Application.Resources>
    </Application>
    
  4. ローカライズされていない文字列値 (またはキー) を XAML に入れます。

    <Window x:Class="WpfApplication1.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>        
            <TextBlock Text="{Binding Source='String1', Converter={StaticResource ResxLocalizationConverter}}"/>
        </Grid>
    </Window>
    

これにより、「Hello world!」が表示されます。TextBlock で。

たとえば、フランス語にローカライズするには、Resource1.fr-FR.resx を Visual Studio プロジェクトに追加するだけです ("String1" という名前の文字列値 "Salut tout le monde!" を使用)。これにより、フランス語にローカライズされた PC でフランス語版が表示されます。または、言語を明示的に選択できる ResourceManager.GetString(...) オーバーロードを使用できます。

于 2012-09-25T22:14:08.343 に答える