使用一个资源进行UWP本地化

时间:2017-12-19 13:47:11

标签: xaml uwp localization

因此,我尝试将本地化添加到我正在处理的UWP应用程序中。根据我在线研究的内容,我可以使用Mulitlingual App Toolkit添加它。我遇到的一个问题是资源文件中的重复值。例如,想象我需要使用相同的值标记2个不同的控件。控件是一个按钮(使用属性button.Content)和一个文本块(使用textBlock.Text)。我希望资源文件中只有一个名称/值对可以用于这两个控件。有没有办法做到这一点?此外,我希望能够在xaml中设置这些值。提前谢谢。

1 个答案:

答案 0 :(得分:1)

一般UWP的本地化

首先,国际化(i18n)和本地化(l10n)的默认方式是对每种语言使用不同的.resw(或.resx用于其他环境,如Xamarin)。在这些文件中,您可以使用一些标识符密钥存储已翻译的字符串。

Mulitlingual App Toolkit是一个工具,用于促进和稍微管理(例如跟踪审查状态)实际使用可能不属于实际开发团队的人员翻译字符串的周围过程。但最终,它只会生成.resw文件,就像您手动完成的那样。因此,您无需使用MAT来本地化您的应用程序。

实施

实现你想要的方法是使用某种Binding。

我个人喜欢使用自定义标记扩展来区分实际动态数据和硬编码国际化字符串。此外,它使Binding保持简短。这看起来像Title="{i18n:Translate GlossaryPageTitle}"

不幸的是,Markup Extensions似乎尚未在UWP中提供(source)。

因此,最简单的方法是使用转换器并将所需文本的密钥作为参数传递。 像这样: Title="{x:Bind Converter={StaticResource LocalizationConverter}, ConverterParameter=GlossaryPageTitle}"

转换器的实现如下所示:

public class LocalizationConverter : IValueConverter
{
    private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForViewIndependentUse("/Resources");

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (parameter is string resourceId)
        {
            return _resourceLoader.GetString(resourceId);
        }
        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotSupportedException();
    }
}

然后在你的应用程序的某个地方注册转换器(每个视图或全局),你就可以了。