2011-11-26 9 views
6

Ho bisogno di tradurre un programma in altre lingue, in realtà ho lo stesso programma in 3 lingue (inglese, spagnolo, portoghese), ma ho tradotto, ricompilato e ho 3 file eseguibili separati. E aggiungere più lingue, mantenere i collegamenti e aggiungere nuove funzioni mi sta facendo impazzire.Come rilevare la lingua di sistema in delphi per progetti multilingue?

Così ora ho deciso di mantenere un singolo file eseguibile e un file di lingua esterno, quindi aggiungere nuove lingue non ha bisogno di ricompilare, basta modificare il file della lingua con un editor di testo, e tutto è ok.

Voglio mantenere tutte le lingue in un singolo file esterno. come international.lang

[portuguese] 
greeting="Bem-vindo" 

[spanish] 
greeting="Ben venido" 

se il file international.lang non c'è, o la vostra lingua non è il file, il programma lancerà nel inglese per impostazione predefinita, senza errori. Proprio come la maggior parte dei programmi multilingua basati sulle risorse.

Quindi la domanda è, come rilevare la lingua di Windows in delphi? Qualche idea sul mio approccio? C'è un modo per sostituire programmaticamente tutte le didascalie nelle finestre di dialogo?

ps: sto usando delphi7 e non riesco a trovare alcun componente gratuito che sia buono.

+2

Hai considerato di lasciare che l'UTENTE selezioni la lingua? Forse quando installano. Utilizzare le informazioni di seguito per impostare l'impostazione predefinita, ma forse lasciare che l'utente decida al momento dell'installazione, o anche in fase di esecuzione, quale lingua desiderano? In secondo luogo, questo problema è già risolto da DxGetText. Verifica questo: http://dxgettext.po.dk/ –

+0

@WarrenP Sì, lo voglio, desidero solo selezionare la lingua per la stessa lingua del sistema per impostazione predefinita. Quindi in molti casi l'utente non dovrà toccare le impostazioni. –

risposta

9

È possibile utilizzare la funzione GetSystemDefaultLCID per ottenere l'identificatore locale e quindi utilizzare la funzione VerLanguageName per risolvere il nome associato alla lingua. oppure utilizzare la funzione GetLocaleInfo

controllare questo campione

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils; 


procedure Test_VerLanguageName; 
var 
    wLang : LangID; 
    szLang: Array [0..254] of Char; 
begin 
    wLang := GetSystemDefaultLCID; 
    VerLanguageName(wLang, szLang, SizeOf(szLang)); 
    Writeln(szLang); 
end; 

procedure Test_GetLocaleInfo; 
var 
    Buffer : PChar; 
    Size : integer; 
begin 
    Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, nil, 0); 
    GetMem(Buffer, Size); 
    try 
    GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, Buffer, Size); 
    Writeln(Buffer); 
    finally 
    FreeMem(Buffer); 
    end; 
end; 

begin 
    try 
    Test_VerLanguageName; 
    Test_GetLocaleInfo; 

    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

Nota: A partire da Windows Vista esiste nuove funzioni per ottenere le stesse informazioni sulle impostazioni internazionali, controllare queste funzioni GetLocaleInfoEx, GetUserDefaultLocaleName e GetSystemDefaultLocaleName

+0

funziona bene, ma sai come ottenere solo il nome della lingua senza la posizione? Sto ottenendo questo valore 'Inglese (Stati Uniti)' Voglio solo 'Inglese' senza' (Stati Uniti) '. In caso contrario, è possibile rimuovere le parentesi con espressioni regolari? –

+0

Quale funzione stai usando 'VerLanguageName' o' GetLocaleInfo'? – RRUZ

+1

'VerLanguageName = English (Stati Uniti)' e 'GetLocaleInfo = English' su windows7 e windows xp (funziona bene anche). Penso che dovrei usare solo GetLocaleInfo –

0

ho il lo stesso problema anche se devo affrontare solo due lingue: inglese (predefinito) e polacco. Ho provato tutte le soluzioni sopra elencate e nessuna di queste funzionava. Stavo modificando le impostazioni del sistema, riavviando ecc. E ricevendo sempre la lingua inglese. Quando si passa a polacco tutto è stato visualizzato in polacco, tutte le località polacche sono state impostate ma la mia applicazione stava ricevendo l'inglese come lingua del sistema operativo. Dopo molti tentativi mi sono imbattuto in una soluzione alternativa abbastanza facile e affidabile (non la chiamo soluzione) che è buona se devi gestire un piccolo numero di lingue. Quindi il trucco è verificare in quale lingua viene restituito l'elenco delle lingue da TLanguages.

function GetLang: Integer; //lcid 
const 
    lcidEnglish = $9; 
    lcidPolish = $415; 
var Idx: Integer; 
begin 
    Result := Languages.IndexOf(lcidPolish); 

    if (Result > 0) and 
    (Languages.Name[Result].StartsWith('Polski', True)) //'Polski'is the Polish name of the language 
    then Result := lcidPolish 
    else Result := lcidEnglish; 
end; 

Si può fare lo stesso per le vostre tre lingue. Spero che aiuti.