Qt 5.11 - Writing Source Code for Translation

अनुवाद के लिए सोर्स कोड लिखना




qt

अनुवाद के लिए सोर्स कोड लिखना

क्यूटी के साथ क्रॉस-प्लेटफॉर्म इंटरनेशनल सॉफ्टवेयर लिखना एक सौम्य, वृद्धिशील प्रक्रिया है। आपका सॉफ्टवेयर निम्नलिखित अनुभागों में वर्णित चरणों में अंतर्राष्ट्रीयकृत हो सकता है। क्यूटी क्विक एप्लिकेशन को आंतरिक बनाने के बारे में अधिक जानकारी के लिए, क्यूटी क्विक के साथ अंतर्राष्ट्रीयकरण और स्थानीयकरण देखें।

सभी उपयोगकर्ता-दृश्यमान पाठ के लिए QString का उपयोग करना

चूंकि QString आंतरिक रूप से यूनिकोड एन्कोडिंग का उपयोग करता है, इसलिए दुनिया में हर भाषा को परिचित टेक्स्ट प्रोसेसिंग ऑपरेशन का उपयोग करके पारदर्शी रूप से संसाधित किया जा सकता है। इसके अलावा, चूंकि सभी Qt फ़ंक्शन जो उपयोगकर्ता के लिए पाठ प्रस्तुत करते हैं, एक पैरामीटर के रूप में QString लेते हैं, QString रूपांतरण ओवरहेड के लिए कोई char * नहीं है।

स्ट्रिंग्स जो "प्रोग्रामर स्पेस" में हैं (जैसे कि QObject नाम और फ़ाइल प्रारूप ग्रंथ) QObject उपयोग करने की आवश्यकता नहीं है; पारंपरिक char * या QByteArray वर्ग पर्याप्त होगा।

आपको यह नोटिस करने की संभावना नहीं है कि आप यूनिकोड का उपयोग कर रहे हैं; QChar , और QChar क्रूड QChar const char * और पारंपरिक C से char आसान संस्करण हैं।

स्रोत कोड में char * स्ट्रिंग्स को UTF-8 के रूप में माना जाता है, जब इसे QString में बदल दिया जाता है। यदि आपका सी स्ट्रिंग शाब्दिक एक अलग एन्कोडिंग का उपयोग करता है, तो QString::fromLatin1 () या QTextCodec का उपयोग करके शाब्दिक को एक यूनिकोड एन्कोडेड QTextCodec में परिवर्तित करें।

सभी साहित्य पाठ के लिए tr () का उपयोग करना

जहाँ भी आपका कार्यक्रम एक स्ट्रिंग शाब्दिक (उद्धृत पाठ) का उपयोग करता है जिसे उपयोगकर्ता को प्रस्तुत किया जाएगा, यह सुनिश्चित करें कि यह QCoreApplication::translate () फ़ंक्शन द्वारा संसाधित किया गया है। अनिवार्य रूप से यह हासिल करने के लिए आवश्यक सभी को अपनी कक्षाओं के लिए अनुवादित पाठ प्राप्त करने के लिए tr() फ़ंक्शन का उपयोग करना है, आमतौर पर प्रदर्शन उद्देश्यों के लिए। इस फ़ंक्शन का उपयोग यह इंगित करने के लिए भी किया जाता है कि किसी एप्लिकेशन में कौन से टेक्स्ट स्ट्रिंग्स अनुवाद योग्य हैं।

उदाहरण के लिए, LoginWidget मान LoginWidget का एक उपवर्ग है:

LoginWidget::LoginWidget()
{
    QLabel *label = new QLabel(tr("Password:"));
    ...
}

यह उन 99% उपयोगकर्ता-दृश्य स्ट्रिंग्स के लिए खाता है जिन्हें आप लिखने की संभावना रखते हैं।

