我正在尝试为我正在使用的应用程序进行手动翻译。 (已经有一个工作的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
加载资源。
答案 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(),?
答案 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)