Uwp 多项目解决方案中的本地化

Uwp 多项目解决方案中的本地化,uwp,localization,Uwp,Localization,我有一个UWP解决方案,有3个不同的项目(例如:a、B和C)。B是A和C项目访问的库 我已经为A项目生成了翻译(使用XLF文件进行翻译)并且工作正常。我正在使用多语言应用工具包(MAT) 现在我已经开始了B项目的翻译(resx文件和xlf文件在B项目中与在A中一样) 尽管我也在B项目中激活了MAT,但我无法向B添加新的翻译语言,因此我手动创建了文件。仅包含一个警告的生成: GENERATEPROJECTPRIFILE : warning PRI257: 0xdef00522 - Resourc

我有一个UWP解决方案,有3个不同的项目(例如:a、B和C)。B是A和C项目访问的库

我已经为A项目生成了翻译(使用XLF文件进行翻译)并且工作正常。我正在使用多语言应用工具包(MAT)

现在我已经开始了B项目的翻译(resx文件和xlf文件在B项目中与在A中一样)

尽管我也在B项目中激活了MAT,但我无法向B添加新的翻译语言,因此我手动创建了文件。仅包含一个警告的生成:

GENERATEPROJECTPRIFILE : warning PRI257: 0xdef00522 - Resources found for language(s) 'es,en-us,eu' but no resources found for default language(s): ''. Change the default language or qualify resources with the default language. http://go.microsoft.com/fwlink/?LinkId=231899
尽管在解决方案(Package.appxmanifest)中设置了默认语言,但项目B似乎没有默认语言

运行应用程序时,不会显示B项目中的本地化字符串

你知道我该怎么处理这个问题吗

编辑1:我已更正了在Assemby信息中更改项目默认语言的警告。但是,字符串仍然不可见

编辑2:A项目和B项目中的代码相同:

ResourceLoader.GetForCurrentView().GetString("FileName_StringName");
可能感兴趣的另一个细节是B项目类(大部分)是静态的

启动应用程序时,首先要做的事情之一是选择应用程序级别的语言:

// Hard coded language override     
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "eu"; 
            Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();   
           Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
编辑3:这是转储到XML文件的PRI包含的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PriInfo>
    <ResourceMap name="CoreTPA" version="1.0" primary="true">
        <Qualifiers>
            <Language>ES,EN-US,EU</Language>
        </Qualifiers>
        <ResourceMapSubtree name="CoreTPA">
            <ResourceMapSubtree name="Resources">
                <NamedResource name="AuroraForecastImages_GetForecast_ErrorDeserializingData" uri="ms-resource://CoreTPA/CoreTPA/Resources/AuroraForecastImages_GetForecast_ErrorDeserializingData">
                    <Candidate qualifiers="Language-EU" type="String">
                        <Value>Error deserializing data</Value>
                    </Candidate>
                    <Candidate qualifiers="Language-ES" isDefault="true" type="String">
                        <Value>Error deserializing data</Value>
                    </Candidate>
                    <Candidate qualifiers="Language-EN-US" type="String">
                        <Value>Error deserializing data</Value>
                    </Candidate>
                </NamedResource>
                <NamedResource name="AuroraForecastImages_GetForecast_ErrorGettingDataFromServerIsNetworkWorkingCorrectly" uri="ms-resource://CoreTPA/CoreTPA/Resources/AuroraForecastImages_GetForecast_ErrorGettingDataFromServerIsNetworkWorkingCorrectly">
                    <Candidate qualifiers="Language-EU" type="String">
                        <Value>Error getting data from server. 
Is network working correctly?</Value>
                    </Candidate>
                    <Candidate qualifiers="Language-ES" isDefault="true" type="String">
                        <Value>Error getting data from server. 
Is network working correctly?</Value>
                    </Candidate>
                    <Candidate qualifiers="Language-EN-US" type="String">
                        <Value>Error getting data from server. 