यदि उद्धृत पाठ QObject उपवर्ग के सदस्य फ़ंक्शन में नहीं है, तो उचित वर्ग के tr () फ़ंक्शन या QCoreApplication :: Translate () फ़ंक्शन का सीधे उपयोग करें:

void some_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
                LoginWidget::tr("Password:"), logwid);
}

void same_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
                QCoreApplication::translate("LoginWidget", "Password:"), logwid);
}

Qt अनुवाद के संदर्भ में प्रत्येक अनुवाद योग्य स्ट्रिंग को अनुक्रमित करता है जो इसके साथ जुड़ा हुआ है; यह आम तौर पर QObject उपवर्ग का नाम है जिसका इसमें उपयोग किया जाता है।

अनुवाद संदर्भों को प्रत्येक नए वर्ग परिभाषा में Q_OBJECT मैक्रो के उपयोग द्वारा नए QObject कक्षाओं के लिए परिभाषित किया गया है।

जब tr () कहा जाता है, तो यह एक QTranslator स्ट्रिंग को QTranslator ऑब्जेक्ट का उपयोग करके QTranslator है। अनुवाद से काम करने के लिए, इनमें से एक या अधिक को अनुवाद सक्षम करने में वर्णित तरीके से एप्लिकेशन ऑब्जेक्ट पर स्थापित किया जाना चाहिए।

क्यूएमएल में स्ट्रिंग्स का अनुवाद ठीक उसी तरह से काम करता है जैसे सी ++ में, एकमात्र अंतर यह है कि आपको tr() बजाय qsTr () को कॉल करने की आवश्यकता है। Qt क्विक के साथ अंतर्राष्ट्रीयकरण और स्थानीयकरण पर पेज भी देखें।

अनुवाद संदर्भ को परिभाषित करना

QObject और प्रत्येक QObject उपवर्ग के लिए अनुवाद संदर्भ वर्ग का नाम है। अनुवाद के संदर्भ को ओवरराइड करने के लिए Q_OBJECT उप-वर्ग वाले डेवलपर्स को अपनी कक्षा परिभाषा में Q_OBJECT मैक्रो का उपयोग करना चाहिए। यह मैक्रो उपवर्ग के नाम के संदर्भ को सेट करता है।

उदाहरण के लिए, निम्न वर्ग परिभाषा में Q_OBJECT मैक्रो शामिल है, जो एक नए tr () को लागू करता है जो MainWindow संदर्भ का उपयोग करता है:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    ...

यदि Q_OBJECT को वर्ग परिभाषा में उपयोग नहीं किया जाता है, तो संदर्भ को आधार वर्ग से विरासत में लिया जाएगा। उदाहरण के लिए, चूंकि Qt में सभी QObject कक्षाएं एक संदर्भ प्रदान करती हैं, Q_OBJECT मैक्रो के बिना परिभाषित एक नया QWidget उप-वर्ग QWidget संदर्भ का उपयोग करेगा यदि इसका tr () फ़ंक्शन QWidget किया गया है।

अनुवाद प्राप्त करने के लिए tr () का उपयोग करना

निम्न उदाहरण दिखाता है कि पिछले अनुभाग में दिखाए गए वर्ग के लिए अनुवाद कैसे प्राप्त किया जाता है:

void MainWindow::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("&File"));
    ...

यहाँ, अनुवाद प्रसंग MainWindow क्योंकि यह MainWindow::tr() फ़ंक्शन है जो कि आह्वान किया गया है। Tr () फ़ंक्शन द्वारा लौटाया गया पाठ MainWindow संदर्भ से प्राप्त "और फ़ाइल" का अनुवाद है।

जब Qt का अनुवाद टूल, lupdate , स्रोत फ़ाइलों के एक सेट को संसाधित करने के लिए उपयोग किया जाता है, तो ट्र () कॉल में लिपटे पाठ का अनुवाद फ़ाइल के एक सेक्शन में किया जाता है जो इसके अनुवाद संदर्भ से मेल खाता है।

