2011-11-26 10 views
6

मुझे अन्य भाषाओं में एक प्रोग्राम का अनुवाद करने की ज़रूरत है, असल में मेरे पास 3 भाषाओं (अंग्रेजी, स्पेनिश, पुर्तगाली) में एक ही कार्यक्रम है, लेकिन मैंने अनुवाद किया, पुनः संकलित किया, और मेरे पास 3 अलग-अलग निष्पादन योग्य हैं। और अधिक भाषाएं जोड़ें, और लिंक रखें, और नए कार्यों को जोड़ना मुझे पागल कर रहा है।मल्टी-भाषा प्रोजेक्ट के लिए डेल्फी में सिस्टम भाषा का पता कैसे लगाया जाए?

तो अब मैंने एक निष्पादन योग्य और बाहरी भाषा फ़ाइल रखने का फैसला किया है, इसलिए नई भाषाओं को जोड़ने के लिए पाठ संपादक के साथ भाषा फ़ाइल को संपादित करने की आवश्यकता नहीं है, और सबकुछ ठीक है।

मैं सभी भाषाओं को एक बाहरी फाइल में रखना चाहता हूं। जैसे international.lang

[portuguese] 
greeting="Bem-vindo" 

[spanish] 
greeting="Ben venido" 

अगर फाइल international.lang वहाँ नहीं है, या अपनी भाषा फ़ाइल पर नहीं है, कार्यक्रम में अंग्रेज़ी डिफ़ॉल्ट रूप से, कोई त्रुटि के साथ शुभारंभ करेंगे। संसाधनों के आधार पर अधिकांश बहु-भाषा कार्यक्रमों की तरह।

तो सवाल यह है कि डेल्फी में विंडोज भाषा का पता कैसे लगाता है? मेरे दृष्टिकोण पर कोई विचार? प्रोग्राम पर सभी कैप्शन को व्यवस्थित रूप से बदलने का कोई तरीका है?

ps: मैं डेल्फी 7 का उपयोग कर रहा हूं, और मुझे कोई भी घटक नहीं मिल रहा है जो कि अच्छा है।

+2

क्या आपने बस USER को भाषा का चयन करने पर विचार किया है? शायद जब वे स्थापित करते हैं। डिफ़ॉल्ट सेट करने के लिए नीचे दी गई जानकारी का उपयोग करें, लेकिन हो सकता है कि उपयोगकर्ता इंस्टॉलेशन समय पर या रनटाइम पर भी निर्णय ले, कि वे कौन सी भाषा चाहते हैं? दूसरा, यह समस्या पहले से ही DxGetText द्वारा हल की गई है। इसे जांचें: http://dxgettext.po.dk/ –

+0

@WarrenP हां, मैं बस डिफ़ॉल्ट रूप से सिस्टम भाषा के समान भाषा का चयन करना चाहता हूं। तो कई मामलों में उपयोगकर्ता को सेटिंग्स को छूने की आवश्यकता नहीं होगी। –

उत्तर

9

आप लोकेल पहचानकर्ता प्राप्त करने के लिए GetSystemDefaultLCID फ़ंक्शन का उपयोग कर सकते हैं और फिर भाषा संबंधित नाम को हल करने के लिए VerLanguageName फ़ंक्शन का उपयोग कर सकते हैं। या का उपयोग GetLocaleInfo समारोह

चेक इस नमूने

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

नोट: Windows Vista के साथ शुरू नए कार्यों मौजूद है एक ही स्थान की जानकारी प्राप्त करने के लिए, इन कार्यों GetLocaleInfoEx, GetUserDefaultLocaleName और GetSystemDefaultLocaleName

+0

ठीक काम करता है, लेकिन आप जानते हैं कि स्थान के बिना केवल भाषा का नाम कैसे प्राप्त करें? मैं यहां यह मूल्य प्राप्त कर रहा हूं 'अंग्रेजी (संयुक्त राज्य)' मैं '(संयुक्त राज्य) के बिना 'अंग्रेजी' चाहता हूं। यदि नहीं, नियमित अभिव्यक्ति के साथ कोष्ठक को हटाने के लिए सुरक्षित है? –

+0

आप 'VerLanguageName' या' GetLocaleInfo' का उपयोग कर रहे हैं? – RRUZ

+1

'VerLanguageName = अंग्रेज़ी (संयुक्त राज्य)' और 'GetLocaleInfo = English' दोनों windows7 और windows xp (ठीक काम करता है) पर भी। मुझे लगता है कि मुझे केवल GetLocaleInfo –

0

मैं जाँच एक ही समस्या हालांकि मुझे केवल दो भाषाओं से निपटना है: अंग्रेजी (डिफ़ॉल्ट) और पोलिश। मैंने ऊपर सूचीबद्ध सभी समाधानों की कोशिश की और उनमें से कोई भी काम नहीं कर रहा था। मैं सिस्टम सेटिंग, रीबूटिंग इत्यादि बदल रहा था और हमेशा भाषा अंग्रेजी प्राप्त कर रहा था। पोलिश में स्विच किए जाने पर सबकुछ पोलिश में प्रदर्शित किया गया था, सभी पोलिश लोकेशंस सेट किए गए थे लेकिन मेरा आवेदन ओएस भाषा के रूप में अंग्रेजी प्राप्त कर रहा था। कई कोशिशों के बाद मैं काफी आसान और भरोसेमंद कामकाज के साथ आया (मैं इसे समाधान नहीं कहता) यह अच्छा है अगर आपको छोटी संख्या में भाषाओं से निपटना पड़े। तो चाल यह जांचना है कि भाषा भाषा किस भाषा भाषा को वापस लाया जाता है।

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; 

आप अपनी तीन भाषाओं के लिए भी ऐसा ही कर सकते हैं। उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे