未在 Visual Studio 2015 中为便携式 class 创建资源文件包装器
Resource file wrapper not created for Portable class in Visual Studio 2015
我正在尝试在便携式 class 中包含一个资源文件,根据 Microsoft 的这篇文章 (App Resources for Libraries That Target Multiple Platforms),我应该将 Access Modifier
设置为 public:
To create a strongly typed wrapper in Visual Studio, set the main resource file's Access Modifier in the Visual Studio Resource Designer to Public. This creates a [resourceFileName].designer.cs or [resourceFileName].designer.vb file that contains the strongly typed ResourceManager wrapper.
然后我应该能够使用应该创建的包装器 class 直接访问资源。我的资源文件命名为SharedResources.en-US.resx; SharedResources.fr-FR.resx,等等...
所以我应该能够访问这个调用下面的包装器 class:
string str = SharedResources.UnsupportedFeature;
但它不会为资源文件创建任何包装文件,即使在我从 Internal
转到 Public
之后也是如此。我想可能是因为我将它们存储在 Strings
文件夹中,所以我将各种资源文件移动到项目的根目录,但没有任何区别。
有人对我如何解决这个问题有任何想法或建议吗?
谢谢。
更新 1:
奇怪,我注意到当我创建一个名为 Resources.resx 的新资源文件时,它会在 Resources.Designer.cs 中创建以下内容:
namespace MyCompany.MyApp.Shared.Strings {
using System;
using System.Reflection;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute
("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo
.resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute
("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute
(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new
global::System.Resources.ResourceManager
("MyCompany.MyApp.Shared.Strings.Resources",
typeof(Resources).GetTypeInfo().Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute
(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Unsupported
/// feature provided.
/// </summary>
internal static string UnsupportedFeature {
get {
return ResourceManager.GetString("UnsupportedFeature",
resourceCulture);
}
}
}
}
- 如果我重命名文件,此代码将被完全删除。
- 如果我创建一个名为 Resources.fr-FR.resx 的文件,则不会创建代码。
我会尝试一下上面的代码,看看我是否有所收获。
好的,我明白了。它要么在我提到的 Microsoft 文章中没有很好地解释,要么我完全错过了那部分。无论哪种方式,以下是如何让它工作:
来自您的便携式图书馆:
创建一个名为 Resources.resx 的默认代码(或您想要的任何名称,但保持名称简单,即没有点、破折号等...),否则它不会在Resources.Designer.cs
一定要按照文中提到的Access Modifier
public
像往常一样通过资源编辑器添加资源字符串。
为您需要的相关语言创建一个新的资源文件,并根据默认资源文件命名,但在其中添加相关的语言代码,即Resources.fr-FR.resx。请注意,此代码不会包含 Resources.Designer.fr-FR.cs 中的任何代码(没关系!)
像往常一样通过资源编辑器添加资源字符串以匹配默认条目。
在您的便携式 class 库中创建一个类似于此的助手 class:
内部 class LocalizeHelper
{
public 枚举 LocalizeStringsEnum
{
不支持的功能
}
public static string GetText(LocalizeStringsEnum key)
{
switch (key)
{
case LocalizeStringsEnum.UnsupportedFeature:
return Resources.UnsupportedFeature;
default:
// Should never be raised unless a key is not defined in the enum.
throw new ArgumentOutOfRangeException("Unknown key provided");
}
}
要从您的便携式 Class 库中调用它,您可以这样调用它:
public bool MyFunction()
{
抛出新的异常(LocalizeHelper.GetText
(LocalizeStringsEnum.UnsupportedFeature));
}
就是这样!
来自您的应用:
假设您的应用是 UWP 应用,请确保在 OnLaunched
方法中设置 PrimaryLanguageOverride
:
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
ApplicationLanguages.PrimaryLanguageOverride = "fr-FR"; //To test
//ApplicationLanguages.PrimaryLanguageOverride = //Run-time
//GlobalizationPreferences.Languages[0];
}
然后在你的代码中,它会类似于这样:
try
{
bool test = MyPortableLib.MyFunction();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
以上将以法语(或您设置的任何主要语言)显示异常。
希望对您有所帮助。
我正在尝试在便携式 class 中包含一个资源文件,根据 Microsoft 的这篇文章 (App Resources for Libraries That Target Multiple Platforms),我应该将 Access Modifier
设置为 public:
To create a strongly typed wrapper in Visual Studio, set the main resource file's Access Modifier in the Visual Studio Resource Designer to Public. This creates a [resourceFileName].designer.cs or [resourceFileName].designer.vb file that contains the strongly typed ResourceManager wrapper.
然后我应该能够使用应该创建的包装器 class 直接访问资源。我的资源文件命名为SharedResources.en-US.resx; SharedResources.fr-FR.resx,等等...
所以我应该能够访问这个调用下面的包装器 class:
string str = SharedResources.UnsupportedFeature;
但它不会为资源文件创建任何包装文件,即使在我从 Internal
转到 Public
之后也是如此。我想可能是因为我将它们存储在 Strings
文件夹中,所以我将各种资源文件移动到项目的根目录,但没有任何区别。
有人对我如何解决这个问题有任何想法或建议吗?
谢谢。
更新 1:
奇怪,我注意到当我创建一个名为 Resources.resx 的新资源文件时,它会在 Resources.Designer.cs 中创建以下内容:
namespace MyCompany.MyApp.Shared.Strings {
using System;
using System.Reflection;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute
("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo
.resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute
("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute
(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new
global::System.Resources.ResourceManager
("MyCompany.MyApp.Shared.Strings.Resources",
typeof(Resources).GetTypeInfo().Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute
(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Unsupported
/// feature provided.
/// </summary>
internal static string UnsupportedFeature {
get {
return ResourceManager.GetString("UnsupportedFeature",
resourceCulture);
}
}
}
}
- 如果我重命名文件,此代码将被完全删除。
- 如果我创建一个名为 Resources.fr-FR.resx 的文件,则不会创建代码。
我会尝试一下上面的代码,看看我是否有所收获。
好的,我明白了。它要么在我提到的 Microsoft 文章中没有很好地解释,要么我完全错过了那部分。无论哪种方式,以下是如何让它工作:
来自您的便携式图书馆:
创建一个名为 Resources.resx 的默认代码(或您想要的任何名称,但保持名称简单,即没有点、破折号等...),否则它不会在Resources.Designer.cs
一定要按照文中提到的
Access Modifier
public像往常一样通过资源编辑器添加资源字符串。
为您需要的相关语言创建一个新的资源文件,并根据默认资源文件命名,但在其中添加相关的语言代码,即Resources.fr-FR.resx。请注意,此代码不会包含 Resources.Designer.fr-FR.cs 中的任何代码(没关系!)
像往常一样通过资源编辑器添加资源字符串以匹配默认条目。
在您的便携式 class 库中创建一个类似于此的助手 class:
内部 class LocalizeHelper { public 枚举 LocalizeStringsEnum { 不支持的功能 }
public static string GetText(LocalizeStringsEnum key) { switch (key) { case LocalizeStringsEnum.UnsupportedFeature: return Resources.UnsupportedFeature; default: // Should never be raised unless a key is not defined in the enum. throw new ArgumentOutOfRangeException("Unknown key provided"); } }
要从您的便携式 Class 库中调用它,您可以这样调用它:
public bool MyFunction() { 抛出新的异常(LocalizeHelper.GetText (LocalizeStringsEnum.UnsupportedFeature)); }
就是这样!
来自您的应用:
假设您的应用是 UWP 应用,请确保在 OnLaunched
方法中设置 PrimaryLanguageOverride
:
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
ApplicationLanguages.PrimaryLanguageOverride = "fr-FR"; //To test
//ApplicationLanguages.PrimaryLanguageOverride = //Run-time
//GlobalizationPreferences.Languages[0];
}
然后在你的代码中,它会类似于这样:
try
{
bool test = MyPortableLib.MyFunction();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
以上将以法语(或您设置的任何主要语言)显示异常。
希望对您有所帮助。