कुछ स्थितियों में, कॉल को ट्राई () में पूरी तरह से अर्हता देकर स्पष्ट रूप से अनुवाद का संदर्भ देना उपयोगी है; उदाहरण के लिए:

QString text = QScrollBar::tr("Page up");

यह कॉल QScrollBar संदर्भ से "पेज अप" के लिए अनुवादित पाठ प्राप्त करता है। डेवलपर्स किसी विशेष अनुवाद संदर्भ के लिए अनुवाद प्राप्त करने के लिए QCoreApplication :: Translate () फ़ंक्शन का उपयोग कर सकते हैं।

संख्याओं को स्थानीय करने के लिए tr () का उपयोग करना

आप उपयुक्त tr () स्ट्रिंग्स का उपयोग करके संख्याओं का स्थानीयकरण कर सकते हैं:

void Clock::setTime(const QTime &time)
{
    if (tr("AMPM") == "AMPM") {
        // 12-hour clock
    } else {
        // 24-hour clock
    }
}

उदाहरण के लिए, अमेरिका के लिए हम "एएमपीएम" का अनुवाद छोड़ देंगे क्योंकि यह 12 घंटे की घड़ी की शाखा का उपयोग करता है; लेकिन यूरोप में हम इसे 24 घंटे की घड़ी की शाखा का उपयोग करने के लिए कोड के रूप में अनुवाद करेंगे।

गैर-क्यूटी कक्षाओं का अनुवाद

कक्षाओं में उपयोग किए जाने वाले तार के लिए अंतर्राष्ट्रीयकरण सहायता प्रदान करना कभी-कभी आवश्यक होता है जो अनुवाद सुविधाओं को सक्षम करने के लिए Q_OBJECT उपयोग नहीं करते हैं या Q_OBJECT मैक्रो का उपयोग करते हैं। चूंकि Qt उस वर्ग के आधार पर रन-टाइम में स्ट्रिंग्स का अनुवाद करता है, जिसके साथ वे जुड़े हुए हैं और स्रोत कोड में अनुवाद योग्य स्ट्रिंग्स के लिए lupdate लगता है, गैर-क्यूटी वर्गों को तंत्र का उपयोग करना चाहिए जो इस जानकारी को भी प्रदान करते हैं।

ऐसा करने का एक तरीका Q_DECLARE_TR_FUNCTIONS () मैक्रो का उपयोग करके गैर-क्यूटी वर्ग में अनुवाद समर्थन जोड़ना है; उदाहरण के लिए:

class MyClass
{
    Q_DECLARE_TR_FUNCTIONS(MyClass)

public:
    MyClass();
    ...
};

यह वर्ग को tr() फ़ंक्शंस प्रदान करता है जिसका उपयोग क्लास से जुड़े स्ट्रिंग्स का अनुवाद करने के लिए किया जा सकता है, और स्रोत कोड में lupdate स्ट्रिंग्स खोजने के लिए lupdate लिए संभव बनाता है।

वैकल्पिक रूप से, QCoreApplication :: अनुवाद () फ़ंक्शन को एक विशिष्ट संदर्भ के साथ कहा जा सकता है, और यह lupdate और क्यूटी भाषाविद् द्वारा मान्यता प्राप्त होगा।

अनुवादक टिप्पणियाँ

डेवलपर्स अनुवाद प्रक्रिया के साथ अनुवादकों की मदद करने के लिए प्रत्येक अनुवाद करने योग्य स्ट्रिंग के बारे में जानकारी शामिल कर सकते हैं। जब स्रोत फ़ाइलों को संसाधित करने के लिए lupdate का उपयोग किया जाता है तो lupdate निकाला जाता है। टिप्पणियों को जोड़ने का अनुशंसित तरीका अपने कोड में tr () कॉल को फ़ॉर्म के टिप्पणियों के साथ एनोटेट करना है:

