이 페이지에서

트롤 인쇄 예시

향후 릴리스를 위한 번역 업데이트.

Troll Print는 사용자가 프린터 설정을 선택할 수 있게 해주는 예제 애플리케이션입니다. 영어와 포르투갈어 두 가지 버전이 제공됩니다.

영어로 표시된 ‘Troll Print’ 예제 UI를 보여주는 스크린샷

이 예제에 대한 포르투갈어 번역이 포함된 번역 파일( trollprint_pt.ts)을 제공했습니다.

동일한 애플리케이션의 두 가지 릴리스, 즉 Troll Print 1.0과 1.1을 살펴보겠습니다. 한 릴리스를 위해 생성된 번역을 후속 릴리스에서 재사용하는 방법을 배워보겠습니다. (이 튜토리얼에서는 일부 소스 파일을 편집해야 합니다. 모든 파일을 새로운 임시 디렉터리로 복사한 후 그곳에서 작업하는 것이 가장 좋습니다.)

Qt 애플리케이션 번역에 대한 자세한 내용은 Qt Linguist 매뉴얼을 참조하십시오.

줄별 단계별 안내

PrintPanel 클래스는 printpanel.h 에 정의되어 있습니다.

class PrintPanel : public QWidget
{
    Q_OBJECT

PrintPanel 는 QWidget 입니다. tr() 가 제대로 작동하려면 Q_OBJECT 매크로가 필요합니다.

구현 파일은 printpanel.cpp 입니다.

PrintPanel::PrintPanel(QWidget *parent)
    : QWidget(parent)
{
/*
    QLabel *label = new QLabel(tr("<b>TROLL PRINT</b>"));
    label->setAlignment(Qt::AlignCenter);
*/

Troll Print 1.0에서는 코드의 일부가 주석 처리되어 있습니다. 나중에 Troll Print 1.1을 위해 이 주석을 해제하게 될 것입니다.

    twoSidedGroupBox = new QGroupBox(tr("2-sided"));
    twoSidedEnabledRadio = new QRadioButton(tr("Enabled"));
    twoSidedDisabledRadio = new QRadioButton(tr("Disabled"));
    twoSidedDisabledRadio->setChecked(true);

    colorsGroupBox = new QGroupBox(tr("Colors"));
    colorsEnabledRadio = new QRadioButton(tr("Enabled"));
    colorsDisabledRadio = new QRadioButton(tr("Disabled"));

PrintPanel에서 tr("Enabled") 와 tr("Disabled") 가 각각 두 번씩 등장하는 점에 유의하십시오. “Enabled”와 “Disabled”가 모두 같은 문맥에 나타나기 때문에 Qt Linguist 는 각 용어의 출현 횟수 중 하나만 표시하고, 표시되지 않는 중복 항목에는 동일한 번역을 적용합니다. 이는 시간을 절약하는 데 유용하지만, 포르투갈어와 같은 일부 언어의 경우 두 번째 출현 항목에는 별도의 번역이 필요합니다. 곧 Qt Linguist 각 발생처를 모두 표시하여 별도로 번역할 수 있도록 하는 방법을 곧 살펴보겠습니다.

MainWindow 의 헤더 파일인 mainwindow.h 에는 특별한 점이 없습니다. 구현 파일인 mainwindow.cpp 에는 번역 대상으로 표시해야 하는, 사용자에게 표시되는 소스 텍스트가 몇 가지 있습니다.

    setWindowTitle(tr("Troll Print %1").arg(version));

창 제목을 번역해야 합니다.

void MainWindow::createActions()
{
    exitAct = new QAction(tr("E&xit"), this);
    exitAct->setShortcut(tr("Ctrl+Q", "Quit"));
    connect(exitAct, &QAction::triggered, this, &MainWindow::close);

    aboutAct = new QAction(tr("&About"), this);
    aboutAct->setShortcut(Qt::Key_F1);
    connect(aboutAct, &QAction::triggered, this, &MainWindow::about);

    aboutQtAct = new QAction(tr("About &Qt"), this);
    connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
}

void MainWindow::createMenus()
{
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(exitAct);

    menuBar()->addSeparator();

    QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);
}

또한 동작과 메뉴도 번역해야 합니다. tr() 의 두 인자 형식은 키보드 단축키 "Ctrl+Q"에 사용된다는 점에 유의하십시오. 두 번째 인자가 번역자가 해당 단축키가 어떤 기능을 수행할지 파악할 수 있는 유일한 단서이기 때문입니다.

