0

有许多 RESX 标记扩展示例(以及 Globalizer 等产品)提供 XAML 标记扩展以允许您动态引用 RESX 文件中的资源以启用本地化。有没有人看过所有这些以从谷壳中挑选出小麦?也就是说,有人对 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!” 在文本块中。

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

于 2012-09-25T22:14:08.343 回答