nraynaud a écrit :
j'en profite pour lancer le débat, c'est pas un peu chiant la localisation par des fichiers externes ? c'est-à-dire que dans le code on ne retrouve plus les chaines litérales, ça doit le rendre assez difficile à lire (du moins c'est ce que j'ai trouvé en regardant lucane).
est-ce qu'une notation du type "identifiant de chaine - chaine libre" (ex : "networkError - There were a network error" ) ne serait pas plus pratique ? ça existe déjà peut-être ?
|
bah, sous .NET c'est comme ça que ça marche : tu créé un ResourceManager basé sur un fichier, lequel fichier aura le nom suivant :
nom.culture.resx, par exemple "strings.fr-FR.resx". les fichiers .resx dans ce cas sont des fichiers .resource contenant un identifiant de chaine, et la chaine traduite, le tout compilé avec ResGen.
tu créé donc un ResourceManager basé sur le fichier, mais en n'indiquant pas la culture :
Code :
- rm = ResourceManager.CreateFileBasedResourceManager("strings", path, null);
|
puis tu créé une CultureInfo, pour chaque traduction du fichier "strings.resx" :
Code :
- private CultureInfo frenchCulture = new CultureInfo("fr-FR" );
- private CultureInfo englishCulture = new CultureInfo("en-US" );
|
ceci suppose donc que tu possèdes 2 fichiers : strings.fr-FR.resx, et strings.en-US.resx.
et pour finir, tu changes de culture au besoin (par exemple, si l'utilisateur clique sur le menu permettant d'avoir toutes les chaines du soft en Anglais :
Code :
- Thread.CurrentThread.CurrentUICulture = englishCulture; // on utilise en-US
- cmdOK.Text = rm.GetString("cmdOK_Text" );
|
de cette façon, comme tu indiques que tu utiliser le CultureInfo en-US, le label de ton bouton sera récupéré à partir de l'identifiant "cmdOK_Text" présent dans ton fichier strings.en-US.resx.
ceci suppose évidemment que tous les identifiants soient identiques d'un fichier .resx à l'autre.
je vois donc pas ce qui te dérange avec les fichiers de localisation externes ?
tout comme je ne comprends donc pas pourquoi _darkalt3_ s'emmerde avec une hashtable et tout son bouzin, alors que tout se fait automatiquement de cette manière (cf mon plugin en signature, c'est comme ça que je l'ai localisé)
---------------
J'ai un string dans l'array (Paris Hilton)