2010-01-28 5 views
4

J'essaie ici de faire une traduction manuelle pour l'application avec laquelle je travaille. (Il existe déjà un LocalizationModule de travail, mais il fonctionne mal famé, donc je ne peux pas utiliser <asp:Localize /> tags.Comment utiliser ResourceManager en mode "site Web"?

Normalement avec ResourceManager vous êtes censé être l'utiliser comme Namespace.Folder.Resourcename (dans une application). Actuellement, je traduis un aspic existant .net "site web" (pas d'application web donc pas d'espace de nommage ici ....)

Les ressources sont situées dans un nom de dossier "Locales/ressources" qui contient "fr-ca.resx" et "fr-fr . .resx »

J'utilisé un code avec quelque chose comme ceci:

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; 
} 

et dans la page J'ai quelque chose comme ça <%= Locale.T("T_HOME") %>

Quand je rafraichir je ceci:

Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Locales.resources" was correctly embedded or linked into assembly "App_Code.9yopn1f7" at compile time, or that all the satellite assemblies required are loadable and fully signed. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Locales.resources" was correctly embedded or linked into assembly "App_Code.9yopn1f7" at compile time, or that all the satellite assemblies required are loadable and fully signed.

Source Error:

Line 14:
System.Resources.ResourceManager resMan = new System.Resources.ResourceManager( "Locales", System.Reflection.Assembly.GetExecutingAssembly(), null); Line 15: Line 16: var text = resMan.GetString(search, System.Threading.Thread.CurrentThread.CurrentCulture); Line 17: Line 18: if (text == null)

Source File: c:\inetpub\vhosts\galerieocarre.com\subdomains\dev\httpdocs\App_Code\Locale.cs Line: 16

J'ai même essayé de charger la ressource avec Locales.fr-ca ou seulement fr-ca rien travailler tout à fait ici.

+0

Est-il possible de placer les fichiers de ressources dans un dossier App_LocalResources? – ScottE

+0

Il faudrait que je crée une ressource pour chaque page, tout à fait perdre du temps je dirais:/App_LocalResources est aussi surtout pour la balise n'est-ce pas? – Erick

Répondre

0

Lors de l'utilisation des ressources en ASP.Net, vous verrez un compilateur spécialisé utilisé (propriété personnalisée de l'outil) sur les fichiers .resx (ResXCodeGen)

Bottom line est que vos ressources sont compilées dans une classe . Le nom de cette classe est le nom que vous devez utiliser lorsque vous voulez adresser les ressources.

Le nom de la classe est générée comme suit:

{espace de noms de projet} {structure du dossier} {nom} .resx (.resx est pas partie du nom généré)

Puisque vous avez mentionné votre fichier resx est le nom que vous devez utiliser est situé dans un nom de répertoire « ressources locales/», (en supposant que le fichier resx est appelé « locales.resx »)

« locales.resources.locales »

L'ajout de la langue et du lieu, comme le "uk-fr" est ajouté par le gestionnaire de ressources, chargeant l'assembly approprié en fonction de la valeur Culture spécifiée lors de la création d'une instance du ResourceManager. Si aucun n'est donné, Thread.CurrentCulture est utilisé. Vous ne devez pas utiliser vous-même les extensions de langue/d'environnement, laissez-le au gestionnaire de ressources pour gérer cela.

Si vous n'êtes pas sûr de la fin de la classe de ressources, vous pouvez toujours consulter le fichier MSIL ou utiliser le réflecteur pour déterminer le nom de la classe de ressources dans l'assembly déployé réel.

; - Ajout après commentaires où placé -------

J'ai aussi regardé un autre code que j'avais arround;

Avez-vous essayé l'approche Reflection on App_GlobalResources? 1: Vous chargez la bibliothèque "App_GlobalResources" dans le contexte du site Web (dans un HttpHandler, Aspx, Ascx, etc.). => Assemblage.Load ("App_GlobalResources");

2:. Promenade à travers les types disponibles là-bas et saisir la propriété "ResourceManager" de chaque type =>

PropertyInfo pi = type.GetProperty ("ResourceManager");

resManager = pi.GetValue (null, nouvel objet [] {}) en tant que ResourceManager;

