Qt 5.11 - Internationalization and Localization with Qt Quick

क्यूटी क्विक के साथ अंतर्राष्ट्रीयकरण और स्थानीयकरण




qt

क्यूटी क्विक के साथ अंतर्राष्ट्रीयकरण और स्थानीयकरण

आपके आवेदन का अंतर्राष्ट्रीयकरण

निम्नलिखित अनुभाग आपके QML स्रोत कोड के अंतर्राष्ट्रीयकरण के विभिन्न पहलुओं का वर्णन करते हैं। यदि आप अपने एप्लिकेशन के सभी उपयोगकर्ता इंटरफ़ेस घटकों के लिए इन गाइडों का पालन करते हैं, तो विभिन्न भाषाओं और स्थानीय सांस्कृतिक सम्मेलनों के लिए आपके आवेदन के हर पहलू का स्थानीयकरण करना संभव हो जाता है, जैसे तारीखें और संख्याएँ स्वरूपित होती हैं।

1. सभी लिटरल यूजर इंटरफेस स्ट्रिंग्स के लिए qsTr () का उपयोग करें

QML में स्ट्रिंग्स को qsTr (), qsTranslate (), qsTrId (), QT_TR_NOOP (), QT_TRANSLATE_NOOP (), और QT_TRID_NOOP () फ़ंक्शन का उपयोग करके अनुवाद के लिए चिह्नित किया जा सकता है। तार को चिह्नित करने का सबसे आम तरीका qsTr () फ़ंक्शन के साथ है। उदाहरण के लिए:

Text {
    id: txt1;
    text: qsTr("Back");
}

यह कोड अनुवाद फ़ाइलों में एक महत्वपूर्ण प्रविष्टि "बैक" बनाता है। रनटाइम में, अनुवाद प्रणाली "बैक" कीवर्ड को देखती है और फिर वर्तमान सिस्टम लोकेल के लिए संबंधित अनुवाद मूल्य प्राप्त करता है। परिणाम text संपत्ति में वापस आ गया है और उपयोगकर्ता इंटरफ़ेस वर्तमान लोकेल के लिए "बैक" का उपयुक्त अनुवाद दिखाएगा।

2. अनुवादक के लिए संदर्भ जोड़ें

उपयोगकर्ता इंटरफ़ेस स्ट्रिंग्स अक्सर कम होते हैं, इसलिए आपको पाठ का संदर्भ समझने में पाठ का अनुवाद करने वाले व्यक्ति की सहायता करने की आवश्यकता होती है। अनुवाद किए जाने वाले स्ट्रिंग से पहले आप अतिरिक्त वर्णनात्मक पाठ के रूप में स्रोत कोड में संदर्भ जानकारी जोड़ सकते हैं। इन अतिरिक्त विवरणों को अनुवादक को दी जाने वाली .ts अनुवाद फ़ाइलों में शामिल किया गया है।

नोट: .ts फाइलें स्रोत ग्रंथों के साथ एक्सएमएल फाइलें हैं और अनुवादित पाठ के लिए जगह है। अद्यतित .ts फाइलें बाइनरी अनुवाद फ़ाइलों में परिवर्तित हो जाती हैं और अंतिम अनुप्रयोग के हिस्से के रूप में शामिल होती हैं।

निम्नलिखित कोड स्निपेट में, //: लाइन पर पाठ अनुवादक के लिए मुख्य टिप्पणी है।

//~ लाइन पर पाठ वैकल्पिक अतिरिक्त जानकारी है। पाठ का पहला शब्द XML तत्व में एक अतिरिक्त पहचानकर्ता के रूप में उपयोग किया जाता है .ts फ़ाइल इसलिए सुनिश्चित करें कि पहला शब्द वाक्य का हिस्सा नहीं है। उदाहरण के लिए, टिप्पणी "प्रसंग से संबंधित नहीं है" को "। अतिरिक्त-संदर्भ> उस से संबंधित नहीं" ".ts फ़ाइल में बदल दिया गया है।

Text {
    id: txt1;
    // This user interface string is only used here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back");
}

3. आइडेंटिकल टेक्सट को डिसएम्बिग करें

अनुवाद प्रणाली यूजर इंटरफेस टेक्स्ट स्ट्रिंग्स को अद्वितीय वस्तुओं में समेकित करती है। यह समेकन कई बार एक ही पाठ का अनुवाद करने वाले अनुवाद कार्य करने वाले व्यक्ति को बचाता है। हालाँकि, कुछ मामलों में, पाठ समान है लेकिन इसका एक अलग अर्थ है। उदाहरण के लिए, अंग्रेजी में, "बैक" का अर्थ है, एक कदम पीछे की ओर ले जाना और इसका मतलब सामने के विपरीत किसी वस्तु का भाग भी है। आपको इन दो अलग-अलग अर्थों के बारे में अनुवाद प्रणाली को बताना होगा ताकि अनुवादक दो अलग-अलग अनुवाद बना सके।