//: ...

या

/* : ... */

उदाहरण:

//: This name refers to a host name.
hostNameLabel->setText(tr("Name:"));

/*: This text refers to a C++ code example. */
QString example = tr("Example");

इन उदाहरणों में, टिप्पणियों को प्रत्येक कॉल के संदर्भ में tr () को दिए गए स्ट्रिंग्स के साथ जोड़ा जाएगा।

स्ट्रिंग्स में मेटा-डेटा जोड़ना

अतिरिक्त डेटा को प्रत्येक अनुवाद योग्य संदेश से जोड़ा जा सकता है। जब स्रोत फ़ाइलों को संसाधित करने के लिए lupdate का उपयोग किया जाता है तो lupdate निकाला जाता है। मेटा-डेटा जोड़ने का अनुशंसित तरीका आपके कोड में tr () कॉल को फ़ॉर्म की टिप्पणियों के साथ एनोटेट करना है:

//= <id>

इसका उपयोग संदेश को उपकरण की सहायता के लिए एक विशिष्ट पहचानकर्ता देने के लिए किया जा सकता है, जिसे इसकी आवश्यकता होती है।

मेटा-डेटा संलग्न करने का एक वैकल्पिक तरीका निम्नलिखित सिंटैक्स का उपयोग करना है:

//~ <field name> <field contents>

यह संदेश को मेटा-डेटा संलग्न करने के लिए इस्तेमाल किया जा सकता है। फ़ील्ड नाम में एक डोमेन प्रीफ़िक्स (संभवतः फ़ील्ड से प्रेरित फ़ाइल प्रारूप का पारंपरिक फ़ाइल एक्सटेंशन), ​​एक हाइफ़न और अंडरस्कोर-सीमांकित संकेतन में वास्तविक फ़ील्ड नाम शामिल होना चाहिए। टीएस फ़ाइलों में भंडारण के लिए, उपसर्ग "अतिरिक्त-" के साथ मिलकर फ़ील्ड का नाम एक XML तत्व नाम होगा। फ़ील्ड सामग्री एक्सएमएल-बच जाएगी, लेकिन अन्यथा तत्व की सामग्री के रूप में शब्दशः दिखाई देते हैं। प्रत्येक संदेश में किसी भी विशिष्ट फ़ील्ड को जोड़ा जा सकता है।

उदाहरण:

//: This is a comment for the translator.
//= qtn_foo_bar
//~ loc-layout_id foo_dialog
//~ loc-blank False
//~ magic-stuff This might mean something magic.
QString text = MyMagicClass::tr("Sim sala bim.");

आप अनुवादक टिप्पणी के लिए कीवर्ड ट्रांसलेटर का उपयोग कर सकते हैं। ट्रांसलेटर कीवर्ड के ठीक सामने दिखने वाला मेटा-डेटा पूरी टीएस फाइल पर लागू होता है।

बहुविकल्पी

यदि एक ही अनुवाद के संदर्भ में एक ही अनुवाद योग्य स्ट्रिंग का उपयोग विभिन्न भूमिकाओं में किया जाता है, तो कॉल में एक अतिरिक्त पहचान स्ट्रिंग को tr() में पास किया जा सकता है। यह वैकल्पिक वितरण तर्क का उपयोग अन्यथा समान स्ट्रिंग्स के बीच अंतर करने के लिए किया जाता है।

उदाहरण:

