logo       

Re: embedding resources for globalization (complete frustration): msg#00083

windows.devel.dotnet.web

Subject: Re: embedding resources for globalization (complete frustration)

Hello Mark,
Thanks for your reply.

My main problem seems to be embedding the .resource file I generate
from the .resX into the satellite assembly. The ResourceManager class
won't get the values inside the XML .resx file so the .resX file needs
to be converted into the binary .resources version. (resgen
myresources.en-US.resx myresources.en-US.resources). Although the
resources embedding into a satellite assembly seems to work fine,
here's a copy of my cmd session:

C:\Inetpub\wwwroot\machinelocator\bin\en-US>resgen machinelocator..en-USresx
Read in 234 resources from 'machinelocator.en-US.resx'
Writing resource file... Done.

C:\Inetpub\wwwroot\machinelocator\bin\en-US>al.exe /t:lib /embed:machinelocator.
en-US.resources /culture:en-US /out:machinelocator.resources.dll
Microsoft (R) Assembly Linker version 7.10.3077
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.


C:\Inetpub\wwwroot\machinelocator\bin\en-US>ildasm machinelocator.resources.dll

ildasm shows in the manifest that machinelocator.en-US.resources is
inside the dll.

So far everything seems to be working. Inside my bin directory I have
a folder for each culture bin\en-US\ has the
machinelocator.resources.dll satellite assembly.

On my code there's is something like this:
Thread.CurrentThread.CurrentUICulture = New CultureInfo(Me.CurrentCulture)
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(Me.CurrentCulture)
...

Dim a As [Assembly] = [Assembly].Load("machinelocator")
Dim rm As ResourceManager = New
ResourceManager("machinelocator", a)
Dim str As String = rm.GetString("errorMessage",
Thread.CurrentThread.CurrentUICulture)

However, I put the name of the application on the ResourceManager, and
the name of the application is not the same name of the namespace
where this assembly runs (IRONSearch), probably that's the source of
error. I truly don't know if the name to be put there is the name of
the project or the namespace for that particular assembly. I always
get the following exception:
ex.Message "Could not find any resources appropriate for the
specified culture (or the neutral culture) in the given assembly.
Make sure "machinelocator.resources" was correctly embedded or linked
into assembly "machinelocator".
baseName: machinelocator locationInfo: <null> resource file name:
machinelocator.resources assembly: machinelocator,
Version=1.0.1990.18389, Culture=neutral, PublicKeyToken=null" String

Also the Culture info I get is for the neutral Culture when I had set
the en-US culture.

I tested ResourceManager("IRONSearch", a) as IronSearch is the name of
the namespace where the executing assembly is, and I get the same
error. The root namespace though is "machinelocator".
Sorry that I didn't use generic terms for this, but I guess it's ok.
Any idea?
Thanks a lot in advance,
Lizet







