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

Liste des cultures du projet

19 réponses
Avatar
Gloops
Bonjour tout le monde,

Quelqu'un saurait-il me dire comment obtenir (par code ;) ) la liste des =

cultures faisant l'objet de ressources dans le projet Windows.Forms en=20
cours ?

J'ai fait une globalisation implicite (fil d'il y a une semaine), et=20
j'aimerais permettre =E0 un utilisateur =E9tranger en visite d'afficher=20
l'application dans sa langue, m=EAme si ce n'est pas la langue de la=20
machine (globalisation explicite, apr=E8s que la globalisation implicite =

ait fourni la valeur par d=E9faut).


Pour la liste de toutes les cultures existantes, pas de probl=E8me :

CultureInfo[] cn =3D CultureInfo.GetCultures(CultureTypes.NeutralCultures=
);

Le probl=E8me est de restreindre la liste aux langues pour lesquelles une=
=20
traduction est fournie. Tant qu'il y en a deux c'est vrai que je=20
pourrais les mettre en dur, mais si je ne m'abuse la plateforme autorise =

de fournir des ressources suppl=E9mentaires apr=E8s le d=E9ploiement, aus=
si il=20
serait bon que le programme puisse s'adapter. De plus, pas la peine=20
d'obliger =E0 d=E9filer le serbo-croate, le Chinois simplifi=E9, le Russe=
, et=20
autres, si en d=E9finitive on n'a le choix qu'entre le Fran=E7ais et l'An=
glais.

9 réponses

1 2
Avatar
Gloops
Gilles TOURREAU [MVP] a écrit, le 26/01/2008 17:00 :
Bonjour,

Avez-vous bien mis le signe "!=" dans la condition au lieu de "== " ?

Cordialement




A vrai dire non, j'avais oublié ce point. Je viens d'essayer.

Avant le changement, j'avais toutes les cultures, et j'ai inversé le
test, c'est-à-dire demandé la négation du test précédent. Je m' attendais
donc à n'obtenir aucune culture, et c'est bien ce que j'ai obtenu :
Label1 n'a pas changé au cours de la procédure.


Je viens même de faire mieux que ça : j'ai créé une étiquette
lblCulturesConservees et une étiquette lblCulturesIgnorees, qui au
départ contiennent un texte ressemblant à leur nom. J'ai du reste
remplacé le code par ceci :

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

System.Resources.ResourceManager rm =
new System.Resources.ResourceManager("StringResource",
System.Reflection.Assembly.GetExecutingAssembly());
foreach (System.Globalization.CultureInfo ci in
System.Globalization.CultureInfo.GetCultures(System.Globalization.Culture Types.NeutralCultures))

{
if (rm.GetResourceSet(ci, true, false) != null) {
this.lblCulturesConservees.Text =
lblCulturesConservees.Text + "/" + ci.ToString();
}else{
this.lblCulturesIgnorees.Text =
lblCulturesIgnorees.Text + "/" + ci.ToString();
}

}
}

}

et j'obtiens ceci :

Cultures conservées :
__________
Cultures ignorées :
/ar/bg/ca/zh-CHS/cs/da/de/el/en/es/fi/fr/he/hu/is/it/ja/ko/nl/no/pl/pt/ro /ru/hr/sk/sq/sv/th/tr/ur/id/uk/be/sl/et/lv/lt/fa/vi/hy/az/eu/mk/af/ka/fo/ hi/ms/kk/ky/sw/uz/tt/pa/gu/ta/te/kn/mr/sa/mn/gl/kok/syr/dv//zh-CHT/sr

Si je remets == comme avant, j'obtiens :

Cultures conservées :
/ar/bg/ca/zh-CHS/cs/da/de/el/en/es/fi/fr/he/hu/is/it/ja/ko/nl/no/pl/pt/ro /ru/hr/sk/sq/sv/th/tr/ur/id/uk/be/sl/et/lv/lt/fa/vi/hy/az/eu/mk/af/ka/fo/ hi/ms/kk/ky/sw/uz/tt/pa/gu/ta/te/kn/mr/sa/mn/gl/kok/syr/dv//zh-CHT/sr
__________
Cultures ignorées :


En bref, je réussis à remplacer tout noir par tout blanc, alors que l e
résultat recherché est gris clair.




Quant à ma lecture de la doc, est-elle correcte ?

GetResourceSet
Gets the ResourceSet for a particular culture.

cherche dans le projet une ressource pour la culture indiquée

createIfNotExists
If true and if the ResourceSet has not been loaded yet, load it.

charge la culture si elle n'a pas été chargée avant.
La ressource contient les textes de la page en cours d'affichage, je ne
m'attends donc pas à beaucoup d'influence de ce paramètre sur ce test .

tryParents
If the ResourceSet cannot be loaded, try parent CultureInfo objects to
see if they exist.

