App_GlobalResources(ASP.NET)中的子文件夹

时间:2010-03-30 00:53:17

标签: asp.net localization resources internationalization globalization

是否可以将资源文件(.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中吗?

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

2 个答案:

答案 0 :(得分:12)

从技术上讲,是的,这是可能的,但有一些陷阱。首先,让我举个例子。假设我的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。

答案 1 :(得分:1)

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

在网站中,我添加了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);
    }

}

此方法也适用于中信任。

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