【问题标题】:Localize UWP Appllication本地化 UWP 应用程序
【发布时间】:2017-07-18 23:55:44
【问题描述】:

我正在将应用程序从 Windows Phone 8.1 移植到 UWP,但从资源中获取字符串时遇到问题。在 WP 8.1 中,我可以通过以下方式获取字符串:

Text="{Binding Path=LocalizedResources.lDownloadStatus , Source={StaticResource LocalizedStrings}}"

UWP 中是否有类似的解决方案,或者我必须设置 x:UID,然后在资源文件中设置例如:“Button.Content | SampleContent”?

【问题讨论】:

标签: uwp windows-10-universal uwp-xaml


【解决方案1】:

您应该在您的项目中创建文件夹“Strings”,对于法语,在其中创建另一个具有国家 LCID 名称的文件夹(fr-fr 代表法国)。并在那里创建 resource.resw 文件。

如果您想在 TextBlock.Text 中使用值,请将 .resw 文件中的字段命名为“Hello.Text”并为其指定值“Bonjour”。

转到您的 TextBlock 并设置 x:Uid="Hello"。

使用 ApplicationLanguages.PrimaryLanguageOverride = "fr-fr" 更改您的语言。

【讨论】:

  • 你不能像fr一样创建文件夹吗?而不是fr-fr?例如,如果我创建 de-De,它仅适用于德国,我应该为奥地利德语创建另一个 au-De 文件夹吗?
  • @batmaci 您只能创建 fr。它将覆盖所有使用法语的国家。
  • ApplicationLanguages.PrimaryLanguageOverride = "fr-fr" 在哪里添加这一行?据我所知,我们只需要更改 Package.appxmanifest 文件中的 Default language 属性,这对我不起作用。
【解决方案2】:

使用 x:uid 加载您的资源字符串,或者您可以使用 ResourceManager 从后端获取资源字符串。 这是来自 MSDN 的示例:How to create a localization UWP App

希望对你有帮助!

【讨论】:

    【解决方案3】:

    我在 CustomResources 方面取得了非常好的经验。

    只需在您的 UI 项目中的任意位置创建一个继承自 CustomXamlResourceLoader 的新类并实现以下方法:

    protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
        {
            var parts = resourceId.Split('|');
    
            if (parts.Length != 2)
                throw new ArgumentException();
    
            return ResourceLoader.GetForViewIndependentUse(parts[0]).GetString(split[1]);
        }
    

    然后你创建资源文件,我习惯将它们命名为我所在的页面,即“MainPage.resw”。

    就是这样,现在您可以开始使用 XAML 中的资源了:

    Text="{CustomResource MainPage|MyResourceKey}"
    

    当然,分隔符可以是任何你想要的,它不限于管道。只需确保在 ResourceLoader 和 XAML 中使用相同的分隔符即可。

    您不会在设计器中获得预览,但最大的优势是您可以拆分资源文件,而不必将所有内容都放在一个中。

    更多信息请参见https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/customresource-markup-extension

    【讨论】: