2009-02-20 10 views
15

Sono abbastanza nuovo per la programmazione localizzata e sto cercando di capire come impostare le impostazioni internazionali iniziali corrette per un'applicazione C++ non gestita appena lanciata (dall'interno dell'app).come impostare la locale iniziale corretta per un programma C++ su Windows?

Per quanto ne so, le nuove applicazioni iniziano con le impostazioni locali C, anziché con le impostazioni internazionali locali (inglese, tedesco, ecc.). Quindi quello che devo fare è chiamare setlocale(LC_ALL, "???"), ma non sono sicuro di come ottenere il valore corretto per il secondo argomento. Sarà qualcosa di simile a "Inglese" o "Tedesco: Germania" - in pratica qualsiasi impostazione locale è stata impostata dall'utente tramite il pannello di controllo Opzioni internazionali e della lingua. Per essere chiari, sono non alla ricerca di come formattare la stringa locale, sto cercando la stringa locale corretta per il computer su cui è in esecuzione l'app.

Suppongo che ci sia qualche API Win32 che mi fornisce questa o forse una chiave di registro che conterrebbe il valore corretto. Qualcuno sa cosa dovrei fare?

risposta

25

setlocale() è C, non C++. Ricordo vagamente di aver visto l'interferenza tra i due su VC6, ma quello era un bug. Normalmente, setlocale() influenza solo il comportamento delle funzioni C.

In C++, la localizzazione è controllata dalla classe std :: locale. Per impostazione predefinita, le operazioni sensibili alle impostazioni internazionali utilizzano le impostazioni locali globali, ottenute per impostazione predefinita, creando un oggetto locale e possono essere impostate con std :: locale :: global (const std :: locale &).

Costruire un oggetto locale con una stringa vuota (std :: locale ("")) crea una locale corrispondente all'ambiente del programma.

All'avvio del programma, la locale globale è la locale "C" o "Classica". Per impostare il locale globale per l'ambiente locale del programma (che credo sia quello che stai chiedendo), è così scrive:

std::locale::global(std::locale("")); 

Per esempio, le mie impostazioni regionali sono attualmente impostata su Francese (Canada). L'esecuzione di questo:

int main(void) 
{ 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("")); 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("C")); 
    std::cout << std::locale().name() << std::endl; 
    return 0; 
} 

stampe:

C 
French_Canada.1252 
C 
+0

Grandi, questo è esattamente quello che mi serviva. Sembra che tu possa anche passare il nome() di una determinata locale C++ a setlocale(), anche per impostare la locale C. – Charlie

Problemi correlati