Is network working correctly?</Value>
                    </Candidate>
                </NamedResource>
            </ResourceMapSubtree>
        </ResourceMapSubtree>
        <ResourceMapSubtree name="Files">
            <ResourceMapSubtree name="CoreTPA">
                <NamedResource name="Core_ml.xml" uri="ms-resource://CoreTPA/Files/CoreTPA/Core_ml.xml">
                    <Candidate type="Path">
                        <Value>CoreTPA\Core_ml.xml</Value>
                    </Candidate>
                </NamedResource>
            </ResourceMapSubtree>
        </ResourceMapSubtree>
    </ResourceMap>
</PriInfo>

欧洲、欧洲、美国、欧盟
反序列化数据时出错
反序列化数据时出错
反序列化数据时出错
从服务器获取数据时出错。
网络工作正常吗?
从服务器获取数据时出错。
网络工作正常吗?
从服务器获取数据时出错。
网络工作正常吗?
CoreTPA\Core\u ml.xml

通过测试,项目B使用的本地化资源来自项目A(如果项目A调用项目B)或项目C(如果项目C调用项目B),而不是项目B中添加的本地化资源


因此,不需要在项目B中手动添加资源文件。您需要在项目A或项目C中而不是在项目B中添加字符串资源。

库中的资源将根据库本身的名称添加到单独的资源映射中。例如,如果我有以下项目设置(其中
MainUwpApp
引用了
UwpClassLibrary
):

MAINUWPAP(EXE项目) UwpClassLibrary(DLL项目) …然后,当我构建EXE并转储资源文件时,我会看到如下内容:

> makepri dump -if resources.pri -of resources.xml -dt basic
Output File at resources.xml
Successfully Completed

>findstr Source resources.xml

  <NamedResource name="Source" uri="ms-resource://{GUID}/Resources/Source">
  <NamedResource name="Source" uri="ms-resource://{GUID}/UwpClassLibrary/Resources/Source">
var map = ResourceManager.Current.MainResourceMap;

var appResource = map["Resources/Source"];
Debug.WriteLine($"URI: {appResource.Uri}, Value: {appResource.Candidates[0].ValueAsString}");

var libraryResource = map["UwpClassLibrary/Resources/Source"];
Debug.WriteLine($"URI: {libraryResource.Uri}, Value: {libraryResource.Candidates[0].ValueAsString}");
其结果是:

URI: ms-resource://{GUID}/Resources/Source, Value: Main App
URI: ms-resource://{GUID}/UwpClassLibrary/Resources/Source, Value: Class Library

你能给我们提供关于如何在B项目中调用和显示本地化字符串的详细代码吗?我很好奇为什么你要覆盖默认语言(除非它只是为了测试?)。你能看到“B”资源是否在“A”的PRI文件中吗?类似这样的内容(远离PC):
makepri/dump/if resources.pri/of resources.xml/dt basic
@PeterTorr MSFT Yes。只是为了测试,而不是花时间更改设置。B项目中只有一个PRI文件。我将使用xml文件中的转储数据更新该问题。如果在构建PRI文件(引用共享库)后从主项目中转储该文件,您应该会看到所有资源都已复制,但名称以共享库名称开头。库中支持本地化资源。您不需要将它们复制到主项目中。@YanGu MSFT,这很有效!谢谢
var map = ResourceManager.Current.MainResourceMap;

var appResource = map["Resources/Source"];
Debug.WriteLine($"URI: {appResource.Uri}, Value: {appResource.Candidates[0].ValueAsString}");

var libraryResource = map["UwpClassLibrary/Resources/Source"];
Debug.WriteLine($"URI: {libraryResource.Uri}, Value: {libraryResource.Candidates[0].ValueAsString}");
URI: ms-resource://{GUID}/Resources/Source, Value: Main App
URI: ms-resource://{GUID}/UwpClassLibrary/Resources/Source, Value: Class Library