On 6/13/05, Mark Kucera <mkucera@xxxxxxxxxxxxxx> wrote:
> I've used embedded resources w/ VS.NET 2003 quite successfully. Here are the
> steps I've used...
>
> 1. Create the resource files for each culture i.e.
> ResourceFile.resx
> ResourceFile.FR.resx
> ResourceFile.DE.resx
> Etc...
>
> And add your translated strings to the files.
>
> 2. Then create a helper class to retrieve the managed content, something like
> this:
>
> public static string GetResourceContent(string name)
> {
> ResourceManager res = new ResourceManager("Root Namespace Name Here",
> Assembly.GetExecutingAssembly());
> return res.GetString(name);
> }
>
> 3. I generally put this method in a custom control, similar to a label that
> I can put on a page and assign the string name to retrieve from the resource
> file...
>
> namespace MyNameSpace
> {
> using System;
> using System.Web.UI;
> using System.Web.UI.WebControls;
> using System.Resources;
> using System.Reflection;
>
> /// <summary>
> /// Summary description for SiteTextControl.
> /// </summary>
> public abstract class SiteTextControl : System.Web.UI.UserControl
> {
> private string _Name;
> private string _CssClass;
>
> private void Page_Load(object sender, System.EventArgs e)
> {}
>
> public string Name
> {
> get {return _Name;}
> set {_Name = value;}
> }
>
> public string CssClass
> {
> get
> {
> if (_CssClass == null || _CssClass.Length ==
> 0)
> _CssClass = "font-md";
>
> return _CssClass;
> }
> set {_CssClass = value;}
> }
>
> protected sealed override void CreateChildControls()
> {
> ResourceManager res = new
> ResourceManager("Root Namespace Name Here", Assembly.GetExecutingAssembly());
> string _Text = "";
> if (_CssClass != null && _CssClass.Length != 0)
> _Text = "<span class=\"" + _CssClass + "\">"
> + res.GetString(_Name) + "</span>";
> else
> _Text = res.GetString(_Name);
>
> LiteralControl lit = new
> LiteralControl(_Text);
> Controls.Add(lit);
> lit.Dispose();
> }
>
> public static string GetResourceContent(string name)
> {
> ResourceManager res = new
> ResourceManager("Root Namespace Name Here", Assembly.GetExecutingAssembly());
> return res.GetString(name);
> }
>
> #region Web Form Designer generated code
> protected sealed override void OnInit(EventArgs e)
> {
> //
> // CODEGEN: This call is required by the ASP.NET Web
> Form Designer.
> //
> InitializeComponent();
> base.OnInit(e);
> }
>
> /// Required method for Designer support - do not
> modify
> /// the contents of this method with the code
> editor.
> /// </summary>
> private void InitializeComponent()
> {
> this.Load += new System.EventHandler(this.Page_Load);
> }
> #endregion
> }
> }
>
>
> 4. Then I add the control to a page (or other control) where I want to use
> managed content
> <%@Register tagprefix="MyTagPrefix" Tagname="SiteTextControl"
> src="SiteTextControl.ascx" %>
>
> <p> <MyTagPrefix:SiteTextControl id="Sitetextcontrol1" runat="Server"
> name="Name of string to lookup" /></p>
>
> As long as you have set the System.Globalization.CultureInfo.CurrentCulture
> to the correct target culture, you can rely on the resource manager to read
> the string from the correct resource file. It should fall back on the
> English version if it can't find the string in the target culture's resource
> file.
>
> I think the most tricky thing I encountered when I was setting this up, was
> making sure the namespace that I passed in to the ResourceManager constructor
> was correct, but you should be able to use Reflector, or ILDasm to make sure
> your resource files are being included in the assembly, and to check their
> names...
>
> Good Luck
> MK
>
>
>
> Mark Kucera
> mkucera@xxxxxxxxxxxxxx
>
>
> -----Original Message-----
> From: Discussion of building .NET applications targeted for the Web
> [mailto:DOTNET-WEB@xxxxxxxxxxxxxxxxxxx] On Behalf Of lizet peña
> Sent: Monday, June 13, 2005 10:56 AM
> To: DOTNET-WEB@xxxxxxxxxxxxxxxxxxx
> Subject: [DOTNET-WEB] embedding resources for globalization (complete
> frustration)
>
> Well, our team decided to go back to VS 2003 instead of deploying the
> project on 2005, the reasons are not part of this email.
> Our current problem is with 1.1 Framework. We have a .resX file for
> each web form on the project and would like to access each resource in
> it. The ResourceManager class would only work with .resources files
> and in order to access them, these files should be embedded into
> satellite assemblies.
> We followed the steps in
> http://www.codeproject.com/dotnet/Localization.asp
>
> Al.exe
> /t:lib
> /embed: MyApplication.en-GB.resources,
> /culture:en-GB
> /out:MyApplication.resources.dll
>
> and created a MyApplication.resources.dll for each culture. We
> previously converted the .resX files into .resources with resgen.exe.
> Resgen MyApplication.en-GB.resX
>
> In order to load the specific resource:
>
> Dim a As [Assembly] = [Assembly].Load("MyApplication")
> Dim rm As ResourceManager = New
> ResourceManager("searchUI", a)
> Dim str As String = rm.GetString("errorMessage",
> Thread.CurrentThread.CurrentUICulture)
>
> The assembly loads fine and the resource manager is instantiated
> correctly, however when we try to get the string with the particular
> resource, there's is an exception saying the resource cannot be
> located, to make sure the .resource file is embedded in the satellite
> assembly.
> Any ideas of where to start troubleshooting the error are more than
> welcome, I have generated the satellite assemblies three times now and
> honestly don't know why the resources aren't loaded at all.
> Thanks in advance,
> Lizet
>
> ===================================
> This list is hosted by DevelopMentor(r) http://www.develop.com
>
> View archives and manage your subscription(s) at http://discuss.develop.com
>
> ===================================
> This list is hosted by DevelopMentor(r) http://www.develop.com
>
> View archives and manage your subscription(s) at http://discuss.develop.com
>

===================================
This list is hosted by DevelopMentor® http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com



<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise