C# 如何在“资源管理器”中使用资源管理器;网站「;模式
我在这里尝试为我正在使用的应用程序进行手动翻译。(已经有一个LocalizationModule在工作,但它工作起来很不可靠,所以我不能使用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” 所以我用了这样
标记
通常使用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.resxmyPage.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();