2009-04-15 6 views
1

Je suis novice en MFC et j'ai besoin de créer une application multilingue qui devrait être capable de changer la langue lors de l'exécution. AFAIK la manière courante pour l'internationalisation avec MFC est de créer des DLL de ressources seulement. Mais il semble n'y avoir aucun moyen simple (cela signifie, charger la DLL, appeler une fonction, et MFC met à jour toutes les choses automatiquement ou quelque chose comme ça) pour changer les DLL de ressources à l'exécution, non?Chargement de la légende des contrôles à partir de la DLL de ressources

Donc je vais devoir mettre à jour toutes les commandes et ainsi de suite manuellement. J'ai déjà réussi à charger des chaînes à partir de la table de chaînes d'une DLL mais comme les légendes de contrôles comme les boutons sont stockés dans la boîte de dialogue correspondante (si je fais confiance à mon pirate de ressources :) je pensais qu'il devait y avoir un moyen de les charger stocker une chaîne supplémentaire dans la table de chaînes manuellement.

Ou y a-t-il un autre moyen que je ne connais pas?

Si cela fait une différence ... Je dois utiliser MS intégré visual C++ 4

Répondre

1

Je travaille sur un grand projet MFC localisée. Voici notre stratégie:

  1. Un dictionnaire de clé -> chaîne localisée, spécifique à chaque langue. Il y a plusieurs façons de l'implémenter, plus tard.

  2. ID de contrôle ou des sous-titres dans la ressource de dialogue sont mis à la clé utilisée pour rechercher la traduction

  3. Créer une base CDialog, CFormView, etc et à l'appel init ::EnumChildWindows. Dans le rappel, recherchez la traduction et remplacez la légende du contrôle par la traduction.

Pour votre dictionnaire, vous pouvez procéder de plusieurs façons.

  • Si vous voulez compter sur la tables intégrées de sélection des ressources et chaîne localisée, vous devez faire correspondre en quelque sorte le contrôle à l'ID de chaîne. Vous pouvez vous assurer que l'ID de contrôle correspond à l'ID de chaîne, ou vous pouvez encoder l'ID ASCII dans la légende, puis utiliser atoi pour analyser la valeur int.

  • Vous pouvez renoncer à l'accord de table de chaînes localisées intégré et gérer votre propre dictionnaire chaîne -> chaîne pour chaque langue. Cela vous permet de définir la légende de la chaîne non localisée dans la ressource, ce qui facilite la mise en page (même si vous aurez toujours besoin de tester dans toutes les langues). Vous devrez effectuer votre propre "injection de dépendance" pour vous assurer de charger dans le bon dictionnaire. Vous voulez être en mesure de publier des langues mises à jour/supplémentaires sans reconstruire les binaires principaux.

1

Si vous ne voulez pas nécessiter un redémarrage de l'application (par loin la solution la plus simple, et celui que vous devez utiliser l'OMI), vous pouvez utiliser Windows dll ressources et de recréer les principaux lorsque le l'utilisateur change de langue. De cette façon, MFC va recréer les menus, etc. dans la nouvelle langue. Les nouvelles boîtes de dialogue seront déjà affichées dans la nouvelle langue, à partir du moment où vous avez activé la gestion des ressources. Je ne suis pas sûr comment cela se rapporte au monde embarqué, mes expériences sont à partir du MFC de bureau.

Questions connexes