Utilisation de fichiers resources (.resx) pour l'internationnalisation d'un site

Résolu
nassimpat7 Messages postés 6 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 7 juillet 2009 - 19 juin 2009 à 11:24
nassimpat7 Messages postés 6 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 7 juillet 2009 - 23 juin 2009 à 08:43
Bonjour à tous,

Je développe actuellement un site web sous Visual Studio Web Developer en ASP.NET / C# avec le .NET FRAMEWORK 3.5 SP1.
Pour la gestion des langues, j'ai choisi d'utiliser les fichiers de ressources qui me semblent être une très bonne solution.
Le problème, c'est que ça ne fonctionne pas! Ou plutôt, je n'arrive à faire fonctionner cette mécannique.
Il n'y a aucun problème concernant les données par défaut, en langue française mais les changements de langue ne se font pas. 

Je vous explique ma démarche:
J'ai créé mes fichiers .resx, le 1er => Dictionnaire.resx et les autres => Dictionnaire.en-GB.resx, Dictionnaire.de.DE.resx, Dictionnaire.es-MX.resx. Dans le répertoire /App_GlobalResources.

Dans le web.config, j'ai mis la balise suivante => <globalizationuiCulture="
fr"
culture="
fr-FR"
/>, pour indiquer la langue par défaut.

Dans la page .aspx en entête j'ai mis <%
@
Page
Language="C#"
AutoEventWireup="true"
CodeFile="index.aspx.cs"
Inherits="_Index"
UICulture="auto" %>

Et j'utilise des control ImageButton pour chaque langue avec un petit drapeau dont je vous met un exemplaire: <asp:ImageButton
ID="ImgBtEn"
runat="server"
ImageUrl="/images/en.gif"
CssClass="img_langues" AlternateText="en"
title="en"
onclick="ImgBtEn_Click"
ValidationGroup="langue"
PostBackUrl="/"
/>

Ensuite, pour chaque control que je souhaite traduire j'ai utilisé la propriété Expression et ça donne ceci :
<asp:Label
ID="HeaderTitle"
runat="Server"
Text="<%$ Resources:Dictionnaire, HeaderTitle %>
"
/>

Dans le code-behind C#, j'ai dans un premier temps fait mes using :
using System.Globalization;

using System.Resources;

using System.Threading;

Puis j'ai fais mes fonctions attachés à mes drapeaux :
(J'ai volontairement laissé du code en commentaire pour vous montrer ce que j'ai essayé et qui n'a pas fonctionné)

//proprités

string langue =
"";

protected
void Page_Load(
object sender,
EventArgs e)
{

/*
if (!Page.IsPostBack)
{
HeaderTitle.Text = Resources.Dictionnaire.HeaderTitle;
HeaderSubTitle.Text = Resources.Dictionnaire.HeaderSubTitle;
BodyTitle.Text = Resources.Dictionnaire.BodyTitle;
SearchTitle.Text = Resources.Dictionnaire.SearchTitle;
SideBarActu.Text = Resources.Dictionnaire.SideBarActu;
SideBarFaq.Text = Resources.Dictionnaire.SideBarFaq;
SearchGamme.Text = Resources.Dictionnaire.SearchGamme;
SearchProduit.Text = Resources.Dictionnaire.SearchProduit;
Button2.Text = Resources.Dictionnaire.ButtonSearch;
SideBarLogin.Text = Resources.Dictionnaire.SideBarLogin;
LabelMail.Text = Resources.Dictionnaire.LabelMail;
LabelPass.Text = Resources.Dictionnaire.LabelPass;
Button1.Text = Resources.Dictionnaire.ButtonConnection;
MessageTeam.Text = Resources.Dictionnaire.MessageTeam;
}
*/
}

//Mes fonctions pour traduire les contenus statiques et dynamiques
protected
void ImgBtFr_Click(
object sender,
ImageClickEventArgs e)
{

this.langue =
"";

//InitializeCulture();
//FrameworkInitialize()
ChangeLangue();
}

protected
void ImgBtEn_Click(
object sender,
ImageClickEventArgs e)
{

this.langue =
"en-US";

//InitializeCulture();
//FrameworkInitialize()
ChangeLangue();
}

protected
void ImgBtDe_Click(
object sender,
ImageClickEventArgs e){

this.langue =
"de-DE";

//InitializeCulture();
//FrameworkInitialize()
ChangeLangue();
}

protected
void ImgBtEs_Click(
object sender,
ImageClickEventArgs e)
{

this.langue =
"es-MX";

//InitializeCulture();
//FrameworkInitialize()
ChangeLangue();
}

protected
void ChangeLangue()
{
string selectedLanguage this.langue;UICulture selectedLanguage;
Culture = selectedLanguage;

Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(selectedLanguage);

Thread.CurrentThread.CurrentUICulture =
new
CultureInfo(selectedLanguage);
}
 
/*
protected override void FrameworkInitialize()
{
string selectedLanguage = this.langue;
UICulture = selectedLanguage;

Culture = selectedLanguage;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

base.FrameworkInitialize();
}

protected override void InitializeCulture()
{
string selectedLanguage = this.langue;

UICulture = selectedLanguage;
Culture = selectedLanguage;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
base.InitializeCulture();
}
*/

Voilà, je pense avoir fait le tour.
Je tiens à préciser que ça fait déjà plusieurs jours que je bloc la dessus.
Donc SVP, si quelqu'un pouvais m'aider ou me donner une solution...

Merci à tous par avance.

1 réponse

nassimpat7 Messages postés 6 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 7 juillet 2009 1
23 juin 2009 à 08:43
J'ai enfin trouvé la solution!!!
Il fallait tout simplement un control asp qui supporte l'autopostback, et auquel on peut renseigner la propriété Value.

En faisant comme ci-dessous ça fonctionne
Code-behind :
protected override void InitializeCulture()
{
string lang = Request["language"];
if (lang != null && lang != "")
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
}

Page aspx :


Français


English


Deutsh


Espa&ntilde;ol


Et ça fonctionne très bien
3
Rejoignez-nous