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.

10 réponses

1 2
Avatar
Gilles TOURREAU [MVP]
Le Sun, 06 Jan 2008 20:35:11 +0100, Gloops a écrit:

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
Avatar
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- 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.
Avatar
Gloops
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 :(
Avatar
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- 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 ...
Avatar
zoltix
On 21 jan, 00:32, Gloops wrote:
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+
Avatar
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- 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( );

}



}

}

}
Avatar
Gloops
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 :)
Avatar
Gilles TOURREAU [MVP]
> 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
Avatar
Gloops
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 ?
Avatar
Gilles TOURREAU [MVP]
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
1 2