有许多 RESX 标记扩展示例(以及 Globalizer 等产品)提供 XAML 标记扩展以允许您动态引用 RESX 文件中的资源以启用本地化。有没有人看过所有这些以从谷壳中挑选出小麦?也就是说,有人对 XAML 的良好 RESX 标记扩展有建议吗?
以下是一些可用选项:
有许多 RESX 标记扩展示例(以及 Globalizer 等产品)提供 XAML 标记扩展以允许您动态引用 RESX 文件中的资源以启用本地化。有没有人看过所有这些以从谷壳中挑选出小麦?也就是说,有人对 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!” 在文本块中。
例如,要本地化法语,您只需将 Resource1.fr-FR.resx 添加到 Visual Studio 项目(使用名为“String1”的字符串值“Salut tout le monde!”)。这将在法语本地化 PC 上显示法语版本,或者您可以使用 ResourceManager.GetString(...) 重载,让您明确选择语言。