C# 如何在“资源管理器”中使用资源管理器;网站「;模式

C# 如何在“资源管理器”中使用资源管理器;网站「;模式,c#,asp.net,localization,web,C#,Asp.net,Localization,Web,我在这里尝试为我正在使用的应用程序进行手动翻译。(已经有一个LocalizationModule在工作,但它工作起来很不可靠,所以我不能使用标记 通常使用ResourceManager时,您应该将其用作名称空间.Folder.Resourcename(在应用程序中)。目前,我正在翻译现有的asp.net“网站”(不是web应用程序,因此此处没有名称空间…) 这些资源位于名为“Locales/resources”的文件夹中,其中包含“fr-ca.resx”和“en-us.resx” 所以我用了这样

我在这里尝试为我正在使用的应用程序进行手动翻译。(已经有一个LocalizationModule在工作,但它工作起来很不可靠,所以我不能使用
标记

通常使用ResourceManager时,您应该将其用作
名称空间.Folder.Resourcename
(在应用程序中)。目前,我正在翻译现有的asp.net“网站”(不是web应用程序,因此此处没有名称空间…)

这些资源位于名为“Locales/resources”的文件夹中,其中包含“fr-ca.resx”和“en-us.resx”

所以我用了这样的代码:

public static string T(string search)
 {
  System.Resources.ResourceManager resMan = new System.Resources.ResourceManager( "Locales", System.Reflection.Assembly.GetExecutingAssembly(), null );

  var text = resMan.GetString(search, System.Threading.Thread.CurrentThread.CurrentCulture);

  if (text == null)
   return "null";
  else if (text == string.Empty)
   return "empty";
  else
   return text;
 }
在页面中,我有这样的内容

当我刷新时,我有:

找不到任何资源 适合于指定的区域性 或者是中立文化,一定要 “Locales.resources”是正确的 嵌入或链接到组件中 编译时的“App_Code.9yopn1f7”, 或者所有的卫星组件 所需的是可装载且完全可用的 签名。说明:未处理的 测试期间发生异常 当前web请求的执行。 请查看堆栈跟踪以了解更多信息 有关错误和位置的信息 它起源于代码

例外情况详情: System.Resources.MissingManifestResourceException: 找不到任何资源 适合于指定的区域性 或者是中立文化,一定要 “Locales.resources”是正确的 嵌入或链接到组件中 编译时的“App_Code.9yopn1f7”, 或者所有的卫星组件 所需的是可装载且完全可用的 签名

源错误:

第14行:
System.Resources.ResourceManager resMan=新 System.Resources.ResourceManager( “地区”, System.Reflection.Assembly.GetExecutionGassembly(), null);第15行:第16行:变量 text=resMan.GetString(搜索, System.Threading.Thread.CurrentThread.CurrentCulture); 第17行:第18行:if(text==null)

源文件: c:\inetpub\vhosts\galerieocare.com\subdomains\dev\httpdocs\App\u Code\Locale.cs 第16行


我甚至尝试用
Locales.fr ca
加载资源,或者只加载
fr ca
这里什么都不起作用。

在ASP.Net中使用资源时,您会看到在.resx文件(ResXCodeGen)上使用了一个专用的编译器(自定义工具属性)

最重要的一点是,您的资源被编译成一个类。这个类的名称是您在处理其中的资源时应该使用的名称

类的名称生成如下:

{project namespace}{folder structure}{filename}.resx(.resx不是生成的名称的一部分)

由于您提到您的resx文件位于一个名为“Locales/resources”的目录中,因此您必须使用的名称是(假设resx文件名为“Locales.resx”)

“locales.resources.locales”

添加语言和区域设置,如“uk en”由资源管理器添加,根据创建资源管理器实例时指定的区域性加载相应的程序集。如果未指定区域性,则使用Thread.CurrentCulture。您不应自己使用语言/区域设置扩展,请让资源管理器来处理

如果您不确定resources类将如何结束,您可以始终查看MSIL或使用reflector来确定实际部署的程序集中资源类的名称

--在放置注释后添加-------

我还看了一些其他的代码

您是否尝试过对App_GlobalResources方法的反思

1:在网站上下文中加载“App_GlobalResources”库(在HttpHandler、Aspx、Ascx等中)。=> 组装。加载(“App_GlobalResources”)

2:浏览其中的可用类型,并从每个类型中获取“ResourceManager”属性。=>

PropertyInfo pi=type.GetProperty(“ResourceManager”)

resManager=pi.GetValue(null,新对象[]{})作为ResourceManager

3:如果它有一个,那么获取您想要的资源集=>resManager.GetResourceSet(englishCulture,true,true)

希望这有帮助。

编辑

如果是网站项目,请阅读

恐怕您不能在网站项目中使用ResourceMagager,因为它需要资源所在的命名空间/程序集。

这不是c,但您可以轻松地将其转换为c

我在app_localResources目录中有2个文件

myPage.aspx.resx
myPage.aspx.fr-ca.resx

我在我的.aspx页面中这样使用它

<asp:Label ID="lAddress1" runat="server" Text="<%$ Resources: lAddress1 %>"></asp:Label>
在我得到的每一页上

Protected Overrides Sub InitializeCulture()
    If Not Me.IsPostBack Then
        Threading.Thread.CurrentThread.CurrentUICulture = New Globalization.CultureInfo(Sess.lang)
        Threading.Thread.CurrentThread.CurrentCulture = Globalization.CultureInfo.CreateSpecificCulture(Threading.Thread.CurrentThread.CurrentUICulture.Name)
    End If
    MyBase.InitializeCulture()
End Sub
当我想使用resourcemanager时,我会在根级别创建一个全局资源文件,我会这样使用它

Dim rm = New System.Resources.ResourceManager("Resources.MyPage", Reflection.Assembly.Load("App_GlobalResources"))

也许您只是在寻找System.Web.Page的基本GetLocalResourceObject(),


请参见

如果您没有访问HTTPContext的权限,那么Marvin Smit的解决方案非常好

const string ASSEMBLY_NAME = "App_GlobalResources";
const string RESOURCE_NAME = "Resources.MetaTagResource";
const string RESOURCE_MANAGER = "ResourceManager";

Assembly assembly = Assembly.Load(ASSEMBLY_NAME);
Type type = assembly.GetType(RESOURCE_NAME);
PropertyInfo propertyInfo = type.GetProperty(RESOURCE_MANAGER);
ResourceManager resourceManager = propertyInfo.GetValue(null, new object[] { }) as ResourceManager;
resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true);
但是如果您有权访问HTTPContext,只需使用HTTPContext.GetGlobalResourceObject

