Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 92

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ Π²Ρ‹Π·ΠΎΠ² tr() ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚::tr(исходныйВСкст, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ)

Π—Π΄Π΅ΡΡŒ ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ β€” имя подкласса QObject, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ макрос Q_OBJECT. Нам Π½Π΅ трСбуСтся Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ссли ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ tr() Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈβ€”Ρ‡Π»Π΅Π½Π΅ рассматриваСмого класса. АргумСнт исходныйВСкст β€” тСкстовая константа, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ. АргумСнт ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для прСдоставлСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

НиТС приводится нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

01 RockyWidget::RockyWidget(QWidget *parent)

02 : QWidget(parent)

03 {

04 QString str1 = tr("Letter");

05 QString str2 = RockyWidget::tr("Letter");

06 QString str3 = SnazzyDialog::tr("Letter");

07 QString str4 = SnazzyDialog::tr("Letter", "US paper size");

08 }

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π²Ρ‹Π·ΠΎΠ²Π° tr() Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² контСкстС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° RockyWidget (скалистый Π²ΠΈΠ΄ΠΆΠ΅Ρ‚), Π° Π²Ρ‚ΠΎΡ€Ρ‹Π΅ Π΄Π²Π° β€” Π² контСкстС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° SnazzyDialog (ΠΏΡ€ΠΈΡ‚ΡΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ). Π’ качСствС исходного тСкста Π²ΠΎ всСх Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… случаях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ слово Β«LetterΒ» (Π±ΡƒΠΊΠ²Π°). ПослСдний Π²Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΡƒ Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ смысл исходного тСкста.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… контСкстах (классах) пСрСводятся нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ контСкстом, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ часто ΠΏΡ€ΠΈ этом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π° экранС отобраТаСтся Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСвСсти.

Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ tr() ΠΈΠ· глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ контСкст. Π›ΡŽΠ±ΠΎΠΉ подкласс QObject ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² качСствС контСкста. Если Ρ‚Π°ΠΊΠΎΠ³ΠΎ подкласса Π½Π΅Ρ‚, ΠΌΡ‹ всСгда ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сам класс QObject. НапримСр:

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 QPushButton button(QObject::tr("Hello Qt!"));

05 button.show();

06 return app.exec();

07 }

Π”ΠΎ сих ΠΏΠΎΡ€ Π²ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… контСкст задавался ΠΈΠΌΠ΅Π½Π΅ΠΌ класса. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ. НаиболСС ΠΎΠ±Ρ‰ΠΈΠΉ способ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки Π² Qt Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QApplication::translate(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: контСкст, исходный тСкст ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ. НапримСр, Π½ΠΈΠΆΠ΅ приводится Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Β«Hello Qt!Β»:

QApplication::translate("Global Stuff", "Hello Qt!");

На этот Ρ€Π°Π· ΠΌΡ‹ помСстили тСкст Π² контСкст Β«Global StuffΒ» (глобальноС вСщСство β€” Π½Ρƒ Π½ΠΈΡ…Ρ€Π΅Π½Π° сСбС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ :) ).

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr() ΠΈ translate() ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π΄Π²ΠΎΡΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ: ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° lupdate ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для поиска Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строк, ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ функциями Π‘++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСводят тСкст. Π­Ρ‚ΠΎ отраТаСтся Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ слСдуСт Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ сработаСт:

// ΠΠ•ΠŸΠ ΠΠ’Π˜Π›Π¬ΠΠž

const char *appName = "OpenDrawer 2D";

QString translated = tr(appName);

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° lupdate Π½Π΅ смоТСт ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу Β«OpenDrawer 2DΒ», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr(). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСвСсти эту строку. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈ ΠΏΡ€ΠΈ построСнии динамичСских строк:

// ΠΠ•ΠŸΠ ΠΠ’Π˜Π›Π¬ΠΠž

statusBar()->showMessage(tr("Host " + hostName + " found"));

Π—Π΄Π΅ΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строки, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr(), мСняСтся Π² зависимости ΠΎΡ‚ значСния hostName, ΠΈ поэтому ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ tr() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

РСшСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QString::arg():

statusBar()->showMessage(tr("Host %1 found").arg(hostName));

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚: строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» Β«Host %1 foundΒ» (хост %1 Π½Π°ΠΉΠ΄Π΅Π½) пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr(). Если Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° французский язык, tr() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ «НфtΠ΅ %1 trouvΠΉΒ». ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Β«%1Β» замСщаСтся Π½Π° содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ hostName.

Π₯отя Π² Ρ†Π΅Π»ΠΎΠΌ Π½Π΅ рСкомСндуСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ tr() для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос QT_TR_NOOP() для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ Ρ‚Π΅Ρ… строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π΄ΠΎ ΠΈΡ… присваивания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго Π΄Π΅Π»Π°Ρ‚ΡŒ для статичСских массивов строк. НапримСр:

01 void OrderForm::init()

