有许多RESX标记扩展示例(以及像Globalizer这样的产品)提供XAML标记扩展,允许您动态引用RESX文件中的资源以启用本地化。是否有人看过所有这些从谷壳中挑出小麦?也就是说,有人建议对XAML进行良好的RESX标记扩展吗?
以下是一些可用选项:
答案 0 :(得分:2)
您不需要任何标记扩展即可完成此任务。您可以使用简单的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(...)重载,以便您明确选择语言。