트롤 인쇄 예제

이후 릴리스에 대한 번역 업데이트.

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

이 예제에는 포르투갈어 번역이 포함된 번역 파일( trollprint_pt.ts)이 포함되어 있습니다.

동일한 애플리케이션의 두 가지 릴리스를 고려하겠습니다: 트롤 프린트 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") 이 두 번 나오는 것을 주목하세요. "사용"과 "사용 안 함"이 모두 같은 컨텍스트에 나타나므로 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.cppmain() 함수는 화살표 패드 예제의 함수와 동일합니다. 특히 현재 로캘을 기준으로 번역 파일을 선택합니다.

영어와 포르투갈어로 트롤 프린트 1.0 실행하기

제공된 trollprint_pt.ts 파일에 있는 번역을 사용합니다.

LANG 환경 변수를 pt 으로 설정한 다음 trollprint 을 실행합니다. 여전히 영어 버전이 표시되어야 합니다. 이제 lrelease, 예를 들어 lrelease trollprint.pro 을 실행한 다음 예제를 다시 실행합니다. 이제 포르투갈어 버전(트롤 임프리미르 1.0)이 표시되어야 합니다:

번역이 올바르게 표시되었지만 실제로는 잘못된 번역입니다. 올바른 포르투갈어에서는 "사용 가능"의 두 번째는 "Ativado"가 아니라 "Ativadas"여야 하며 "사용 불가능"의 두 번째 번역의 어미도 비슷하게 바뀌어야 합니다.

를 사용하여 trollprint_pt.ts 을 열면 Qt Linguist를 열어 보면 소스 코드에는 각각 두 개가 있지만 번역 소스 파일에는 "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. 이제 두 가지 변경 사항이 표시됩니다.

첫째, 이제 번역 소스 파일에 세 개의 "사용", "사용 안 함" 쌍이 포함됩니다. 첫 번째 쌍은 "(obs.)"로 표시되어 더 이상 사용되지 않음을 나타냅니다. 이는 이 텍스트가 두 개의 인수가 있는 새 호출로 대체된 tr() 호출에 나타났기 때문입니다. 두 번째 쌍은 주석으로 "양면"을, 세 번째 쌍은 주석으로 "색상"을 사용합니다. 주석은 Source text and comments 영역의 Qt Linguist.

둘째, 번역자의 작업을 최소화하기 위해 번역 텍스트 "Ativado"와 "Desativado"가 새로운 "Enabled" 및 "Disabled" 텍스트의 번역으로 자동 사용되었습니다. 물론 이 경우 각 단어의 두 번째 발생에 대해 정확하지는 않지만 좋은 출발점을 제공합니다.

두 번째 "아티바도"를 "아티바다스"로, 두 번째 "데사티바도"를 "데사티바다스"로 변경한 다음 저장하고 종료합니다. lrelease 을 실행하여 최신 바이너리 trollprint_pt.qm 파일을 가져온 다음, 트롤 프린트(또는 트롤 임프리미르)를 실행합니다.

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.cppprintpanel.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.
*/

트롤 인쇄 1.1

이제 트롤 인쇄 1.1 릴리스를 준비하겠습니다. 즐겨 사용하는 텍스트 편집기를 시작하고 다음 단계를 따르세요:

  • printpanel.cpp 에서 "<b>TROLL PRINT</b>"라는 텍스트가 있는 QLabel을 만드는 두 줄의 주석을 해제합니다.
  • 단어 정리: printpanel.cpp 에서 "2-sided"를 "양면"으로 바꿉니다.
  • mainwindow.cpp 에서 "1.0"을 "1.1"로 바꿉니다.
  • mainwindow.cpp 에서 저작권 연도를 1999-2000으로 업데이트합니다.

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

완료되면 lupdate 을 실행한 다음 trollprint_pt.ts 을 열고 Qt Linguist. 다음 항목이 특히 중요합니다:

  • PrintPanel
    • 양면 - "(obs.)"로 표시됨, 폐기됨
    • <b>트롤 인쇄</b> - 표시되지 않음, 즉 번역되지 않음
    • 양면 - 표시되지 않음, 즉 번역되지 않음.

수정 작업을 더 쉽게 하려면 tr("Troll Print 1.0") 대신 tr("Troll Print %1").arg("1.0") 등을 사용하여 모든 릴리스에서 문자열을 업데이트할 필요가 없도록 할 수 있습니다.

MainWindow 에서 번역을 검토하고 이를 "완료"로 표시합니다. "<b>TROLL PRINT</b>"를 "<b>TROLL IMPRIMIR</b>"로 번역합니다. "양면"을 번역할 때는 Guess Again 버튼을 눌러 "양면"을 번역하되 "2"를 "Dois"로 변경합니다.

저장하고 종료한 다음 lrelease 을 실행합니다. 포르투갈어 버전은 다음과 같이 표시됩니다:

Ajuda|Sobre (Help|About)을 선택하여 정보 상자를 확인합니다.

Ajuda|Sobre Qt (Help|About Qt)를 선택하면 영어 대화 상자가 표시됩니다. Oops! Qt 자체를 번역해야 합니다. 자세한 내용은 Qt로 국제화를 참조하십시오.

이제 LANG=en 을 설정하여 원본 영어 버전을 가져옵니다:

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

© 2025 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.