Liste des cultures du projet

Le
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
cours ?

J'ai fait une globalisation implicite (fil d'il y a une semaine), et
j'aimerais permettre à un utilisateur étranger en visite d'afficher
l'application dans sa langue, même si ce n'est pas la langue de la
machine (globalisation explicite, après que la globalisation implicite =

ait fourni la valeur par défaut).


Pour la liste de toutes les cultures existantes, pas de problème :

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

Le problème est de restreindre la liste aux langues pour lesquelles une=

traduction est fournie. Tant qu'il y en a deux c'est vrai que je
pourrais les mettre en dur, mais si je ne m'abuse la plateforme autorise =

de fournir des ressources supplémentaires après le déploiement, aus=
si il
serait bon que le programme puisse s'adapter. De plus, pas la peine
d'obliger à défiler le serbo-croate, le Chinois simplifié, le Russe=
, et
autres, si en définitive on n'a le choix qu'entre le Français et l'An=
glais.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles TOURREAU [MVP]
Le #12163631
Le Sun, 06 Jan 2008 20:35:11 +0100, 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
cours ?

J'ai fait une globalisation implicite (fil d'il y a une semaine), et
j'aimerais permettre à un utilisateur étranger en visite d'afficher
l'application dans sa langue, même si ce n'est pas la langue de la
machine (globalisation explicite, après que la globalisation implicite
ait fourni la valeur par défaut).


Pour la liste de toutes les cultures existantes, pas de problème :

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

Le problème est de restreindre la liste aux langues pour lesquelles une
traduction est fournie. Tant qu'il y en a deux c'est vrai que je
pourrais les mettre en dur, mais si je ne m'abuse la plateforme autorise
de fournir des ressources supplémentaires après le déploiement, aussi il
serait bon que le programme puisse s'adapter. De plus, pas la peine
d'obliger à défiler le serbo-croate, le Chinois simplifié, le Russe, et
autres, si en définitive on n'a le choix qu'entre le Français et
l'Anglais.





Bonjour,

Je crois qu'il n'existe pas de méthode pour çà...
Cependant ce que vous pouvez faire c'est (pas testé) :

- Instancier un ResourceManager
- Appelez la méthode GetRessourceSet() pour chaque culture, si celle-ci !=
null alors c'est qu'il existe des ressources pour cette culture.

Tenez informé du résultat !

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
Gloops
Le #12163601
Gilles TOURREAU [MVP] a écrit, le 13/01/2008 11:39 :
Bonjour,

Je crois qu'il n'existe pas de méthode pour çà...
Cependant ce que vous pouvez faire c'est (pas testé) :

- Instancier un ResourceManager
- Appelez la méthode GetRessourceSet() pour chaque culture, si celle- ci
!= null alors c'est qu'il existe des ressources pour cette culture.

Tenez informé du résultat !

Cordialement




Hum, ça a l'air sportif, ça :)

Je vais expérimenter ça Samedi, merci.
Gloops
Le #12163501
Gilles TOURREAU [MVP] a écrit, le 13/01/2008 11:39 :
- Instancier un ResourceManager
- Appelez la méthode GetRessourceSet() pour chaque culture, si celle- ci
!= null alors c'est qu'il existe des ressources pour cette culture.

Tenez informé du résultat !



J'ai eu le temps de me rendre compte qu'il faudra que cette affaire
devienne "fluent", mais j'ai encore du taf : je suis en train de me
bagarrer avec le fait que ResourceManager ne peut pas être utilisé à
l'intérieur de protected void PageLoad, "en raison de son niveau de
protection". Pire : la raison ne m'est pas encore évidente.

Comme demain matin de bonne heure je m'attaque à une base Access, ça
n'ira pas plus vite pour autant :(
Gloops
Le #12163481
Gilles TOURREAU [MVP] a écrit, le 13/01/2008 11:39 :
Bonjour,

Je crois qu'il n'existe pas de méthode pour çà...
Cependant ce que vous pouvez faire c'est (pas testé) :

- Instancier un ResourceManager
- Appelez la méthode GetRessourceSet() pour chaque culture, si celle- ci
!= null alors c'est qu'il existe des ressources pour cette culture.

Tenez informé du résultat !

Cordialement




Bon, voilà ce que ça donne.
Je suis allé trouver un exemple de ResourceManager dans les newsgroups,
et ça a fini par fonctionner. Toutefois, le résultat n'est pas confor me,
il y aura donc une prochaine session ; mais il y a une piste ...

Désolé pour les coupures de lignes, là il commence à être un pe u tard
pour s'occuper de ça.

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, false, false) == null) {
Label1.Text = Label1.Text + "/" + ci.ToString();
}

}
}

}

Et voilà ce que contient Label1 à la fin, sur un site qui contient de ux
fichiers de ressources, un anglophone par défaut, et un Français.

./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


Il va donc falloir, peut-être, que je vérifie plutôt l'existence d' un
texte dans la culture correspondante, pour conclure au fait que la
culture est traitée pour le site ou pas.

