Utiliser un fichier texte comme ressource [C++] - C++ - Programmation
Marsh Posté le 22-11-2011 à 18:06:38
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 ?
Marsh Posté le 22-11-2011 à 19:06:04
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).
Marsh Posté le 22-11-2011 à 20:42:39
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. |
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+,
Marsh Posté le 23-11-2011 à 09:42:14
Merci à tous pour vos réponses
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. |
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 :
|
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 :
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. |
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 :
|
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.
Marsh Posté le 23-11-2011 à 10:48:51
Pour expliquer davantage la "solution 3" :
J'ai un fichier .h :
Code :
|
et je veux mettre tout ça dans une map<int, string>
Méthode 1 :
Code :
|
Cette méthode marche évidemment, mais c'est super sale.
J'ai donc testé un truc stupide à base de macro :
Code :
|
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 ?
Marsh Posté le 23-11-2011 à 11:50:25
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. |
A+,
Marsh Posté le 23-11-2011 à 12:11:07
gilou a écrit :
|
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...
Marsh Posté le 22-11-2011 à 17:22:46
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
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.