Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1570 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Utiliser un fichier texte comme ressource

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Utiliser un fichier texte comme ressource

n°2112813
Mozz_
Posté le 22-11-2011 à 17:22:46  profilanswer
 

Bonjour,
 
J'essaye de traduire une application en plusieurs langues, et j'aimerais le faire de la manière la plus propre et transparente possible pour un utilisateur.
 
Solution 1 : avoir des fichiers .h dans le code :  un fichier contenant tous les messages en français, et un fichier contenant tous les messages en anglais. Avec un "include", on peut inclure l'un ou l'autre selon la langue choisie.
Problème : ça ne permet pas de changer la langue pendant que le programme s'exécute puisque la langue est choisie à la compilation.
 
Solution 2 : avoir des fichiers .txt à part de l'exécutable : un fichier contenant tous les messages en français, et un fichier contenant tous les messages en anglais, les charger dans un tableau (map) au début de l'exécution et piocher dans l'un ou l'autre selon la langue choisie.
Problème : ça oblige à avoir des fichiers texte qui se baladent en dehors de l'exe. Ce n'est pas super propre.
 
 
Solution idéale : une solution qui combine les avantages des solutions 1 et 2. J'aimerais en gros que mes fichiers texte contenant les messages en français et anglais soient inclus dans l'exe (donc cachés) et que l'exe puisse aller les lire pour créer des tableaux (ou map) et piocher dedans selon la langue choisie.
 
J'ai vu que c'était techniquement possible en C#, mais je ne trouve pas d'exemple utilisable en C++. Pour info, j'utilise Visual 2010  [:moonzoid:5]  
Dans les propriétés du projet, et dans la section "Éditeur de liens", il y a une case "Incorporation du fichier de ressources managé" et apparemment c'est une des façons de faire ce que je veux, mais comme je disais, je ne trouve pas d'exemples concrets sur l'interweb.
 
Le désespoir commence à m'envahir. Y aurait-il de bonnes âmes susceptibles de m'aider ? Merci d'avance.

mood
Publicité
Posté le 22-11-2011 à 17:22:46  profilanswer
 

n°2112816
Profil sup​primé
Posté le 22-11-2011 à 18:06:38  answer
 

Bonjour,
Quelque chose t'empêche de compiler avec le ou les .h contenant toutes tes langue et de regarder à chaque affichage une variable lang ?

n°2112828
Un Program​meur
Posté le 22-11-2011 à 19:06:04  profilanswer
 

Le plus portable: tu ecris un petit preprocesseur qui initialise une variable globale avec le contenu du fichier.
 
