我的团队项目(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")
直接抛出异常未找到资源地图。
我试图寻找解决方案但我找不到任何有用的信息。
如果你能回答其中一个问题或两者都有,我会非常感激。
答案 0 :(得分:0)
1)我被告知资源加载器自动获取windows语言并在应用程序中使用它(如果可用),否则将使用App default。我还被告知,这是内部无法更改的,即使用户需要(例如在设置页面中),唯一的解决方案是更改Windows语言。这是真的?如果不能怎么做?
这不是很准确。 Windows为您的应用程序加载的资源以及用于格式化日期,时间,数字和其他组件的语言由应用程序运行时语言列表确定,它由以下项组成:
本文档介绍了详细信息: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文件是在项目的根目录中还是在项目的文件夹中,您都可以直接使用其名称来调用它。