02 {

03 static const char * const flowers[] = {

04 QT_TR_NOOP("Medium Stem Pink Roses"),

05 QT_TR_NOOP("One Dozen Boxed Roses"),

06 QT_TR_NOOP("Calypso Orchid"),

07 QT_TR_NOOP("Dried Red Rose Bouquet"),

08 QT_TR_NOOP("Mixed Peonies Bouquet"),

09 0

10 };

11 for (int i = 0; flowers[i]; ++i)

12 comboBox->addItem(tr(flowers[i]));

13 }

ΠœΠ°ΠΊΡ€ΠΎΡ QT_TR_NOOP() просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Но ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° lupdate ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ всС строки, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° макроса QT_TR_NOOP(), ΠΈ поэтому ΠΎΠ½ΠΈ смогут Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹. ΠŸΡ€ΠΈ использовании ΠΏΠΎΠ·ΠΆΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, tr() для выполнСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. НСсмотря Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ всС-Ρ‚Π°ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½.

БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ макрос QT_TRANSLATE_NOOP(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ макросу QT_TR_NOOP(), Π½ΠΎ для Π½Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, задаСтся контСкст. Π­Ρ‚ΠΎΡ‚ макрос ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½Π΅ класса:

static const char * const flowers[] = {

QT_TRANSLATE_NOOP("OrderForm", "Medium Stem Pink Roses"),

QT_TRANSLATE_NOOP("OrderForm", "One Dozen Boxed Roses"),

QT_TRANSLATE_NOOP("OrderForm", "Calypso Orchid"),

QT_TRANSLATE_NOOP("OrderForm", "Dried Red Rose Bouquet"),

QT_TRANSLATE_NOOP("OrderForm", "Mixed Peonies Bouquet"),

0

};

Π—Π΄Π΅ΡΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ контСкста Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с контСкстом ΠΏΡ€ΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr() ΠΈΠ»ΠΈ translate().

Когда ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tr(), Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ случаях ΠΎ нСобходимости Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строки Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tr() (особСнно Ссли это дСлаСтся Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅). Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ строки фактичСски ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ, Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ прилоТСния, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строки Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этого, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Qt Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡ€Π΅Ρ‚Π° нСявных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ с Ρ‚ΠΈΠΏΠ° const char * Π½Π° Ρ‚ΠΈΠΏ QString. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния прСпроцСссорного символа QT_NO_CAST_FROM_ASCII ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ любого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Qt. НаиболСС простой способ обСспСчСния установки этого символа состоит Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки Π² Ρ„Π°ΠΉΠ» .pro:

DEFINES += QT_NO_CAST_FROM_ASCII

Π­Ρ‚ΠΎ заставит нас ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² tr() ΠΈΠ»ΠΈ QLatin1String() Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π΄ΠΎ Π»ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π΄Π°Π½Ρ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ сообщСния ΠΎΠ± ошибкС компилятора ΠΈ заставят нас Π²ΠΎΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ tr() ΠΈΠ»ΠΈ QLatin1String().

ПослС Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ всСх Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строк Π² Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ tr() для обСспСчСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π°ΠΌ остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ это Π΄Π΅Π»Π°Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прилоТСния main(). НапримСр, Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ зависит ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния:

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 QTranslator appTranslator;

05 appTranslator.load("myapp_" + QLocale::system().name(),

06 qApp->applicationDirPath());

07 app.installTranslator(&appTranslator);

08 …

09 return app.exec();

10 }

Ѐункция QLocale::system() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QLocale, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ имя Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° .qm. Π›ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, fr Π·Π°Π΄Π°Π΅Ρ‚ СвропСйский французский язык, fr_CA Π·Π°Π΄Π°Π΅Ρ‚ канадский французский язык, a fr_CA.ISO8859-15 Π·Π°Π΄Π°Π΅Ρ‚ канадский французский язык с использованиСм ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ISO 8859-15 (которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ символы Β«^Β», «КЬ», Β«β„–Β» ΠΈ Β«Π«Β» β€” Π² исходном Π±ΡƒΠΌΠ°ΠΆΠ½ΠΎΠΌ ΠΈΠ·Π΄Π°Π½ΠΈΠΈ французский ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ подСвался %) ).

Если Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ являСтся fr_CA.ISO8859-15, функция QTranslator::load() сначала попытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» myapp_fr_CA.ISO8859-15.qm. Если этого Ρ„Π°ΠΉΠ»Π° Π½Π΅Ρ‚, функция load() Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС попытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» myapp_fr_CA.qm, Π·Π°Ρ‚Π΅ΠΌ myapp_fr.qm ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, myapp.qm, ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ послСднСй ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ. Π’ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… случаях Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ» myapp_fr.qm, содСрТащий ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° стандартный французский язык, Π½ΠΎ Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° для говорящих Π½Π° французском Π² КанадС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» myapp_fr_CA.qm, ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ использован для Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ fr_CA.