MyWindow::MyWindow()
{
    QLabel *senderLabel = new QLabel(tr("Name:"));
    QLabel *recipientLabel = new QLabel(tr("Name:", "recipient"));
    ...

क्यूटी 4.4 और उससे पहले में, यह अस्वीकरण पैरामीटर अनुवादकों को टिप्पणियां निर्दिष्ट करने का पसंदीदा तरीका था।

संभालना बहुवचन

कुछ अनुवाद योग्य तार पूर्णांक मानों के लिए प्लेसहोल्डर होते हैं और उपयोग में आने वाले मूल्यों के आधार पर अलग-अलग अनुवाद करने की आवश्यकता होती है।

इस समस्या के साथ मदद करने के लिए, डेवलपर्स tr() फ़ंक्शन के लिए एक अतिरिक्त पूर्णांक तर्क पास करते हैं, और आमतौर पर प्रत्येक अनुवाद योग्य स्ट्रिंग में बहुवचन के लिए एक विशेष अंकन का उपयोग करते हैं।

यदि यह तर्क शून्य से अधिक या अधिक है, तो परिणामी स्ट्रिंग में %n की सभी घटनाओं को प्रतिस्थापित मूल्य के दशमलव प्रतिनिधित्व के साथ बदल दिया जाता है। इसके अलावा, उपयोग किया जाने वाला अनुवाद प्रत्येक भाषा के नियमों के अनुसार मूल्य के अनुकूल होगा।

उदाहरण:

int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));

नीचे दी गई तालिका दिखाती है कि सक्रिय अनुवाद के आधार पर स्ट्रिंग क्या लौटाती है:

सक्रिय अनुवाद
n कोई अनुवाद नहीं फ्रेंच अंग्रेज़ी
0 "संदेश" सहेजा गया " "मैं संदेश sauvegardé" "मैं संदेश सहेजा गया"
1 "संदेश" सहेजा गया "मैं संदेश sauvegardé" "1 संदेश सहेजा गया"
2 "2 संदेश (संदेश) सहेजे गए" "2 संदेश suvegardé s " "2 संदेश सहेजे गए"
37 "37 संदेश (संदेश) सहेजे गए" "37 संदेश suvegardé s " "37 संदेश सहेजे गए"

यह मुहावरा पारंपरिक दृष्टिकोण से अधिक लचीला है; जैसे,

n == 1 ? tr("%n message saved") : tr("%n messages saved")

क्योंकि यह कई बहुवचन रूपों वाली लक्षित भाषाओं के साथ भी काम करता है (उदाहरण के लिए, आयरिश में एक विशेष "दोहरी" रूप है, जिसका उपयोग n 2 होने पर किया जाना चाहिए), और यह n == 0 मामले को फ्रेंच जैसी भाषाओं के लिए सही ढंग से संभालता है एकवचन।

मूल भाषा में बहुवचन रूपों को संभालने के लिए, आपको इस भाषा के लिए एक अनुवाद फ़ाइल लोड करनी होगी। ल्यूपडेट टूल में -pluralonly कमांड लाइन विकल्प होता है, जो बहुवचन रूपों के साथ केवल प्रविष्टियों वाली टीएस फाइलों के निर्माण की अनुमति देता है।

इस मुद्दे पर अधिक जानकारी के लिए अनुवाद में Qt त्रैमासिक अनुच्छेद बहुवचन प्रपत्र देखें।

%n बजाय, आप %n का स्थानीयकृत प्रतिनिधित्व बनाने के लिए %Ln का उपयोग कर सकते हैं। कनवर्ज़न डिफ़ॉल्ट लोकेल का उपयोग करता है, QLocale::setDefault () का उपयोग करके सेट किया गया है। (यदि कोई डिफ़ॉल्ट लोकेल निर्दिष्ट नहीं की गई थी, तो सिस्टम वाइड लोकेल का उपयोग किया जाता है।)

नियमों का एक सारांश, जिसका उपयोग बहुवचन के लिए किया जाता है, को बहुवचन दस्तावेज़ के लिए अनुवाद नियम में पाया जा सकता है।

पाठ का अनुवाद करना जो एक QObject उपवर्ग के बाहर है

QCoreApplication का उपयोग :: अनुवाद ()

यदि उद्धृत पाठ QObject उपवर्ग के सदस्य फ़ंक्शन में नहीं है, तो उचित वर्ग के tr () फ़ंक्शन या QCoreApplication :: Translate () फ़ंक्शन का सीधे उपयोग करें:

