2011-11-26 36 views
6

Tôi cần dịch một chương trình bằng ngôn ngữ khác, thật ra tôi có cùng một chương trình bằng 3 thứ tiếng (tiếng anh, tiếng tây ban nha, bồ đào nha), nhưng tôi dịch, biên dịch lại, và tôi có 3 tập thi hành riêng biệt. Và thêm nhiều ngôn ngữ, và giữ liên kết, và thêm các chức năng mới đang khiến tôi phát điên. Vì vậy, bây giờ tôi đã quyết định giữ một tệp thực thi duy nhất và một tệp ngôn ngữ bên ngoài, vì vậy thêm ngôn ngữ mới không cần biên dịch lại, chỉ cần chỉnh sửa tệp ngôn ngữ bằng trình chỉnh sửa văn bản và mọi thứ đều ổn.Làm thế nào để phát hiện ngôn ngữ hệ thống trong delphi cho dự án đa ngôn ngữ?

Tôi muốn giữ tất cả ngôn ngữ trong một tệp bên ngoài. như international.lang

[portuguese] 
greeting="Bem-vindo" 

[spanish] 
greeting="Ben venido" 

nếu file international.lang là không có, hoặc ngôn ngữ của bạn không phải là trên các tập tin, chương trình sẽ khởi động bằng tiếng Anh theo mặc định, không có lỗi. Giống như hầu hết các chương trình đa ngôn ngữ dựa trên tài nguyên.

Câu hỏi là, cách phát hiện ngôn ngữ Windows trong delphi? Bất kỳ suy nghĩ nào về cách tiếp cận của tôi? Có cách nào để thay thế tất cả chú thích trên hộp thoại một cách có lập trình không?

ps: Tôi đang sử dụng delphi7 và tôi không thể tìm thấy bất kỳ thành phần nào miễn phí tốt.

+2

Bạn đã cân nhắc việc cho phép USER chọn ngôn ngữ? Có lẽ khi họ cài đặt. Sử dụng thông tin bên dưới để đặt mặc định, nhưng có thể cho phép người dùng quyết định thời gian cài đặt hoặc thậm chí khi chạy, họ muốn ngôn ngữ nào? Thứ hai, vấn đề này đã được giải quyết bởi DxGetText. Kiểm tra điều này: http://dxgettext.po.dk/ –

+0

@WarrenP Có, tôi chỉ muốn chọn trước ngôn ngữ cho ngôn ngữ hệ thống như mặc định. Vì vậy, trong nhiều trường hợp người dùng không cần phải chạm vào cài đặt. –

Trả lời

9

Bạn có thể sử dụng chức năng GetSystemDefaultLCID để lấy mã định danh miền địa phương và sau đó sử dụng chức năng VerLanguageName để giải quyết tên liên quan đến ngôn ngữ. hoặc sử dụng các GetLocaleInfo chức năng

Kiểm tra mẫu này

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

Lưu ý: Bắt đầu với Windows Vista tồn tại chức năng mới để có được thông tin về vị cùng, kiểm tra các chức năng này GetLocaleInfoEx, GetUserDefaultLocaleNameGetSystemDefaultLocaleName

+0

hoạt động tốt, nhưng bạn biết cách chỉ lấy tên ngôn ngữ mà không có vị trí? Tôi nhận được ở đây giá trị này 'tiếng Anh (Hoa Kỳ)' Tôi muốn chỉ 'tiếng Anh' mà không có' (Hoa Kỳ) '. Nếu không, có an toàn để loại bỏ các dấu ngoặc đơn bằng cụm từ thông dụng không? –

+0

Chức năng nào bạn đang sử dụng 'VerLanguageName' hoặc' GetLocaleInfo'? – RRUZ

+1

'VerLanguageName = Tiếng Anh (Hoa Kỳ)' và 'GetLocaleInfo = English' trên cả windows7 và windows xp (hoạt động tốt). Tôi nghĩ tôi chỉ nên sử dụng GetLocaleInfo –

0

Tôi có cùng một vấn đề mặc dù tôi phải đối phó với chỉ có hai ngôn ngữ: tiếng Anh (mặc định) và Ba Lan. Tôi đã thử tất cả các giải pháp được liệt kê ở trên và không có giải pháp nào trong số đó hoạt động. Tôi đã thay đổi cài đặt hệ thống, khởi động lại vv và luôn nhận được ngôn ngữ tiếng Anh. Khi chuyển sang mọi thứ Ba Lan được hiển thị bằng tiếng Ba Lan, tất cả các ngôn ngữ Ba Lan đã được đặt nhưng ứng dụng của tôi đã nhận được tiếng Anh làm ngôn ngữ hệ điều hành. Sau nhiều lần thử, tôi bắt gặp với cách giải quyết khá dễ dàng và đáng tin cậy (tôi không gọi nó là giải pháp), điều đó là tốt nếu bạn phải đối phó với một số lượng nhỏ ngôn ngữ. Vì vậy, mẹo là kiểm tra xem ngôn ngữ nào trong danh sách ngôn ngữ được trả về bởi 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; 

Bạn có thể làm tương tự cho ba ngôn ngữ của mình. Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan