关于XAML RESX标记扩展的建议

时间:2012-09-25 21:37:00

标签: wpf xaml localization

有许多RESX标记扩展示例(以及像Globalizer这样的产品)提供XAML标记扩展,允许您动态引用RESX文件中的资源以启用本地化。是否有人看过所有这些从谷壳中挑出小麦?也就是说,有人建议对XAML进行良好的RESX标记扩展吗?

以下是一些可用选项:

1 个答案:

答案 0 :(得分: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>
    
  5. 这将显示“Hello world!”在TextBlock中。

    例如,要为法语本地化,您只需要将Resource1.fr-FR.resx添加到Visual Studio项目中(使用名为“String1”的字符串值“Salut tout le monde!”)。这将在法语本地化PC上显示法语版本,或者您可以使用ResourceManager.GetString(...)重载,以便您明确选择语言。