string title = HttpContext.GetGlobalResourceObject("MetaTagResource", "Title").ToString();
string keywords = HttpContext.GetGlobalResourceObject("MetaTagResource", "keywords").ToString();
string description = HttpContext.GetGlobalResourceObject("MetaTagResource", "Description").ToString();

实际上,这些文件是fr-ca.resx和en-us.resx.Tho,正如你提到的,我试图解决它们,但因为它是一个网站(不是web应用程序)没有名称空间/类。我甚至尝试将它们移动到应用程序代码中以查找它们,但没有更多效果。嗨,埃里克,如果我没记错,如果某个东西本身没有名称空间,ASP.Net JIT编译器将添加“ASP.”作为名称空间。现在最简单的方法是编译您的网站(aspnet\u compiler.exe)并将生成的程序集加载到Reflector中。这将使您清楚地了解类的调用方式。如果您想使用真正的ASP.Net库,可以查看“c:\windows\Microsoft.Net\Framework\Temporary ASP.Net files\..\App_Code.9yopn1f7.dll”(其中,…是由托管在II中的Asp.Net JIT编译器随机生成的目录
string title = HttpContext.GetGlobalResourceObject("MetaTagResource", "Title").ToString();
string keywords = HttpContext.GetGlobalResourceObject("MetaTagResource", "keywords").ToString();
string description = HttpContext.GetGlobalResourceObject("MetaTagResource", "Description").ToString();