【问题标题】:Subfolders in App_GlobalResources (ASP.NET)App_GlobalResources (ASP.NET) 中的子文件夹
【发布时间】:2010-03-30 00:53:17
【问题描述】:

是否可以将资源文件 (.resx) 放在 App_GlobalResources 内的子文件夹中?

例如:

/App_GlobalResources/someresources/myfile.resx

/App_GlobalResources/someresources/myfile.fr-fr.resx

/App_GlobalResources/othereresources/otherfile.resx

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

或者,是否所有的 .resx 文件都直接放在 App_GlobalResources 中?

如果可以使用子文件夹,您如何以编程方式访问子文件夹中的资源?

【问题讨论】:

    标签: asp.net localization resources internationalization globalization


    【解决方案1】:

    从技术上讲,是的,但有一些陷阱。首先,让我给你看一个例子。假设我的App_GlobalResources 文件夹如下所示:

    /App_GlobalResources
        /Test
            TestSubresource.resx
        TestResource.resx
    

    每个资源文件都有一个名为“TestString”的条目。我使用 Visual Studio 菜单添加了每个资源文件,因此它为我创建了一个类。默认情况下,添加到App_GlobalResources 文件夹的所有类都将具有相同的命名空间Resource。所以,如果我想使用类生成器并且我想要命名空间中的Test,我需要进入TestSubresource.Designer.cs 文件并手动更改命名空间。完成后,我可以执行以下操作:

    var rootResource = Resources.TestResource.TestString;
    var subResource = Resources.Test.TestSubResource.TestString;
    

    我也可以使用GetGlobalResourceObject 引用它们:

    var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
    var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );
    

    请注意,我仍然使用“TestSubresource”作为引用该文件中资源的方法,即使它位于子文件夹中。现在,其中一个问题是,App_GlobalResources 中的所有文件夹中的所有文件都必须是唯一的,否则您的项目将引发运行时错误。如果我将一个名为“TestResource.resx”的资源添加到/Test,它会抛出以下运行时错误:

    资源文件“/App_GlobalResources/TestResource.resx”不能 使用,因为它与另一个同名文件冲突。)。

    即使我更改了新资源的命名空间也是如此。

    因此,总而言之,是的,这是可能的,但是由于文件系统允许但不被文件系统允许的 App_GlobalResources 文件夹结构的不同部分中的两个同名资源文件,您增加了出现运行时错误的几率.NET。

    【讨论】:

      【解决方案2】:

      这是可能的。至少,我设法做到了。

      在一个网站中,我添加了 App_GlobalResources 文件夹。在其中我创建了另一个文件夹“MyFolder”并将 MyResource.resx 文件放入其中。 Resx 文件包含一对 MyKey1 - MyValue1。

      使用下面类的GetResource方法我成功提取了name="MyKey1"的"MyValue1"

      static class Class1 {
      
          static Assembly FindGlobalResAssembly() {
              foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
                  if(asm.FullName.StartsWith("App_GlobalResources."))
                      return asm;
              }
              return null;
          }
      
          public static object GetResource(string name) {
              Assembly asm = FindGlobalResAssembly();
              if(asm == null)
                  return null;
              return new ResourceManager("Resources.MyResource", asm).GetObject(name);
          }
      
      }
      

      这种方法也适用于中等信任度。

      从代码访问资源时,文件夹似乎没有什么区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多