Desidero essere in grado di modificare la lingua dell'applicazione in modo programmatico o almeno utilizzare la lingua specificata in Pannello di controllo -> Opzioni internazionali e della lingua -> Formati.LoadString funziona solo se non si dispone di una tabella di stringhe inglese
Se aggiungo una tabella di stringhe inglese, ne creo una copia francese e una tedesca, ed elimina quella inglese, posso passare in modo programmatico tra il caricamento delle stringhe francese e quella tedesca. Se tengo la copia inglese, le stringhe inglesi vengono caricate, non importa cosa, quando provo a caricare quelle tedesche o francesi.
Penso che questo sia un bug del caricatore di risorse e che il caricatore di risorse ignori SetThreadLocale, se trova una tabella di stringhe nella stessa lingua della lingua dell'interfaccia utente di Windows (ad esempio, la lingua dei menu di Windows Explorer).
Ho provato a cambiare Pannello di controllo -> Opzioni internazionali e della lingua -> Formati al francese, ma ciò non ha alcun effetto. L'editor delle risorse mostra la tabella delle stringhe francese senza la lingua aggiunta, ma il mio programma carica sempre le stringhe inglesi. La copia di questa modifica sull'account di sistema non ha alcun effetto.
Ecco il codice che ho provato con:
#include "stdafx.h"
#include <iostream>
#include "windows.h" // this should go to stdafx.h
#include "resource.h" // this should not go to stdafx.h
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 1036 = french, 1031 = german
SetThreadLocale(MAKELCID(1036, SORT_DEFAULT));
const int maxSize = 100;
wchar_t c[maxSize];
LoadString(GetModuleHandle(NULL), IDS_STRING101, c, maxSize);
std::cout << c;
return 0;
}
Here è un mezzo mal spiegazione incompleta (nella seconda metà del metodo 2). La seconda soluzione proposta qui, utilizzando solo tabelle di stringa neutrali in stile coutry è inutile, perché ho separato le tabelle di stringhe portoghese-portoghese e portoghese-brasiliano.
La prima soluzione proposta qui non funziona. Con il codice qui sotto, ottengo l'errore 1814.
HRSRC r = FindResource(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDS_STRING101),
RT_STRING);
DWORD e = GetLastError();
Quindi, cosa dovrei fare? Qual è la spiegazione di questo strano "bug"?
DOPO EDIT:
Dopo qualche test ho scoperto che:
- GetThreadLocale() restituisce ciò che è insieme nel Pannello di controllo -> Opzioni internazionali e della lingua -> Formati.
- Il bug del caricatore di risorse è essenzialmente che se il mio programma ha anche risorse in inglese americano, tali risorse verranno caricate, indipendentemente da ciò che è impostato nei formati. Se non dispone di risorse in inglese americano, verrà utilizzata la lingua impostata in Formats.
- Se si dispone di una tabella di stringhe francese (neutro) e tedesco (neutro) e si impostano i formati in francese (Francia), vengono caricate le stringhe tedesche. Se aggiungo una tabella di stringhe in inglese (neutro), vengono caricate le stringhe in inglese. Quindi, il fallback della cultura neutrale non funziona per ciò che è impostato su Formats.
- Se aggiungo una tabella di stringhe neutre, quella verrà utilizzata anche se si dispone di un'altra tabella di stringhe inglese (neutro) o inglese (Stati Uniti).
Qual è il locale dell'utente attualmente selezionato? È la lingua dei menu in Esplora risorse di Windows e non è modificabile. Le impostazioni locali del thread vengono controllate prima che abbia la possibilità di modificarlo? Come posso impostare la locale predefinita con l'editor di risorse? –
È la locale selezionata in Impostazioni internazionali nel Pannello di controllo. –
Questo non è correlato alla scheda Formato. È la scheda Avanzate. –