QsTr () फ़ंक्शन के दूसरे पैरामीटर के रूप में कुछ आईडी टेक्स्ट जोड़कर समान ग्रंथों के बीच अंतर करें।

निम्नलिखित कोड स्निपेट में, not front टेक्स्ट इस "बैक" टेक्स्ट को बैकस्टेपिंग "फाइल" से अलग करने के लिए एक आईडी not front :

Text {
    id: txt1;
    // This user interface string is used only here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back", "not front");
}

4. स्ट्रिंग में पैरामीटर सम्मिलित करने के लिए %x का उपयोग करें

विभिन्न भाषाओं ने शब्दों को अलग-अलग क्रम में एक साथ रखा है, इसलिए शब्दों और डेटा को संक्षिप्त करके वाक्य बनाना अच्छा नहीं है। इसके बजाय, स्ट्रिंग्स में पैरामीटर सम्मिलित करने के लिए % का उपयोग करें। उदाहरण के लिए, निम्नलिखित स्निपेट में दो नंबर पैरामीटर %1 और %2 साथ एक स्ट्रिंग है। ये पैरामीटर .arg() फ़ंक्शंस के साथ डाले गए हैं।

Text {
    text: qsTr("File %1 of %2").arg(counter).arg(total)
}

% 1 पहले पैरामीटर को संदर्भित करता है और %2 दूसरे पैरामीटर को संदर्भित करता है इसलिए यह कोड आउटपुट उत्पन्न करता है जैसे: "फ़ाइल 2 का 3"।

5.% Lx का उपयोग करें ताकि संख्याएँ स्थानीयकृत हों

यदि आप पैरामीटर निर्दिष्ट करते समय %L संशोधक शामिल करते हैं, तो संख्या वर्तमान क्षेत्रीय सेटिंग्स के अनुसार स्थानीयकृत होती है। उदाहरण के लिए, निम्नलिखित कोड स्निपेट में, %L1 अर्थ है कि वर्तमान में चुने गए स्थान (भौगोलिक क्षेत्र) की संख्या स्वरूपण परंपराओं के अनुसार पहले मापदंडों को प्रारूपित करें:

Text {
    text: qsTr("%L1").arg(total)
}

फिर, उपरोक्त कोड के साथ, यदि total संख्या "4321.56" (चार हजार तीन सौ इक्कीस बिंदु छब्बीस) है; अंग्रेजी क्षेत्रीय सेटिंग्स के साथ, (स्थानीय) आउटपुट "4,321.56" है; जर्मन क्षेत्रीय सेटिंग्स के साथ, आउटपुट "4.321,56" है।

6. डेट्स, टाइम्स और मुद्राओं का अंतर्राष्ट्रीयकरण करें

दिनांक और समय को प्रारूपित करने के लिए कोई विशेष इन-स्ट्रिंग संशोधक नहीं हैं। इसके बजाय, आपको वर्तमान स्थान (भौगोलिक क्षेत्र) को क्वेरी करने और स्ट्रिंग को प्रारूपित करने के लिए Date के तरीकों का उपयोग करने की आवश्यकता है।

Qt.locale() एक Locale ऑब्जेक्ट देता है जिसमें लोकेल के बारे में सभी प्रकार की जानकारी होती है। विशेष रूप से, Locale.name संपत्ति में वर्तमान लोकेल के लिए भाषा और देश की जानकारी होती है। आप मान का उपयोग कर सकते हैं या वर्तमान लोकेल के लिए उपयुक्त सामग्री निर्धारित करने के लिए इसे पार्स कर सकते हैं।

निम्न स्निपेट को दिनांक () के साथ वर्तमान दिनांक और समय मिलता है, फिर उसे वर्तमान लोकेल के लिए एक स्ट्रिंग में परिवर्तित करता है। तब यह उचित अनुवाद के लिए दिनांक स्ट्रिंग को% 1 पैरामीटर में सम्मिलित करता है।

Text {
    text: qsTr("Date %1").arg(Date().toLocaleString(Qt.locale()))
}

यह सुनिश्चित करने के लिए कि मुद्रा नंबर स्थानीयकृत हैं, Number प्रकार का उपयोग करें। इस प्रकार के समान कार्य हैं जैसे कि संख्या को स्थानीयकृत मुद्रा स्ट्रिंग्स में संख्या परिवर्तित करने के लिए।

7. Translatable डेटा पाठ स्ट्रिंग्स के लिए QT_TR_NOOP () का उपयोग करें

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

ListModel {
    id: myListModel;
    ListElement {
        //: Capital city of Finland
        name: QT_TR_NOOP("Helsinki");
        }
    }

...

Text {
    text: qsTr(myListModel.get(0).name); // get the translation of the name property in element 0
    }

8. स्थानीयकरण सुविधाओं को बढ़ाने के लिए लोकेल का उपयोग करें