    QTranslator translator;
    if (translator.load(locale, u"trollprint"_s, u"_"_s))
        app.installTranslator(&translator);

main.cpp 에 있는 main() 함수는 Arrow Pad 예제의 함수와 동일합니다. 특히, 이 함수는 현재 로케일에 따라 번역 파일을 선택합니다.

Troll Print 1.0을 영어와 포르투갈어로 실행하기

제공된 trollprint_pt.ts 파일의 번역 내용을 사용할 것입니다.

LANG 환경 변수를 pt 로 설정한 다음, trollprint 를 실행하십시오. 여전히 영어 버전이 표시될 것입니다. 이제 lrelease(예: lrelease trollprint.pro)를 실행한 다음, 예제를 다시 실행하십시오. 이제 포르투갈어 버전(Troll Imprimir 1.0)이 표시되어야 합니다:

포르투갈어로 표시된 트롤 인쇄 UI를 보여주는 스크린샷

번역이 올바르게 표시된 것처럼 보이지만, 사실은 잘못된 것입니다. 올바른 포르투갈어 표현으로 보면, 두 번째로 나오는 “Enabled”는 “Ativado”가 아니라 “Ativadas”여야 하며, “Disabled”의 두 번째 번역에 대한 어미도 마찬가지로 변경되어야 합니다.

trollprint_pt.ts 를 Qt Linguist를 통해 xml-ph-0000@deepl.internal을 열면, 소스 코드에는 각각 두 번씩 등장하지만 번역 소스 파일에는 “Enabled”와 “Disabled”가 각각 한 번씩만 나타나는 것을 확인할 수 있습니다. 이는 Qt Linguist 중복된 원본 텍스트에 대해 동일한 번역을 적용함으로써 번역자의 작업량을 최소화하려고 하기 때문입니다. 이와 같이 동일한 번역이 잘못된 경우, 프로그래머는 중복된 발생 항목 간의 모호성을 해소해야 합니다. 이는 tr() 의 두 인자 형태를 사용하여 쉽게 해결할 수 있습니다.

변경해야 할 텍스트가 나타나는 클래스의 이름이 사실상 번역가의 “컨텍스트”이므로, 어떤 파일을 변경해야 하는지 쉽게 파악할 수 있습니다. 이 경우 해당 파일은 printpanel.cpp 이며, 여기서 변경해야 할 줄이 네 개 있습니다. 첫 번째 라디오 버튼 쌍에 대한 적절한 tr() 호출에 두 번째 인자 “two-sided”를 추가하고,

twoSidedEnabledRadio = new QRadioButton(tr("Enabled", "two-sided"));
twoSidedDisabledRadio = new QRadioButton(tr("Disabled", "two-sided"));

그리고 두 번째 라디오 버튼 쌍에 해당하는 tr() 호출에 두 번째 인자 "colors"를 추가하십시오:

colorsEnabledRadio = new QRadioButton(tr("Enabled", "colors"), colors);
colorsDisabledRadio = new QRadioButton(tr("Disabled", "colors"), colors);

이제 다시 컴파일하고, lupdate 를 실행한 다음 다음 명령을 사용하여 trollprint_pt.ts 를 여십시오: Qt Linguist. 이제 두 가지 변경 사항을 확인할 수 있습니다.

첫째, 번역 소스 파일에 이제 "Enabled", "Disabled" 쌍이 세 개 포함되어 있습니다. 첫 번째 쌍에는 "(obs.)" 표시가 되어 있어 더 이상 사용되지 않음을 나타냅니다. 이는 해당 텍스트가 두 개의 인수를 갖는 새로운 호출로 대체된 tr() 호출에 포함되어 있었기 때문입니다. 두 번째 쌍에는 “two-sided”라는 주석이, 세 번째 쌍에는 “colors”라는 주석이 달려 있습니다. 이 주석들은 Source text and comments 영역에 Qt Linguistxml-ph-0001@deepl.internal 영역에 표시됩니다.

둘째, 번역 텍스트 “Ativado”와 “Desativado”는 번역자의 작업 부담을 줄이기 위해 새로운 텍스트인 “Enabled”와 “Disabled”의 번역으로 자동으로 사용되었습니다. 물론 이 경우 각 단어가 두 번째로 등장할 때는 정확하지 않지만, 좋은 출발점이 됩니다.

두 번째 "Ativado"를 "Ativadas"로, 두 번째 "Desativado"를 "Desativadas"로 변경한 후 저장하고 종료합니다. ` lrelease `를 실행하여 최신 바이너리 ` trollprint_pt.qm ` 파일을 얻은 다음, Troll Print(또는 Troll Imprimir)를 실행합니다.

포르투갈어로 된 트롤 글이 담긴 스크린샷

tr() 의 두 번째 인수는, Qt Linguist, 동일한 맥락(클래스)에서 나타나는 동일한 소스 텍스트를 구별하는 데 사용됩니다. 또한 번역가에게 단서를 제공하는 데 유용하며, Ctrl 키 단축키의 경우 해당 단축키가 수행하는 기능을 번역가에게 전달할 수 있는 유일한 수단이기도 합니다.

번역가를 돕는 또 다른 방법은 번역해야 할 원본 텍스트가 포함된 애플리케이션의 특정 부분으로 이동하는 방법에 대한 정보를 제공하는 것입니다. 이는 번역가가 번역문이 나타나는 맥락을 파악하는 데 도움이 될 뿐만 아니라, 번역문을 찾고 테스트하는 데도 도움이 됩니다. 이는 소스 코드에서 TRANSLATOR 주석을 사용하여 구현할 수 있습니다:

/*
   TRANSLATOR MainWindow

   In this application the whole application is a MainWindow.
   Choose Help|About from the menu bar to see some text
   belonging to MainWindow.

   ...
*/

일부 소스 파일, 특히 대화 상자 클래스에 대화 상자로 이동하는 데 필요한 경로를 설명하는 이러한 주석을 추가해 보십시오. 예제 파일에 추가할 수도 있습니다. 예를 들어, ` mainwindow.cpp ` 및 ` printpanel.cpp ` 파일이 적합합니다. ` lupdate `을 실행한 다음 Qt Linguist 를 실행하고 trollprint_pt.ts 를 불러오세요. 소스 텍스트 목록을 살펴볼 때 Source text and comments 영역에서 주석을 확인할 수 있을 것입니다.

때로는, 특히 대규모 프로그램의 경우, 번역자가 자신의 번역문을 찾고 그 정확성을 확인하기 어려울 수 있습니다. 유용한 탐색 정보를 제공하는 주석은 번역자의 시간을 절약해 줄 수 있습니다:

/*
   TRANSLATOR ZClientErrorDialog

   Choose Client|Edit to reach the Client Edit dialog, then choose
   Client Specification from the drop down list at the top and pick
   client Bartel Leendert van der Waerden. Now check the Profile
   checkbox and then click the Start Processing button. You should
   now see a pop up window with the text "Error: Name too long!".
   This window is a ZClientErrorDialog.
*/

Troll Print 1.1

이제 Troll Print 1.1 버전을 준비해 보겠습니다. 선호하는 텍스트 편집기를 실행하고 다음 단계를 따르세요:

