RESX ファイル内のリソースを動的に参照してローカリゼーションを有効にする XAML マークアップ拡張機能を提供する、多くの RESX マークアップ拡張サンプル (および Globalizer などの製品) があります。もみ殻から小麦を選ぶためにこれらすべてを見た人はいますか?つまり、XAML 用の優れた RESX マークアップ拡張機能を推奨する人はいますか?
利用可能なオプションの一部を次に示します。
RESX ファイル内のリソースを動的に参照してローカリゼーションを有効にする XAML マークアップ拡張機能を提供する、多くの RESX マークアップ拡張サンプル (および Globalizer などの製品) があります。もみ殻から小麦を選ぶためにこれらすべてを見た人はいますか?つまり、XAML 用の優れた RESX マークアップ拡張機能を推奨する人はいますか?
利用可能なオプションの一部を次に示します。
これを実現するためにマークアップ拡張機能は必要ありません。シンプルな ValueConverter でそれを行うことができます。
プロジェクトに .resx ファイルを追加します (この例では、Resource1.resx と呼び、"String1" 値 "Hello world!" という名前の文字列値を使用します)。
文字列をローカライズされた文字列に変換するコンバーターを作成します。
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();
}
}
}
コンバーター インスタンスを 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>
ローカライズされていない文字列値 (またはキー) を 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(...) オーバーロードを使用できます。