Sinon, il y a des outils qui sont capables de faire ca directement pour certains type de fichiers objet (objcopy par exemple, voir l'option -B).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2112835
gilou
Modérateur
Modzilla
Posté le 22-11-2011 à 20:42:39  profilanswer
 

Citation :

Solution 2 : avoir des fichiers .txt à part de l'exécutable : un fichier contenant tous les messages en français, et un fichier contenant tous les messages en anglais, les charger dans un tableau (map) au début de l'exécution et piocher dans l'un ou l'autre selon la langue choisie.  
Problème : ça oblige à avoir des fichiers texte qui se baladent en dehors de l'exe. Ce n'est pas super propre.

Avantage, si un client de Lituanie ou du Boukistan achète ton produit, il peut localiser lui même ton soft pour ses besoins, c'est particulièrement pratique.
Tu peux très bien avoir une table de chaines câblée en dur dans l'exe, et des ressources externes qui prennent le pas si elles sont présentes.
A+,

Message cité 1 fois
Message édité par gilou le 22-11-2011 à 20:45:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2112884
Mozz_
Posté le 23-11-2011 à 09:42:14  profilanswer
 

Merci à tous pour vos réponses  :jap:  
 
 
Je ne vois pas bien comment ça pourrait marcher. Actuellement, mes deux fichiers .h contiennent simplement une liste de "#define MSG00001 blabla" jusqu'à "#define MSG00150 blabla" et je dois choisir à la compilation lequel inclure dans mon code.
Mais peut-être que ce que tu veux dire se rapproche de ce que propose "Un Programmeur".
 

Un Programmeur a écrit :

Le plus portable: tu ecris un petit preprocesseur qui initialise une variable globale avec le contenu du fichier.
 
Sinon, il y a des outils qui sont capables de faire ca directement pour certains type de fichiers objet (objcopy par exemple, voir l'option -B).


Oui, j'y ai pensé (pour la variable globale), mais d'un point de vue propreté du code, je trouve ça bof.
Si je comprends bien, j'aurais un fichier dans le code contenant des instructions du type :

Code :
  1. map<int, string> mapFr;
  2. mapFr[1] = "blabla1_fr";
  3. mapFr[2] = "blabla2_fr";
  4. ...
  5. mapFr[150] = "blabla150_fr";


 
et l'équivalent pour l'anglais dans un autre fichier.
 
Et ensuite, dans le code, j'irais chercher les chaînes de caractères dans mapFr ou mapEn selon la langue choisie.
 
J'envisageais de faire ça, mais vraiment en dernier recours. Ce qui me gêne, c'est qu'un développeur qui veut ajouter un nouveau message dans le code doit l'ajouter "manuellement" (en ajoutant une ligne mapFr[151] = "blabla151_fr" ). Je trouve ça un peu plus élégant d'ajouter une ligne #define MSG00150 "blabla150" dans un .h.
Mais bon, si c'est le seul moyen...
 

gilou a écrit :

Citation :

Solution 2 : avoir des fichiers .txt à part de l'exécutable : un fichier contenant tous les messages en français, et un fichier contenant tous les messages en anglais, les charger dans un tableau (map) au début de l'exécution et piocher dans l'un ou l'autre selon la langue choisie.  
Problème : ça oblige à avoir des fichiers texte qui se baladent en dehors de l'exe. Ce n'est pas super propre.

Avantage, si un client de Lituanie ou du Boukistan achète ton produit, il peut localiser lui même ton soft pour ses besoins, c'est particulièrement pratique.
Tu peux très bien avoir une table de chaines câblée en dur dans l'exe, et des ressources externes qui prennent le pas si elles sont présentes.
A+,


Tout à fait (pour la Lituanie).
Cela dit, il y a un autre inconvénient pour moi : plusieurs exécutables vont utiliser ce système et piocher dans le même fichier de messages. Donc si jamais (et ça arrive) je dois livrer une nouvelle version d'un seul exécutable, il se peut que ce nouvel exe utilise une version plus à jour de mes fichiers de langue .txt.
Du coup, je suis obligé de livrer également les nouvelles versions des fichiers .txt. C'est un peu pénible mais gérable.
Et surtout : les différentes versions des fichiers .txt ne seront pas forcément compatibles entre elles. Si j'enlève ou je rajoute un "%d" dans un message, tout d'un coup un ancien exécutable va planter avec la nouvelle version des fichier .txt.
 
En plus, je n'aime pas trop l'idée qu'un utilisateur puisse aller voir tous les messages du programme ^^'
 
 
 
Je pensais aussi à une autre solution mais c'est tordu et je ne sais pas si c'est possible techniquement.
 
En gros, dans un fichier .h, j'aurais une suite de ligne :

Code :
  1. #define MSG00001 = "blabla1_fr";
  2. #define MSG00002 = "blablabla2_fr";
  3. ...
  4. #define MSG00150 = "blabl150_fr";


 
Est-ce que ce serait possible de faire une boucle sur ces define pour remplir une map dans mon code ? Si c'est possible, alors ça me permettra de remplir une "mapFr" dont je parlais plus haut, et aussi de la même façon une "mapEn", et ce serait (en tout cas de mon point de vue) assez propre avec des fichier de define bien séparés du reste du code.


Message édité par Mozz_ le 23-11-2011 à 10:08:51
n°2112912
Mozz_
Posté le 23-11-2011 à 10:48:51  profilanswer
 

Pour expliquer davantage la "solution 3" :
 
J'ai un fichier .h :

Code :
  1. #define MSG00001 = "blabla1_fr";
  2. #define MSG00002 = "blablabla2_fr";
  3. ...
  4. #define MSG00009 = "blabl9_fr";


et je veux mettre tout ça dans une map<int, string>
 
Méthode 1 :

Code :
  1. map<int, string> mapFr;
  2. #ifdef MSG00001
  3.    mapFr[1] = MSG00001
  4. #endif
  5. #ifdef MSG00002
  6.    mapFr[2] = MSG00002
  7. #endif
  8. ...
  9. #ifdef MSG00009
  10.    mapFr[9] = MSG00009
  11. #endif


Cette méthode marche évidemment, mais c'est super sale.
 
 
J'ai donc testé un truc stupide à base de macro :

Code :
  1. #define MSG_K(n) MSG0000##n
  2. map<int, string> mapFr;
  3. for(int i = 1; i < 10; ++i)
  4. {
  5. #ifdef MSG_K(i)
  6. mapFr[i] = MSG_K(i);
  7. #endif
  8. }


Mais évidemment, ça ne marche pas, ce serait trop beau...
Pourtant, je n'essaye pas de gruger le compilateur, j'essaye juste de compacter l'écriture d'une série de #ifdef. Pourquoi le compilateur ne laisse pas travailler les honnêtes gens ?


Message édité par Mozz_ le 23-11-2011 à 11:09:19
n°2112928
gilou
Modérateur
Modzilla
Posté le 23-11-2011 à 11:50:25  profilanswer
 

Citation :

Cela dit, il y a un autre inconvénient pour moi : plusieurs exécutables vont utiliser ce système et piocher dans le même fichier de messages.

http://www.vegansoapbox.com/wordpress/wp-content/uploads/2009/02/shoot_self_in_foot.jpg
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2112931
Mozz_
Posté le 23-11-2011 à 12:11:07  profilanswer
 

gilou a écrit :

Citation :

Cela dit, il y a un autre inconvénient pour moi : plusieurs exécutables vont utiliser ce système et piocher dans le même fichier de messages.

http://www.vegansoapbox.com/wordpr [...] n_foot.jpg
A+,


C'est la vie, c'est comme ça, on n'y peut rien.
 
Plusieurs exécutables utilisent du code commun, dont des messages d'information, d'erreur, etc...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Utiliser un fichier texte comme ressource

 

Sujets relatifs
Un petit effet "wipeout" de texte ... qui bug sous ffox[C#] Windows+C#+accès à l'AD et GPO
Filtrage fichier XML via Dom[C] Lecteur port série windows.h (readFile()) + SDL
[RESOLU] Incrémentation texte[C#] savoir si un processus est en train de réfléchir, possible ?
insérer le n° de ligne lors de l'import d'un fichierFonction en language C
L'opération demandée n'a pu s'accomplir sur un fichier[Divers / Ada ] Utiliser un bibliothèque partagé (inpout32.ddl)
Plus de sujets relatifs à : [C++] Utiliser un fichier texte comme ressource


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR