2009-10-13 24 views
5

c'è qualche modo nelle API Win32 per convertire un codice lingua di tre lettere, come restituito da GetLocaleInfo() con LOCALE_SABBREVLANGNAME specificato, ad un corrispondente LANGID o LCID? Cioè, andando in "reverse" a ciò che fa normalmente GetLocaleInfo()?Convertire tre lettere del codice lingua identificativo della lingua (LANGID)

Quello che sto cercando di fare è di analizzare che tipo di linguaggio un DLL di risorse sta usando, e finora, senza toccare nulla la DLL, che va sotto il nome dll con un formato nameLNG.dll, dove LNG è un tre codice della lingua, sembra essere il metodo più semplice, supponendo che tale funzione esista.

Se ciò non è facile, suppongo che Plan B debba fornire alle nostre DLL di lingua una risorsa di informazioni sulla versione, specificare le loro rispettive culture e, più avanti nell'applicazione, leggere quali culture usano.

risposta

2

Sfortunatamente, non esiste un'API Win32 diretta che fornisca un LANGID dato un'abbreviazione di 3 lettere.

Sembra che CLanguageSupport sia il tuo amico today :-) Implementa già il piano B per cercare il LANGID in base al contenuto della risorsa di informazioni sulla versione.

Il pezzo di codice che stai cercando è la funzione int

LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename) 

Naturalmente, lo svantaggio è che si può avere una mancata corrispondenza tra le informazioni sulla versione e il nome della DLL. Ma lo avresti catturato molto velocemente durante i test. E se lasci che uno strumento come appTranslator crei le DLL per te, sei sicuro di essere al sicuro.

+0

Sì, penso che finirò per usare questa classe allora, dal momento che apparentemente hai già fatto un passo indietro non solo uno, ma due dei problemi che stiamo affrontando ora. Potremmo anche ri-implementare il sottomenu in lingua che ho portato via pochi giorni fa, pensando che il nostro passaggio al meccanismo MFC sarebbe stato definitivo. Oh beh ... – Jonas

1

È possibile enumerare le impostazioni locali installate utilizzando EnumSystemLocales() e creare autonomamente la mappa. Lo faccio durante l'inizializzazione dell'applicazione in un servizio che ho scritto qualche tempo fa e finora ha funzionato bene.

Si consiglia di utilizzare Piano B in questo caso. Solitamente evito le codifiche nel nome del file. Se per nessun altro motivo, la variante a 3 caratteri ISO-639 non è perfetta a meno che non si specifichi con precisione quale variante si utilizza - ISO-639-2/B, ISO-639-2/T o ISO-639-3.

Se è necessario fornire varianti specifiche della locale, è necessario dare un'occhiata a RFC3066. Fondamentalmente, è necessario specificare la lingua e il codice del paese e, in alcuni casi, anche il codice regionale. In ogni caso, il LCID racchiude tutta questa bontà.

L'unica cosa di cui non sono completamente certo è se il langID nelle informazioni sulle risorse sia un LCID completo oppure no. I codici elencati nel riferimento VERSIONINFO sono LCID, quindi proverei a utilizzare un LCID nell'intestazione VERSIONINFO. In caso contrario, è sempre possibile includere le informazioni come una stringa nel blocco di stringhe.

+1

EnumSystemLocales mi fornisce solo un elenco di acronimi di tre lettere, giusto? Non sono sicuro di come si costruisce una mappa utilizzando solo queste informazioni e mancando di LCID o LANGID da cui tradurre? Questa soluzione sarebbe perfetta se la funzione di callback per EnumSystemLocales avesse restituito una * coppia * di stringhe LCID e "ISO". – Jonas

+0

L'argomento di 'EnumLocalesProc' è in realtà il LCID formattato come numero esadecimale in una stringa. La documentazione non è chiara su questo - _ "Puntatore a un buffer contenente una stringa identificatore di locale con terminazione null" _. Quello che non riescono a menzionare è che devi chiamare qualcosa come '_tcstoul (lpLocaleString, NULL, 16)' su di esso per ottenere l'identificatore di locale in una forma utilizzabile. Una volta ottenuto l'LCID, puoi ottenere ciò che ti serve da 'GetLocaleInfo()' usando 'LOCALE_SISO639LANGNAME' e' LOCALE_SISO3166CTRYNAME'. –

0

È possibile ottenere l'LangID chiamando GetLocaleInfo() con LOCAL_RETURN_NUMBER|LOCALE_ILANGUAGE per la LCType parametro , proprio come avete passato LOCALE_SABBREVLANGNAME ottenere il tre lettere del codice ISO. Passando lo stesso lcid a questa funzione, è possibile memorizzare il LangID corrispondente con il codice ISO.

Nota che MSDN dice LOCALE_ILANGUAGE non deve essere utilizzato a favore LOCALE_SLANG su Vista e sopra, ma credo che il commento non si applica per l'utilizzo di LOCALE_ILANGUAGE con LOCALE_RETURN_NUMBER.

Man mano che il progetto si evolve, è possibile generare diversi file localizzati per ciascuna lingua. Per questo motivo, suggerirei di archiviare i file localizzati in sottodirectory denominate in base alla lingua. Microsoft ha utilizzato le directory che prendono il nome dal LangID, ad esempio "1033" come directory delle risorse in inglese. Penso che sarebbe più facile usare il codice di tre lettere, come "ENU \ name.dll". In ogni caso, le sottodirectory rappresentano una soluzione semplice e, si spera, non complicheranno il processo di compilazione tanto quanto la modifica del nome del file di destinazione.

+0

Io sfortunatamente non ho accesso alla LCID, ma voglio un LANGID dall'acronimo di codice a tre lettere della lingua (il codice Faux-ISO). – Jonas

+0

FWIW, MS vuole che ci spostiamo da LOCALE_ILANGUAGE perché vogliono passare a "lang ids" solo per stringhe, a un id per la. Cerchiamo di convincerci che LANGID * potrebbe * morire un giorno, almeno per le nuove lingue supportate in Win8 + –

Problemi correlati