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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用一个资源进行UWP本地化相关的知识,希望对你有一定的参考价值。

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

答案

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();
    }
}

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

以上是关于使用一个资源进行UWP本地化的主要内容,如果未能解决你的问题,请参考以下文章

[UWP]本地化入门

在 UWP 中本地化 XAML UI 中的字符串

如何从excel创建本地化资源文件?在 UWP 中

Xamarin.Forms:UWP 应用的本地化

设计时的 UWP 资源字符串 (.resw)

确定 UWP 中的 Windows 10 选择了哪种资源文化回退