Mais là, pour le moment, un peu être raisonnable, dans quelques heure s
le réveil sonne ...
zoltix
Le #12163471
On 21 jan, 00:32, Gloops
Gilles TOURREAU [MVP] a écrit, le 13/01/2008 11:39 :

> Bonjour,

> Je crois qu'il n'existe pas de méthode pour çà...
> Cependant ce que vous pouvez faire c'est (pas testé) :

> - Instancier un ResourceManager
> - Appelez la méthode GetRessourceSet() pour chaque culture, si celle-c i
> != null alors c'est qu'il existe des ressources pour cette culture.

> Tenez informé du résultat !

> Cordialement

Bon, voilà ce que ça donne.
Je suis allé trouver un exemple de ResourceManager dans les newsgroups,
et ça a fini par fonctionner. Toutefois, le résultat n'est pas conform e,
il y aura donc une prochaine session ; mais il y a une piste ...

Désolé pour les coupures de lignes, là il commence à être un peu tard
pour s'occuper de ça.

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.CultureT y­pes.NeutralCultures))
         {
             if (rm.GetResourceSet(ci, false, false) == null) {
                 Label1.Text = Label1.Text + "/" + ci. ToString();
             }

         }
     }

}

Et voilà ce que contient Label1 à la fin, sur un site qui contient deu x
fichiers de ressources, un anglophone par défaut, et un Français.

./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

Il va donc falloir, peut-être, que je vérifie plutôt l'existence d'u n
texte dans la culture correspondante, pour conclure au fait que la
culture est traitée pour le site ou pas.

Mais là, pour le moment, un peu être raisonnable, dans quelques heures
le réveil sonne ...



Merci car je recherche la même chose....
A+
Gloops
Le #12163451
Gilles TOURREAU [MVP] a écrit, le 13/01/2008 11:39 :
Bonjour,

Je crois qu'il n'existe pas de méthode pour çà...
Cependant ce que vous pouvez faire c'est (pas testé) :

- Instancier un ResourceManager
- Appelez la méthode GetRessourceSet() pour chaque culture, si celle- ci
!= null alors c'est qu'il existe des ressources pour cette culture.

Tenez informé du résultat !

Cordialement




Voici ma version actuelle, qui hélas ne retourne rien.

Il me reste à réviser la distinction entre un fichier de ressources
d'extension resx et un d'extension resource, tout en évitant de
confondre entre ressource globale et ressource locale. Pour le moment je
cherche à accéder à default.aspx.resx, local. Pour voir si je m'en sors
mieux je crée une nouvelle ressource, qui se place toute seule comme un e
grande dans App_GlobalResources, et qui finit par s'appeler
Resource.resx, et le code ci-dessous (avec "Resource" en premier
argument de ResourceManager) cherche un fichier Resource.Resource

Donc, une pelote de laine à remonter.


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

System.Resources.ResourceManager rm = new
System.Resources.ResourceManager("Default.aspx",
System.Reflection.Assembly.GetExecutingAssembly());

CultureInfo[] neutralCultures =
CultureInfo.GetCultures(CultureTypes.NeutralCultures);

foreach (System.Globalization.CultureInfo ci in neutralCultures)
{
String Intit;
try{

Intit = ci.ToString();
Intit = rm.GetString("Label1Resource1.Text", ci) ;

}catch(Exception ex)

{
Intit = ex.ToString();
Intit = null;
}

if (Intit != null){

Label1.Text = Label1.Text + "/" + ci.ToString( );

}



}

}

}
Gloops
Le #12163441
zoltix a écrit, le 21/01/2008 08:31 :

Merci car je recherche la même chose....




Tant mieux, si tu arrives à corriger mes âneries ça gagnera du temp s :)
Gilles TOURREAU [MVP]
Le #12163431
> if (rm.GetResourceSet(ci, false, false) == null) {



Remplacez par :

if (rm.GetResourceSet(ci, true, false) != null) {

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
Gloops
Le #12163421
Gilles TOURREAU [MVP] a écrit, le 23/01/2008 17:18 :
if (rm.GetResourceSet(ci, false, false) == null) {



Remplacez par :

if (rm.GetResourceSet(ci, true, false) != null) {

Cordialement




ça donne ça :


./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



Bien essayé, merci.

Au fait, ce changement vise à créer le fichier de ressource si il
n'existe pas, pas vrai ? Apparemment il est créé virtuellement, il ne
reste rien dans le répertoire.

L'autre jour j'ai lorgné sur ResxResourceSet, et à ce que j'ai vu cec i
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 n'ai pas eu le temps d'essayer sérieusement.

En supposant que ça marche, l'aspect capillotracté de la chose est-il
l'antichambre d'ennuis à un moment inattendu ?
Gilles TOURREAU [MVP]
Le #12163371
Bonjour,

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

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
Publicité
Poster une réponse
Anonyme