如何在“网站”模式下使用ResourceManager?

时间:2010-01-28 16:52:45

标签: c# asp.net localization web

我正在尝试为我正在使用的应用程序进行手动翻译。 (已经有一个工作的LocalizationModule,但它工作狡猾,所以我不能使用<asp:Localize />标签。

通常使用ResourceManager,您应该将其用作Namespace.Folder.Resourcename(在应用程序中)。目前我正在翻译现有的asp.net“网站”(不是网络应用程序,所以这里没有命名空间....)。

资源位于文件夹名称“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;
 }

在页面内我有类似<%= Locale.T("T_HOME") %>

的内容

当我刷新时,我有这个:

  

无法找到任何资源   适合指定的文化   或中性文化。确保   “Locales.resources”是正确的   嵌入或链接到程序集中   编译时“App_Code.9yopn1f7”,   或所有卫星组件   必需的是可加载的和完全的   签。描述:未处理   期间发生了异常   执行当前的Web请求。   请查看堆栈跟踪了解更多信息   有关错误的信息和位置   它起源于代码。

     

异常详细信息:   System.Resources.MissingManifestResourceException:   找不到任何资源   适合指定的文化   或中性文化。确保   “Locales.resources”是正确的   嵌入或链接到程序集中   编译时“App_Code.9yopn1f7”,   或所有卫星组件   必需的是可加载的和完全的   签名。

     

来源错误:

     

第14行:
  System.Resources.ResourceManager   resMan = new   System.Resources.ResourceManager(   “语言环境”,   System.Reflection.Assembly.GetExecutingAssembly()   空值 );第15行:第16行:var   text = resMan.GetString(搜索,   System.Threading.Thread.CurrentThread.CurrentCulture);   第17行:第18行:if(text == null)

     

源文件:   C:\的Inetpub \虚拟主机\ galerieocarre.com \子域\ dev的\的httpdocs \ App_Code文件\ Locale.cs   行:16

我甚至尝试使用Locales.fr-ca加载资源,或者仅使用fr-ca加载资源。

5 个答案:

答案 0 :(得分:2)

如果您无法访问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();

答案 1 :(得分:1)

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

请参阅http://msdn.microsoft.com/en-us/library/ms153597.aspx

答案 2 :(得分:0)

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

这样做的底线是您的资源被编译成一个类。此类的名称是您希望在其中处理资源时应使用的名称。

类的名称生成如下:

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

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

“locales.resources.locales”

添加语言和语言环境,如“uk-en”,由资源管理器添加,根据创建ResourceManager实例时指定的Culture加载适当的程序集。如果没有给出,则使用Thread.CurrentCulture。您不应该自己使用语言/区域设置扩展,将其留给资源管理器来处理。

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

; - 在评论后添加-------

我还查看了其他一些我已经解决过的代码;

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

1:您在网站的上下文中(在HttpHandler,Aspx,Ascx等中)加载“App_GlobalResources”库。 =&GT; Assembly.Load( “App_GlobalResources文件”);

2:浏览那里的可用类型并从每种类型中获取“ResourceManager”属性。=&gt;

PropertyInfo pi = type.GetProperty(“ResourceManager”);

resManager = pi.GetValue(null,new object [] {})作为ResourceManager;

3:如果有,请获取您想要的ResourceSet =&gt; resManager.GetResourceSet(englishCulture,true,true);

希望这有帮助。

答案 3 :(得分:0)

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

我在app_localResources目录中有2个文件

  

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

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

<asp:Label ID="lAddress1" runat="server" Text="<%$ Resources: lAddress1 %>"></asp:Label>

这就是我在我的管理方式

'using LCID from 
Public Enum elang
    En = &H1009  'en-CA http://www.microsoft.com/resources/msdn/goglobal/default.mspx?submitted=1009&OS=Windows%202003%20%20Service%20Pack%201
    Fr = &HC0C   'fr-CA http://www.microsoft.com/resources/msdn/goglobal/default.mspx?submitted=0C0C&OS=Windows%202003%20%20Service%20Pack%201
End Enum

'strongly typed value in session
Private _lang As elang = elang.En
Public Property lang() As elang
    Get
        Return _lang
    End Get
    Set(ByVal value As elang)
        _lang = value
    End Set
End Property

在我得到的每一页

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"))

答案 4 :(得分:-1)

修改

如果是网站项目,请阅读this walkthrough of Microsoft

我担心您无法在网站项目中使用ResourceMagager,因为它需要资源所在的命名空间/程序集。