Je veux pouvoir modifier la langue de l'application par programme, ou au moins utiliser la langue spécifiée dans le panneau de configuration -> Options régionales et linguistiques -> Formats.
Si j'ajoute une table à cordes anglaise, faites un français et Une copie allemande de celui-ci et supprimer l'anglais, je peux basculer de manière programmée entre charger les chaînes françaises et allemandes. Si je garde la copie anglaise, les chaînes anglaises sont chargées, peu importe quoi, lorsque j'essaie de charger l'allemand ou les Français. P>
Je pense qu'il s'agit d'un bug de chargeur de ressources, et que la ressource Le chargeur ignore SetTheadLocale, s'il trouve une table de chaîne dans la même langue que la langue de l'interface utilisateur Windows (la langue des menus de l'Explorateur Windows par exemple). P>
J'ai essayé de changer de panneau de commande -> Options régionales et linguistiques -> Formats au français, mais cela n'a aucun effet. L'éditeur de ressources affiche la table à chaîne française sans la langue annexée, mais mon programme charge toujours toujours les chaînes anglaises. Copier cette modification sur le compte système n'a aucun effet non plus. P>
Voici le code que j'ai essayé avec: p> ici est une explication à moitié erronée et incomplète (dans la seconde moitié de la méthode 2). La deuxième solution de contournement proposée là-bas, l'utilisation des tables à cordes neutres par pays est inutile, car j'ai des tables de cordes portugais-au-Portugal et au Brésil portugaises. P> La première solution de contournement proposée ne fonctionne pas. Avec le code ci-dessous, je reçois une erreur 1814. P> HRSRC r = FindResource(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDS_STRING101),
RT_STRING);
DWORD e = GetLastError();
3 Réponses :
La capture ici est que si le fil thread locale est identique à celui de l'utilisateur actuellement sélectionné, le chargeur de ressources du système utilisera par défaut l'ID de langue 0 (neutre). Si la ressource souhaitée est définie comme une langue neutre, cette valeur sera renvoyée. Sinon, toutes les ressources linguistiques seront énumérées (dans l'ordre d'identification de langue) et le premier identifiant de ressource correspondant - quelle que soit sa langue - sera retournée. P> blockQuote>
Le seul moyen de contrôler les ressources consiste à utiliser des DLL de ressources distinctes pour chaque langue. P>
Quel est le lieu d'utilisateur actuellement sélectionné? Est-ce la langue des menus dans l'explorateur Windows et inconnu. La locale du fil est vérifiée avant d'avoir la chance de le modifier? Comment puis-je définir la locale par défaut avec l'éditeur de ressources?
Il est local qui a été sélectionné dans les paramètres régionaux dans le panneau de configuration.
Ce n'est pas lié à l'onglet Format. C'est une onglet avancé.
Et je ne pense pas que l'utilisateur soit heureux si vous modifiez ces paramètres sans autorisation des utilisateurs. Les DLL de ressources distinctes fonctionneraient de la meilleure façon sans déranger l'utilisateur.
Exécutez-vous Vista ou Windows 7? Si oui, alors Je viens de terminer une application WTL qui a été traduite dans 7 langues différentes et que l'utilisateur peut changer de langue sans problèmes que vous décrivez. J'utilise Plus d'info: P>
setthreadlocale code> ne fonctionne pas (même s'il renvoie true, soupir) et vous devez utiliser
setthreadilanguage code>. P>.
setthreadlocale code> sur xp et
setthreaduilanguage code> sur Vista / 7. P>
Description détaillée de la sélection des ressources localisées (y compris l'ordre de recherche de FindResource) directement à partir de MSDN: Ressources de langue multiple P>
Edit: Toutefois, de mon expérience (au moins sur Windows XP), la commande de recherche détaillée pour Findresource sur cette page ne décrit pas le comportement réel. Le comportement réel semble être: p>
Remarque: je n'ai aucune source de validation de cette liste, alors si quelqu'un peut mettre à jour ou corriger quoi que ce soit, veuillez le faire. P>
Edit: Pour comprendre ce comportement, il est important de reconnaître la différence entre les "locale" et "uilanguage" comme expliqué ici: Terminologie NLS . La sélection de la langue de la fonction FindResource repose principalement sur la langue de l'interface utilisateur qui n'est pas le paramètre «Options régionales» dans les «options régionales et linguistiques» (c'est-à-dire le paramètre «Locale», qui est identique à l'appelant SetTHeadLocale ()). p>
Autant que je puisse dire, la raison pour laquelle le paramètre local ou «SetTheadLocale ()» affecte FindResource () est dû à l'affaire d'exception décrite par @kirill v. Lyadvinsky dans l'une des réponses ici, expliquée plus en détail sur Blog de Michael Kaplan . p>
Réglage de la langue de FindResource en code proprement et déterministe n'a été rendue que possible avec la nouvelle fonction "SetTheaduilanguingage" à Vista à partir de. Chaque endroit que vous voyez que, à la place, utilise SetTheadLocale aura des hacks pour le faire fonctionner et / ou avoir des problèmes lorsque la langue d'interface utilisateur modifie (c'est-à-dire: l'installation de Windows de langue étrangère). P>
Ressources de plusieurs langues Link provient d'un livre écrit autour de 1995 ( mentionne Windows 95 et Visual C ++ 2.0). On dirait que certaines fonctionnalités / comportements ont changé depuis lors, afin que les informations contenues dans le lien doivent être prises avec un grain de sel.
Oui, le lien MLR est vieux - voir ma note à la fin de la réponse sur les versions des versions commençant par Vista et à partir de l'emploi, où vous devez toujours utiliser SetTHreadilanguageage