Si une culture locale n'est pas trouvée dans le projet (par exemple
fr-be), charge la culture parent (dans l'exemple fr).

***
Pour plus de précision, puisque je n'obtiens aucun résultat, j'en arr ive
à me demander si les ressources visées par cette instruction ne sont pas
seulement celles fournies par des fichiers d'extension .Resource, alors
que dans le projet j'ai des ressources d'extension .Resx

Je vais voir si j'arrive à quelque chose en travaillant un peu plus sur
ResxResourceSet
Avatar
Gloops
Gloops a écrit, le 26/01/2008 20:11 :
tryParents
If the ResourceSet cannot be loaded, try parent CultureInfo objects to
see if they exist.

Si une culture locale n'est pas trouvée dans le projet (par exemple
fr-be), charge la culture parent (dans l'exemple fr).




A l'instant j'ai essayé
if (rm.GetResourceSet(ci, true, true) == null) {

et j'ai obtenu une erreur :


System.Resources.MissingManifestResourceException was unhandled by user c ode
Message="Could not find any resources appropriate for the specified
culture or the neutral culture. Make sure "StringResource.resources"
was correctly embedded or linked into assembly "App_Web_vl4hcf9o" at
compile time, or that all the satellite assemblies required are loadable
and fully signed."
Source="mscorlib"
StackTrace:
at
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
at
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
at _Default.Page_Load(Object sender, EventArgs e) in (repertoire
documents)Default.aspx.cs:line 23
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,
Object o, Object t, EventArgs e)
at
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,
EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

***

Là-dedans, la phrase "Make sure "StringResource.resources" was
correctly embedded or linked into assembly" m'encourage à chercher du
côté de ResxResourceSet, puisque je n'ai aucun fichier .Resources, ma is
en revanche des fichiers .Resx
Avatar
Gloops
Gloops a écrit, le 23/01/2008 21:29 :
L'autre jour j'ai lorgné sur ResxResourceSet, et à ce que j'ai vu c eci
suppose de donner le nom du fichier de ressources qu'on veut lire. J'ai
eu l'idée de composer le nom du fichier de ressources dans le style
"Default.aspx" + culture.ToString() + "resx".




Je dois avouer que je commence à être un peu nerveux ...

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{


//System.Resources.ResourceManager rm = new
System.Resources.ResourceManager("StringResource",
System.Reflection.Assembly.GetExecutingAssembly());
System.Resources.ResXResourceSet rsx;

foreach (System.Globalization.CultureInfo ci in
System.Globalization.CultureInfo.GetCultures(System.Globalization.Culture Types.NeutralCultures))

{
try
{
rsx = new
System.Resources.ResXResourceSet("~//App_LocalResources//Default." +
ci.ToString() + ".resx");
this.lblCulturesConservees.Text =
this.lblCulturesConservees.Text + "/" + ci.ToString();
}catch(Exception ex){
this.lblCulturesIgnorees.Text =
lblCulturesIgnorees.Text + "/" + ci.ToString();
}

}
}

}

Cultures conservées :
__________
Cultures ignorées :
/ar/bg/ca/zh-CHS/cs/da/de/el/en/es/fi/fr/he/hu/is/it/ja/ko/nl/no/pl/pt/ro /ru/hr/sk/sq/sv/th/tr/ur/id/uk/be/sl/et/lv/lt/fa/vi/hy/az/eu/mk/af/ka/fo/ hi/ms/kk/ky/sw/uz/tt/pa/gu/ta/te/kn/mr/sa/mn/gl/kok/syr/dv//zh-CHT/sr

Pourtant, j'ai bien un fichier App_LocalResourcesDefault.fr.resx

Que "en" (la culture par défaut) n'apparaisse pas, ça OK, je
l'ajouterais explicitement, mais fr, là il y a un os ...

Ou c'est mon chemin d'accès "~//App_LocalResources//Default." +
ci.ToString() + ".resx" qui n'est pas correct ?
Avatar
Gloops
Gloops a écrit, le 23/01/2008 21:29 :
L'autre jour j'ai lorgné sur ResxResourceSet, et à ce que j'ai vu c eci
suppose de donner le nom du fichier de ressources qu'on veut lire. J'ai
eu l'idée de composer le nom du fichier de ressources dans le style
"Default.aspx" + culture.ToString() + "resx".



Dans le try{}catch{}, apparemment il y aurait lieu plutôt de mettre
quelque chose comme ça :

ResXResourceReader rsxr =
new ResXResourceReader("~//Default." + ci.ToString() + ".resx");
IDictionaryEnumerator id = rsxr.GetEnumerator();

du moins, pour la première ligne.

Si on ne met que la première ligne le code s'exécute proprement pour
toutes les cultures, à la deuxième il déclenche une erreur pour tou tes.

Bon, eh bien ... petite pause ;)
Avatar
Gloops
Gloops a écrit, le 26/01/2008 22:20 :
ResXResourceReader rsxr =
new ResXResourceReader("~//Default." + ci.ToString() + ".resx");
IDictionaryEnumerator id = rsxr.GetEnumerator();




Bon, eh bien ... petite pause ;)




J'ai bien fait : j'étais en train d'ajouter des problèmes hors sujet en
oubliant le MapPath, rhô l'honte !

C'est vrai aussi que c'était un peu "ballot" de gérer des exceptions
sans en afficher le texte si je n'arrivais pas à mes fins.
Avatar
Gloops
Gloops a écrit, le 06/01/2008 20:35 :
Bonjour tout le monde,