void some_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
            LoginWidget::tr("Password:"), logwid);
}

void same_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
            QCoreApplication::translate("LoginWidget", "Password:"),
            logwid);
}

C ++ में QT_TR_NOOP () और QT_TRANSLATE_NOOP () का उपयोग करना

यदि आपको किसी फ़ंक्शन के बाहर पूरी तरह से अनुवाद योग्य पाठ की आवश्यकता है, तो मदद के लिए दो मैक्रो हैं: QT_TR_NOOP () और QT_TRANSLATE_NOOP ()। वे केवल lupdate टूल द्वारा निष्कर्षण के लिए पाठ को चिह्नित करते हैं। मैक्रो का विस्तार केवल पाठ (संदर्भ के बिना) तक है।

QT_TR_NOOP () का उदाहरण:

QString FriendlyConversation::greeting(int type)
{
    static const char *greeting_strings[] = {
        QT_TR_NOOP("Hello"),
        QT_TR_NOOP("Goodbye")
    };
    return tr(greeting_strings[type]);
}

QT_TRANSLATE_NOOP उदाहरण ():

static const char *greeting_strings[] = {
    QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
    QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
};

QString FriendlyConversation::greeting(int type)
{
    return tr(greeting_strings[type]);
}

QString global_greeting(int type)
{
    return QCoreApplication::translate("FriendlyConversation",
                                       greeting_strings[type]);
}

यदि आप अपने सॉफ़्टवेयर को मैक्रो QT_NO_CAST_FROM_ASCII साथ संकलित करके स्वचालित रूप से रूपांतरण करने के लिए QT_NO_CAST_FROM_ASCII const char * को अक्षम करते हैं, तो आप किसी भी ऐसे तार को पकड़ने की संभावना करेंगे जो आप गायब हैं। अधिक जानकारी के लिए QString::fromLatin1 QString::fromUtf8 () और QString::fromLatin1 () देखें।

त्वरक मूल्यों के लिए QKeySequence () का उपयोग करना

त्वरक मान जैसे कि Ctrl + Q या Alt + F का भी अनुवाद करने की आवश्यकता है। यदि आप Qt::CTRL + Qt::Key_Q को अपने आवेदन में "छोड़" के लिए Qt::CTRL + Qt::Key_Q करते हैं, तो अनुवादक इसे ओवरराइड नहीं कर पाएंगे। सही मुहावरा है:

exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);

क्रमांकित तर्क का उपयोग करना

QString::arg () फ़ंक्शन तर्कों को प्रतिस्थापित करने के लिए एक सरल साधन प्रदान करते हैं:

void FileCopier::showProgress(int done, int total,
                              const QString &currentFile)
{
    label.setText(tr("%1 of %2 files copied.\nCopying: %3")
                  .arg(done)
                  .arg(total)
                  .arg(currentFile));
}

कुछ भाषाओं में तर्कों के क्रम को बदलने की आवश्यकता हो सकती है, और इसे% तर्कों के क्रम को बदलकर आसानी से प्राप्त किया जा सकता है। उदाहरण के लिए:

QString s1 = "%1 of %2 files copied. Copying: %3";
QString s2 = "Kopierer nu %3. Av totalt %2 filer er %1 kopiert.";

qDebug() << s1.arg(5).arg(10).arg("somefile.txt");
qDebug() << s2.arg(5).arg(10).arg("somefile.txt");

अंग्रेजी और नॉर्वेजियन में सही उत्पादन का उत्पादन करता है:

5 of 10 files copied. Copying: somefile.txt
Kopierer nu somefile.txt. Av totalt 10 filer er 5 kopiert.

आगे की पढाई

क्यूटी भाषाविज्ञानी मैनुअल , हैलो ट्र () उदाहरण, अनुवाद के लिए नियम