ResourceLoader - 找不到ResourceMap和其他问题

时间:2018-02-13 23:15:43

标签: c# visual-studio uwp localization

我的团队项目(C#中的UWP应用程序)以两种语言提供(de-DE和en-US)。

项目的 Resources.resw 文件存储在

"Model\DataManager\ResourcesManager\Language\de-DE\"

包含与GUI相关的所有字符串。

就我而言,我需要根据应用程序的语言以不同的方式处理特定任务,但问题是,我和我的团队都不知道如何真正使用资源加载器

我有以下问题:

1)我被告知资源加载器自动获取windows语言并在应用程序中使用它(如果可用),否则将使用App default。 我还被告知,这是内部无法更改的,即使用户需要(例如在设置页面中),唯一的解决方案是更改Windows语言。这是真的?如果不能怎么做?

2)就我而言,我需要知道应用程序的当前语言,但我不知道如何,我还需要将语言相关的字符串存储在适当的资源文件中。 我试图定义一个名为LPResources.resw的新文件,其中我添加了所有字符串,如:

DBQueryGenerator_DateInterpreter_month-12 means December in the English version.

但是尝试使用以下命令访问此字符串:

ResourceLoader resources = new ResourceLoader("LPResources");    

ResourceLoader resources = ResourceLoader.GetForCurrentView("LPResources");    

然后

resources.GetString("DBQueryGenerator_DateInterpreter_month-01")

直接抛出异常未找到资源地图。

我试图寻找解决方案但我找不到任何有用的信息。

如果你能回答其中一个问题或两者都有,我会非常感激。

1 个答案:

答案 0 :(得分:0)

  

1)我被告知资源加载器自动获取windows语言并在应用程序中使用它(如果可用),否则将使用App default。我还被告知,这是内部无法更改的,即使用户需要(例如在设置页面中),唯一的解决方案是更改Windows语言。这是真的?如果不能怎么做?

这不是很准确。 Windows为您的应用程序加载的资源以及用于格式化日期,时间,数字和其他组件的语言由应用程序运行时语言列表确定,它由以下项组成:

  1. (可选)主要语言覆盖。
  2. 应用支持的用户语言。
  3. 如果1和2为空,则为应用程序支持的默认语言或第一语言。
  4. 本文档介绍了详细信息:Understand user profile languages and app manifest languages

      

    2)就我而言,我需要知道应用程序的当前语言,但我不知道如何,我还需要将语言相关的字符串存储在适当的资源文件中。我试图定义一个名为LPResources.resw的新文件。

    如上面的回复,要获取当前语言,您应该获取应用程序运行时语言列表,您可以使用以下三种方式获取它。

    //First way
    string runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues["Language"];
    
    //Second way
    IReadOnlyList<string> runtimeLanguages1 = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages;
    
    //Third way
    var runtimeLanguages2 = Windows.Globalization.ApplicationLanguages.Languages;
    

    然后,您可以做出简单的判断,以获得用户在应用中看到的内容。 (当然,您应首先阅读并理解Understand user profile languages and app manifest languages文档。)

    为了获取资源,我尝试了代码,

    var Loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("LPResources");
    var text1 = Loader.GetString("DBQueryGenerator_DateInterpreter_month-12");
    

    它可以返回定义的文本值,请检查资源文件名并确保它是正确的。

    注意:“LPResources”是LPResources.resw文件,“DBQueryGenerator_DateInterpreter_month-12”是资源字符串Name

    您还可以使用以下代码获取资源

    ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("LPResources");
    ResourceContext resourceContext = ResourceContext.GetForCurrentView();
    var str = resourceMap.GetValue("DBQueryGenerator_DateInterpreter_month-12", resourceContext).ValueAsString;
    

    请注意:无论LPResources.resw文件是在项目的根目录中还是在项目的文件夹中,您都可以直接使用其名称来调用它。

相关问题