Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de localisation explicite

1 réponse
Avatar
Gloops
Bonjour tout le monde,

Je suis en train d'=E9crire une page ASP sur le choix de la langue, elle =

s'affiche bien en Anglais dans IE et en Fran=E7ais dans Firefox, donc la =

localisation implicite est bien acquise.

En revanche, je suis en train de me planter en beaut=E9 pour ce qui est d=
e=20
la localisation explicite.

J'ai cr=E9=E9 une liste d=E9roulante avec comme valeurs les cultures=20
disponibles, donc d'une part la culture par d=E9faut, d'autre part les=20
cultures faisant l'objet de fichiers de ressources, voir fil "R=E9pertoir=
e=20
et nom de fichier aspx" d'avant-hier soir sur la fa=E7on de les conna=EEt=
re.

J'ai bien ajout=E9 if(!this.isPostBack) pour que la liste d=E9roulante ne=
=20
soit initialis=E9e qu'une fois. Jusqu'au choix par l'utilisateur, tout se=
=20
passe bien.

La clef de la culture s=E9lectionn=E9e s'affiche proprement dans un Label=
,=20
toutefois la page reste affich=E9e dans la m=EAme langue.

protected override void InitializeCulture()
{
if (Page.IsPostBack)
{
String selectedLanguage =3D DropDownList1.SelectedItem.Value=
;
UICulture =3D selectedLanguage;
//Culture =3D selectedLanguage;

Label1.Text =3D selectedLanguage;

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

Une chose m'intrigue : j'ai d=FB ajouter un appel explicite =E0=20
InitializeCulture depuis le Page_Load, je ne vois rien dans ce sens l=E0 =
:

http://msdn2.microsoft.com/en-us/library/bz9tc508(VS.80).aspx

Il est vrai que j'ai pris une libert=E9 avec le code, qui ins=E8re la=20
fonction dans le fichier asp, alors que je l'ai ins=E9r=E9 en Code-behind=
,=20
dans un fichier cs. Il ne m'est pas vraiment =E9vident que ceci soit d=E9=
cisif.

Je mets une pause sur UICulture =3D selectedlanguage.
Si j'avais la page affich=E9e en Fran=E7ais et que j'ai s=E9lectionn=E9 A=
nglais :
- UICulture est sur "Fran=E7ais"
- selectedlanguage est sur "en"

apr=E8s ex=E9cution de l'instruction :
- UICulture est sur "English"
- selectedlanguage toujours sur "en"

puis Label1 se met bien =E0 "en".

Mais ma page reste bien affich=E9e dans la m=EAme langue, =E0 savoir cell=
e=20
s=E9lectionn=E9e dans les options du navigateur.

Ai-je fait (ou pas) quelque chose de travers ?

1 réponse

Avatar
Gloops
Oh la la qu'est-ce que "j'avais" tout faux ...

Appeler InitializeCulture depuis Page_Load, de toute manière, c'est une
ineptie, puisqu'elle doit faire son travail avant la création des
contrôles, alors que Page_Load intervient après.

Ensuite, quelque chose a dû me passer au-dessus, car j'ai remplacé le
mot-clef "override" par "virtual", la fois d'après ça a bien appelé
InitializeCulture sans que je le mentionne dans le Page_Load, la fois
d'encore après ça m'a rappelé à l'ordre comme quoi mettre virtual là ce
n'était pas très catholique, et c'était bien override qu'il fallait
mettre (quelquefois on a des messages d'erreur dont le caractère
explicite est douteux, mais là je ne pouvais pas me plaindre de ça).
Toutefois ensuite le InitializeCulture était ressuscité, je n'ai plus eu
de souci du style "je m'appelle InitializeCulture, je suis là mais
personne ne me voit". Donc, j'ai résolu le problème en mettant quelqu e
chose de loufoque, et en remettant les choses dans leur état initial
ensuite. Ou alors j'ai aussi fait quelque chose à côté sans en pren dre
conscience ?

Bon, en tout cas, et d'une.

Ensuite, il y a encore quelque chose qui m'échappe : j'ai bien mis
AutoPostBack à True pour le DropDownList1, changer sa valeur provoque
bien un rafraîchissement de la page, mais lors du rafraîchissement,
pendant le InitializeCulture, isPostBack retourne faux.

Ah, je crois que j'y suis : il doit être initialisé plus tard dans le
cycle d'affichage de la page, donc on peut le tester dans Page_Load,
mais pas dans InitializeCulture.

Toujours est-il que j'ai remplacé if(this.isPostBack) par

if (Request.Form["DropDownList1"] != null)

et String selectedLanguage = DropDownList1.SelectedItem.Value;
par :
String selectedLanguage = Request.Form["DropDownList1"];

en laissant toujours, en-dessous :
UICulture = selectedLanguage;


et maintenant, ça marche.

Donc, par défaut, on parle à l'utilisateur dans la langue qu'il a dit e
dans les options de son navigateur, grâce à la globalisation implicit e,
et si il veut changer d'avis (enfin ... parmi les langues que je parle,
pas exagérer non plus), sous réserve qu'il accepte l'exécution des
scripts, il peut le faire avec la liste déroulante, grâce à la
globalisation explicite -qui peut même gérer une liste de langues
différente pour chaque page, selon la progression des traductions, la
seule restriction étant de ne pas mettre en ligne un fichier de
ressources avant d'avoir fait les traductions dedans, bien entendu.

L'étape suivante sera de faire ça dans une page maîtresse, mais si il y
a un souci avec ça, on en causera dans un autre fil.

Merci à ceux qui auraient passé du temps là-dessus.
_____________________________________
Gloops a écrit, le 08/03/2008 15:17 :
Bonjour tout le monde,

Je suis en train d'écrire une page ASP sur le choix de la langue, ell e
s'affiche bien en Anglais dans IE et en Français dans Firefox, donc l a
localisation implicite est bien acquise.

En revanche, je suis en train de me planter en beauté pour ce qui est de
la localisation explicite.

J'ai créé une liste déroulante avec comme valeurs les cultures
disponibles, donc d'une part la culture par défaut, d'autre part les
cultures faisant l'objet de fichiers de ressources, voir fil "Réperto ire
et nom de fichier aspx" d'avant-hier soir sur la façon de les connaî tre.

J'ai bien ajouté if(!this.isPostBack) pour que la liste déroulante ne
soit initialisée qu'une fois. Jusqu'au choix par l'utilisateur, tout se
passe bien.

La clef de la culture sélectionnée s'affiche proprement dans un Lab el,
toutefois la page reste affichée dans la même langue.

protected override void InitializeCulture()
{
if (Page.IsPostBack)
{
String selectedLanguage = DropDownList1.SelectedItem.Valu e;
UICulture = selectedLanguage;
//Culture = selectedLanguage;

Label1.Text = selectedLanguage;

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

Une chose m'intrigue : j'ai dû ajouter un appel explicite à
InitializeCulture depuis le Page_Load, je ne vois rien dans ce sens là :

http://msdn2.microsoft.com/en-us/library/bz9tc508(VS.80).aspx

Il est vrai que j'ai pris une liberté avec le code, qui insère la
fonction dans le fichier asp, alors que je l'ai inséré en Code-behi nd,
dans un fichier cs. Il ne m'est pas vraiment évident que ceci soit dé cisif.

Je mets une pause sur UICulture = selectedlanguage.
Si j'avais la page affichée en Français et que j'ai sélectionné Anglais :
- UICulture est sur "Français"
- selectedlanguage est sur "en"

après exécution de l'instruction :
- UICulture est sur "English"
- selectedlanguage toujours sur "en"

puis Label1 se met bien à "en".

Mais ma page reste bien affichée dans la même langue, à savoir ce lle
sélectionnée dans les options du navigateur.

Ai-je fait (ou pas) quelque chose de travers ?