我曾经做过类似的事情,我们将任何新字符串添加到 Android 字符串资源文件中,然后使用自定义构建工具将它们转换为 iOS 和 Windows 格式。
Android 字符串可能如下所示:
<string name="Hello">Hello, World!</string>
我们的工具将其转换为 Windows 字符串资源:
<data name="Hello">
<value>Hello, World!</value>
</data>
接下来,添加一个转换器,它对提供的值不做任何事情,而是假设它的参数是一个资源ID:
public sealed class LocalizeConverter : IValueConverter
{
private static readonly ResourceLoader Loader = ResourceLoader.GetForViewIndependentUse("/Resources");
public object Convert(object value, Type targetType, object parameter, string language)
{
string resourceId = parameter as string;
return !string.IsNullOrEmpty(resourceId) ? Loader.GetString(resourceId) : DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotSupportedException();
}
}
现在让该转换器可用于您的 XAML,可能是这样的:
<Page.Resources>
<local:LocalizeConverter x:Key="LocalizeConverter" />
</Page.Resources>
最后,将Button 的Content 属性设置如下:
<Button
Content="{x:Bind Converter={StaticResource LocalizeConverter}, ConverterParameter=Hello, Mode=OneTime}"
/>
请注意,我们不向转换器提供任何值。 (在 WPF 中我会创建一个标记扩展。遗憾的是,这个选项在 UWP 中不可用,所以我想出了这个无价值转换器选项作为替代方案。)
如果你想变得更漂亮,考虑一下:
<Button
Content="{x:Bind Language, Converter={StaticResource LocalizeConverter}, ConverterParameter=Hello, Mode=OneWay}"
/>
如果您将资源本地化为其他语言,这可以让您即时更改语言。 (注意Mode=OneWay 而不是Mode=OneTime。)