2011-11-26 14 views
6

Potrzebuję przetłumaczyć program w innych językach, faktycznie mam ten sam program w 3 językach (angielski, hiszpański, portugalski), ale przetłumaczyłem, zrekompilowałem i mam 3 oddzielne pliki wykonywalne. Dodaj więcej języków i zachowaj linki, a dodawanie nowych funkcji doprowadza mnie do szału.Jak wykrywać język systemu w delphi dla projektu wielojęzycznego?

Tak więc zdecydowałem się zachować jeden plik wykonywalny i zewnętrzny plik językowy, więc dodanie nowych języków nie wymaga rekompilacji, wystarczy edycja pliku językowego za pomocą edytora tekstu i wszystko jest w porządku.

Chcę zachować wszystkie języki w jednym pliku zewnętrznym. jak international.lang

[portuguese] 
greeting="Bem-vindo" 

[spanish] 
greeting="Ben venido" 

jeśli plik international.lang nie ma, lub język nie jest plik, program zostanie uruchomiony w języku angielskim domyślnie, bez żadnych błędów. Podobnie jak większość programów wielojęzykowych opartych na zasobach.

Pytanie brzmi: jak wykryć język Windows w delphi? Jakieś przemyślenia na temat mojego podejścia? Czy można w jakiś sposób zastąpić wszystkie napisy w oknach dialogowych?

ps: Używam delphi7 i nie mogę znaleźć żadnego bezpłatnego składnika, który jest dobry.

+2

Czy zastanawiałeś się tylko, czy pozwolić użytkownikowi wybrać język? Być może po zainstalowaniu. Użyj poniższych informacji, aby ustawić domyślne, ale może pozwolić użytkownikowi decydować o czasie instalacji, a nawet w czasie wykonywania, jakiego języka chcą? Po drugie, problem ten został już rozwiązany przez DxGetText. Sprawdź to: http://dxgettext.po.dk/ –

+0

@WarrenP Tak, chcę tylko wstępnie wybrać język dla tego samego, co język systemowy jako domyślny. Dlatego w wielu przypadkach użytkownik nie musi dotykać ustawień. –

Odpowiedz

9

Możesz użyć funkcji GetSystemDefaultLCID, aby uzyskać identyfikator ustawień narodowych, a następnie użyć funkcji VerLanguageName, aby rozwiązać nazwę skojarzoną z językiem. lub użyć funkcji GetLocaleInfo

kontrola ta próbka

{$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. 

Uwaga: Począwszy od Windows Vista istnieje nowe funkcje, aby uzyskać tę samą informację lokalizacji, sprawdzić te funkcje GetLocaleInfoEx, GetUserDefaultLocaleName i GetSystemDefaultLocaleName

+0

działa dobrze, ale wiesz, jak uzyskać tylko nazwę języka bez lokalizacji? Dostaję tutaj tę wartość 'English (United States)' Chcę po prostu 'English' bez' (United States) '. Jeśli nie, czy można bezpiecznie usunąć nawiasy za pomocą wyrażenia regularnego? –

+0

Z której funkcji korzystasz z 'VerLanguageName' lub' GetLocaleInfo'? – RRUZ

+1

'VerLanguageName = angielski (Stany Zjednoczone)' i 'GetLocaleInfo = angielski' na obu windows7 i Windows XP (działa również dobrze). Myślę, że powinienem używać tylko GetLocaleInfo –

0

mam ten sam problem, chociaż mam do czynienia tylko z dwoma językami: angielskim (domyślnie) i polskim. Próbowałem wszystkich wymienionych powyżej rozwiązań i żadne z nich nie działało. Zmieniałem ustawienia systemu, restartowałem itd. I zawsze otrzymywałem język angielski. Po przełączeniu na polski wszystko było wyświetlane w języku polskim, wszystkie polskie ustawienia regionalne zostały ustawione, ale moja aplikacja otrzymywała język angielski jako język systemu operacyjnego. Po wielu próbach natknąłem się na dość łatwe i niezawodne obejście (nie nazywam tego rozwiązaniem), które jest dobre, jeśli masz do czynienia z niewielką liczbą języków. Sztuczka polega na sprawdzeniu, w jakim języku lista języków jest zwracana przez języki.

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; 

Możesz zrobić to samo dla swoich trzech języków. Mam nadzieję, że to pomaga.

Powiązane problemy