यदि आप विभिन्न भौगोलिक क्षेत्रों के लिए अलग ग्राफिक्स या ऑडियो चाहते हैं, तो आप Qt का उपयोग कर सकते हैं। locale () वर्तमान स्थान पाने के लिए। फिर आप उस लोकेल के लिए उपयुक्त ग्राफिक्स या ऑडियो चुनें।

निम्न कोड स्निपेट दिखाता है कि आप एक उपयुक्त आइकन कैसे चुन सकते हैं जो वर्तमान लोकेल की भाषा का प्रतिनिधित्व करता है।

Component.onCompleted: {
    switch (Qt.locale().name.substring(0,2)) {
        case "en":   // show the English-language icon
            languageIcon = "../images/language-icon_en.png";
            break;
        case "fi":   // show the Finnish language icon
            languageIcon = "../images/language-icon_fi.png";
            break;
        default:     // show a default language icon
            languageIcon = "../images/language-icon_default.png";
    }
}

9. डायनेमिक लैंग्वेज चेंजेस की तैयारी करें

आप QCoreApplication::removeTranslator () और QCoreApplication::removeTranslator () के साथ QCoreApplication::installTranslator को जोड़ने और हटाने के द्वारा उपयोग की जाने वाली भाषा को बदल सकते हैं। बाद में आप QQmlEngine::retranslate () को उन सभी बाइंडिंग का ताज़ा ट्रिगर करने के लिए कॉल कर सकते हैं जो अनुवाद का उपयोग करते हैं। नतीजतन, आपका उपयोगकर्ता इंटरफ़ेस गतिशील रूप से, नई चयनित भाषा में बदल जाएगा।

वैकल्पिक रूप से, आप अपने अनुप्रयोग के QQmlEngine उदाहरण के लिए QEvent::LanguageChange घटना को भी अग्रेषित कर सकते हैं या QQmlEngine लिए अपना संकेत कनेक्ट कर सकते हैं QQmlEngine::retranslate ()।

आपके अनुप्रयोग को स्थानीय बनाना

Qt क्विक एप्लिकेशन Qt C ++ एप्लिकेशन (लुपडेट, लेरेलिजे .ts फ़ाइल) के समान अंतर्निहित स्थानीयकरण प्रणाली का उपयोग करते हैं। आप क्यूटी लिंग्विस्ट मैनुअल में वर्णित समान टूल का उपयोग करते हैं। आप समान अनुप्रयोग में C ++ और QML स्रोत में उपयोगकर्ता इंटरफ़ेस स्ट्रिंग भी कर सकते हैं। सिस्टम एक एकल संयुक्त अनुवाद फ़ाइल बनाएगा और तार QML और C ++ से सुलभ हैं।

संकलक से QML स्रोत को छिपाने के लिए एक सशर्त का उपयोग करें

lupdate टूल आपके एप्लिकेशन से उपयोगकर्ता इंटरफ़ेस स्ट्रिंग निकालता है। lupdate ने आपके एप्लिकेशन की .pro फ़ाइल को यह पहचानने के लिए पढ़ा है कि कौन सी स्रोत फ़ाइलों में अनुवादित होने वाले ग्रंथ हैं। इसका मतलब है कि आपकी स्रोत फ़ाइलों को .pro फ़ाइल में SOURCES या HEADERS प्रविष्टि में सूचीबद्ध किया जाना चाहिए। यदि आपकी फाइलें सूचीबद्ध नहीं हैं, तो उनमें मौजूद ग्रंथ नहीं मिलेंगे।

हालाँकि, स्रोत चर C ++ स्रोत फ़ाइलों के लिए अभिप्रेत है। यदि आप QML या जावास्क्रिप्ट स्रोत फ़ाइलों को सूचीबद्ध करते हैं, तो कंपाइलर उन्हें C ++ फ़ाइलों के रूप में बनाने की कोशिश करता है। वर्कअराउंड के रूप में, आप lupdate_only{...} सशर्त विवरण का उपयोग कर सकते हैं ताकि lupdate टूल टूल .qml फ़ाइलों को देखता हो लेकिन C ++ कंपाइलर उन्हें अनदेखा करता है।

उदाहरण के लिए, निम्न .pro फ़ाइल स्निपेट अनुप्रयोग में दो .qml फ़ाइलों को निर्दिष्ट करता है।

lupdate_only{
SOURCES = main.qml \
          MainPage.qml
}

आप वाइल्डकार्ड मैच के साथ .qml स्रोत फ़ाइलों को भी निर्दिष्ट कर सकते हैं। खोज पुनरावर्ती नहीं है, इसलिए आपको प्रत्येक निर्देशिका को निर्दिष्ट करने की आवश्यकता है जहां स्रोत कोड में उपयोगकर्ता इंटरफ़ेस स्ट्रिंग हैं:

lupdate_only{
SOURCES = *.qml \
          *.js \
          content/*.qml \
          content/*.js
}

क्यूटी स्थानीयकरण के बारे में अधिक जानकारी के लिए क्यूटी भाषाविद् मैनुअल देखें।