  • printpanel.cpp 파일에서 "<b>TROLL PRINT</b>"라는 텍스트가 포함된 QLabel 를 생성하는 두 줄의 주석 처리를 해제하세요.
  • 문구 정리: printpanel.cpp 파일에서 "2-sided"를 "Two-sided"로 변경하세요.
  • mainwindow.cpp 파일에서 "1.0"이 나오는 모든 곳을 "1.1"로 바꾸십시오.
  • mainwindow.cpp 에서 저작권 연도를 1999-2000으로 업데이트하십시오.

(물론 실제 애플리케이션에서는 버전 번호와 저작권 연도가 const 또는 #define으로 정의될 것입니다.)

trollprint_pt.ts 작업이 완료되면 lupdate 을 실행한 다음, Qt Linguist파일을 엽니다. 다음 항목들이 특히 중요합니다:

  • PrintPanel
    • 2-sided - "(obs.)"로 표시되어 있으며, 더 이상 사용되지 않음
    • <b>TROLL PRINT</b> - 표시 없음, 즉 번역되지 않음
    • 양면 인쇄 - 표시 없음, 즉 번역되지 않음.

수정 작업을 더 쉽게 하기 위해, tr("Troll Print 1.0") 대신 tr("Troll Print %1").arg("1.0")과 같은 형식을 사용하면 매 릴리스마다 문자열을 업데이트할 필요가 없습니다.

MainWindow 에 있는 번역 내용을 검토하고, 해당 항목들을 "완료"로 표시해 주세요. "<b>TROLL PRINT</b>"를 "<b>TROLL IMPRIMIR</b>"로 번역하십시오. "Two-sided"를 번역할 때는 Guess Again 버튼을 눌러 "Two-sided"를 번역하되, "2"를 "Dois"로 변경하십시오.

저장하고 종료한 다음, lrelease 를 실행하세요. 포르투갈어 버전은 다음과 같이 표시되어야 합니다:

포르투갈어로 된 트롤 글씨가 담긴 스크린샷

Ajuda|Sobre (Help|About)를 선택하여 정보 상자를 확인하세요.

Ajuda|Sobre Qt (Help|About Qt)를 선택하면 영어 대화 상자가 나타납니다. 이런! Qt 자체도 번역이 필요합니다. 자세한 내용은 Qt를 이용한 국제화(Internationalization with Qt )를 참조하십시오.

이제 LANG=en 를 설정하여 원래의 영어 버전을 확인하세요:

영어로 된 트롤 인쇄물을 보여주는 스크린샷

code.qt.io의 예제 프로젝트

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.