3: S'il en avait un, obtenez le ResourceSet que vous voulez => resManager.GetResourceSet (englishCulture, true, true);

Espérons que cela aide.

+0

En fait, les fichiers sont fr-ca.resx et en-us.resx. Tho J'ai essayé de les aborder comme vous l'avez mentionné mais comme il s'agit d'un site web (pas d'application web), il n'y a pas d'espace de noms/classe. J'ai même essayé de les déplacer vers App_Code pour les trouver, je n'ai pas travaillé plus. – Erick

+0

Salut Erick, si je me souviens bien, si quelque chose n'a pas un espace de noms par lui-même, l'ASP.Le compilateur Net JIT ajoutera le "ASP". en tant qu'espace de noms. La chose la plus simple à faire maintenant est de compiler votre site Web (aspnet_compiler.exe) et de charger les assemblys résultants dans Reflector. Cela vous donnera un aperçu clair sur la façon dont votre classe est appelée. Si vous souhaitez utiliser les vraies bibliothèques ASP.Net, vous pouvez consulter les fichiers "c: \ windows \ Microsoft.Net \ Framework \ Temporary ASP.Net \ .... \ App_Code.9yopn1f7.dll" (Où le ... est un répertoire généré aléatoirement par le compilateur Asp.Net JIT hébergé dans IIS). –

-1

Modifier

Dans le cas d'un projet de site Web, lisez this walkthrough of Microsoft.

Je crains que vous ne puissiez pas utiliser ResourceMagager dans un projet de site Web, car il nécessite un espace de noms/un ensemble dans lequel se trouvent les ressources.

+0

Vous avez quelque chose que vous n'avez pas inclus. C'est un projet en mode site web. Donc mon resx (Locale.fr.resx dans ce cas, c'est vraiment Locale.fr.resx, seulement les fichiers Xml, pas plus que ça). Je n'ai pas de fichier Designer et je n'ai pas d'espaces de noms. :) – Erick

+0

Je ne comprends pas. Comment pouvez-vous ne pas avoir d'espaces de noms ou de fichiers de concepteur, mais seulement des fichiers resx? Certes, lorsque vous travaillez avec C# comme vous le dites, vous avez des espaces de noms. Néanmoins, n'oubliez pas que vous aurez au moins besoin de créer un Locale.resx (via l'option Ajouter un nouvel élément dans le menu contextuel de l'explorateur de solution). Visual Studio doit créer un fichier de concepteur derrière votre Locale.resx. L'étape suivante consiste à créer des ressources localisées pour les langues étrangères. – Webleeuw

+0

S'il vous plaît voir ma réponse mise à jour pour plus d'informations sur la façon dont un projet web avec des ressources localisées pourrait être mis en place. – Webleeuw

0

ce n'est pas C#, mais vous pouvez facilement le convertir en elle

J'ai dans le répertoire App_LocalResources avec 2 fichiers

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

et je l'utilise comme ça dans ma page .aspx

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

Voilà comment je gère sur le mien

'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 

et dans chaque page je suis arrivé

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 

quand je veux utiliser ResourceManager créer un fichier global des ressources au niveau de la racine du Je l'utilise comme celui-ci

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

Seulement utilisable comme application web pas site web ... Il n'y a pas d'espace de noms en mode site web. – Erick

1

Peut-être que vous êtes juste à la recherche de la base de System.Web.Page GetLocalResourceObject(),?

voir http://msdn.microsoft.com/en-us/library/ms153597.aspx

+0

Merci beaucoup pour cette réponse, j'ai cherché beaucoup de pages et c'est ce qui a fonctionné pour moi dans mon "site web". Dans une page, dites simplement 'GetGlobalResourceObject (" ResourceFileName "," String1 ")' – ToddBFisher

2

solution de Marvin Smit est très bien si vous n'avez pas accès à HttpContext

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

Mais si vous avez accès à HttpContext utiliser juste HttpContext.GetGlobalResourceObject

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

return (string) HttpContext.GetGlobalResourceObject ("Resources.SiteTxt", nom, GetCultureFromLanguage()); l'a fait pour moi aussi. –

Questions connexes