Quelqu'un saurait-il me dire comment obtenir (par code ;) ) la liste de s
cultures faisant l'objet de ressources dans le projet Windows.Forms en
cours ?




Eurêka ! Maintenant ça marche.

Alors maintenant, reste à me dire si je n'ai pas fait un truc dont la
dose d'orthodoxie laisserait à désirer ... ;)

Cultures conservées : /fr
__________
Cultures ignorées :
/ar/bg/ca/zh-CHS/cs/da/de/el/en/es/fi/he/hu/is/it/ja/ko/nl/no/pl/pt/ro/ru /hr/sk/sq/sv/th/tr/ur/id/uk/be/sl/et/lv/lt/fa/vi/hy/az/eu/mk/af/ka/fo/hi/ ms/kk/ky/sw/uz/tt/pa/gu/ta/te/kn/mr/sa/mn/gl/kok/syr/dv//zh-CHT/sr


J'ai bien le français comme seule culture reconnue en plus de la cultur e
par défaut (dont le texte est en Anglais), donc si un jour ça me piqu e
de traduire ma page en Allemand, le site va s'en apercevoir
automatiquement à l'exécution. A moi bien entendu de savoir sur quell e
page se fait le test, et d'en tirer les conséquences pour implanter les
traductions dans le bon ordre.

Techniquement, il est à noter que toutes les cultures réussissent à
s'initialiser au niveau new ResXResourceReader, même si le fichier
indiqué n'existe pas (du moins au niveau source), la sélection entre le
"virtuel" et l'existant s'effectue au niveau de l'IDictionaryEnumerator.
On peut ouvrir un fichier de ressources inexistant, mais on ne peut pas
y créer un index.

J'essaierais bien de faire mieux au niveau des coupures de lignes, mais
j'en vois une qui s'étale dans la fenêtre de saisie sur trois lignes, ça
promet du boulot ça ...


public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
foreach (System.Globalization.CultureInfo ci in
System.Globalization.CultureInfo.GetCultures(System.Globalization.Culture Types.NeutralCultures))

{
try
{
ResXResourceReader rsxr = new
ResXResourceReader(MapPath("~//App_LocalResources//Default.aspx." +
ci.ToString() + ".resx"));
IDictionaryEnumerator id = rsxr.GetEnumerator();
this.lblCulturesConservees.Text =
this.lblCulturesConservees.Text + "/" + ci.ToString();
}catch(Exception ex){
this.lblCulturesIgnorees.Text =
this.lblCulturesIgnorees.Text + "/" + ci.ToString();
}

}
}
}
Avatar
Gloops
Gloops a écrit, le 27/01/2008 08:39 :
J'essaierais bien de faire mieux au niveau des coupures de lignes, mais
j'en vois une qui s'étale dans la fenêtre de saisie sur trois ligne s, ça
promet du boulot ça ...




Au vu du résultat, je pense que ceci devrait être mieux (une autre fo is
je penserai peut-être aux newsgroups de test).

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
foreach (System.Globalization.CultureInfo ci in
System.Globalization.CultureInfo.GetCultures(System.Globalization.Culture Types.NeutralCultures))
{
try
{
ResXResourceReader rsxr =
new
ResXResourceReader(MapPath("~//App_LocalResources//Default.aspx." +
ci.ToString() + ".resx"));
IDictionaryEnumerator id = rsxr.GetEnumerator();
this.lblCulturesConservees.Text =
this.lblCulturesConservees.Text + "/" + ci.ToString();
}catch(Exception ex){
this.lblCulturesIgnorees.Text =
this.lblCulturesIgnorees.Text + "/" + ci.ToString();
}

}
}
}
Avatar
Gilles TOURREAU [MVP]
Bonjour,

Juste pour info, le fait de demander des cultures neutres (NeutralCultures)
signifie que vous souhaitez rechercher des ressources neutres.
Je m'explique pour le Frenchy, la culture neutre (universelle) est : fr
Or, si vous avez créer une ressource fr-FR (pour le Frenchy Français) ou
fr-CA (pour le Frenchy Canadien) dans votre projet, mon code ne fonctionnera
pas !

Il faut soit que vous utilisez des ressources neutres dans votre projet
(commun à toutes les "sous-cultures", par exemple, "fr", "en", "sp") ou
alors que vous recherchez plutôt les cultures spécifique (SpecificCultures)
("fr-CA", "fr-FR", "en-US", "en-UK",...etc).

Cordialement

--
Gilles TOURREAU - MVP C#


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gloops
Gilles TOURREAU [MVP] a écrit, le 27/01/2008 10:47 :
Il faut soit que vous utilisez des ressources neutres dans votre projet
(commun à toutes les "sous-cultures", par exemple, "fr", "en", "sp") ou
alors que vous recherchez plutôt les cultures spécifique
(SpecificCultures) ("fr-CA", "fr-FR", "en-US", "en-UK",...etc).

Cordialement




Re,

Le fichier de ressources s'appelle Default.aspx.fr.resx, donc je pense
qu'avec NeutralCultures on devrait être dans les clous :)
1 2