화살표 패드 예제
Qt Linguist 컨텍스트 개념을 이해하고 두 개 이상의 언어를 사용합니다.
애플리케이션에 사용할 수 있는 번역의 수에는 실질적인 제한이 없지만 프랑스어와 네덜란드어 두 가지 번역을 사용합니다.
qmake를 사용하는 경우 arrowpad.pro
의 관련 줄은 다음과 같습니다:
HEADERS = arrowpad.h \ mainwindow.h SOURCES = arrowpad.cpp \ main.cpp \ mainwindow.cpp TRANSLATIONS = arrowpad_fr.ts \ arrowpad_nl.ts
CMake를 사용하는 경우 CMakeLists.txt
의 관련 줄은 다음과 같습니다:
find_package(Qt6 REQUIRED COMPONENTS LinguistTools) qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES fr nl) qt6_add_translations(arrowpad QM_FILES_OUTPUT_VARIABLE qm_files) install(FILES ${qm_files} DESTINATION ${INSTALL_EXAMPLEDIR})
lupdate
을 실행합니다. 그러면 두 개의 동일한 메시지 파일 arrowpad_fr.ts
과 arrowpad_nl.ts
이 생성됩니다. 이 파일에는 tr()
호출 및 해당 컨텍스트와 함께 번역하도록 표시된 모든 소스 텍스트가 포함됩니다.
qmake를 사용하는 경우 lupdate
을 수동으로 실행해야 합니다:
lupdate arrowpad.pro
CMake를 사용하는 경우 update_translations
대상을 빌드하여 lupdate
을 실행합니다:
cmake --build . --target update_translations
Qt 애플리케이션 번역에 대한 자세한 내용은 Qt Linguist 매뉴얼을 참조하세요.
한 줄씩 살펴보기
arrowpad.h
에서 QWidget의 서브클래스인 ArrowPad
서브클래스를 정의합니다. 위의 스크린샷에서 네 개의 버튼이 있는 중앙 위젯은 ArrowPad
입니다.
class ArrowPad : public QWidget { Q_OBJECT
lupdate
을 실행하면 소스 텍스트를 추출할 뿐만 아니라 컨텍스트로 그룹화합니다. 컨텍스트는 소스 텍스트가 표시되는 클래스의 이름입니다. 따라서 이 예에서 "ArrowPad"는 ArrowPad
클래스에 있는 텍스트의 컨텍스트인 컨텍스트입니다. Q_OBJECT
매크로는 ArrowPad
에서 tr(x)
을 다음과 같이 정의합니다:
qApp->translate("ArrowPad", x)
각 소스 텍스트가 어느 클래스에 나타나는지 알면 Qt Linguist 를 사용하면 논리적으로 서로 연관된 텍스트를 그룹화할 수 있습니다(예: 대화 상자의 모든 텍스트가 대화 상자의 클래스 이름 컨텍스트를 가지며 함께 표시됨). 이는 텍스트가 표시되는 컨텍스트가 번역 방법에 영향을 미칠 수 있으므로 번역가에게 유용한 정보를 제공합니다. 일부 번역의 경우 키보드 가속기를 변경해야 할 수 있으며 특정 컨텍스트(클래스)의 모든 소스 텍스트를 함께 그룹화하면 번역가가 충돌 없이 가속기 변경을 더 쉽게 수행할 수 있습니다.
arrowpad.cpp
에서는 ArrowPad
클래스를 구현합니다.
upButton = new QPushButton(tr("&Up")); downButton = new QPushButton(tr("&Down")); leftButton = new QPushButton(tr("&Left")); rightButton = new QPushButton(tr("&Right"));
각 버튼의 레이블은 사용자가 볼 수 있는 텍스트이므로 ArrowPad::tr()
을 호출합니다.
class MainWindow : public QMainWindow { Q_OBJECT
위의 스크린샷에서 전체 창은 MainWindow
. 이는 mainwindow.h
헤더 파일에 정의되어 있습니다. 여기에서도 Q_OBJECT
을 사용하므로 MainWindow
은 Qt Linguist.
arrowPad = new ArrowPad;
MainWindow
, mainwindow.cpp
의 구현에서는 ArrowPad
클래스의 인스턴스를 생성합니다.
exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(QKeySequence(tr("Ctrl+Q", "Quit"))); connect(exitAct, &QAction::triggered, this, &MainWindow::close);
또한 MainWindow::tr()
을 두 번 호출합니다. 한 번은 액션에 대해, 한 번은 바로가기에 대해 호출합니다.
다른 언어에서 다른 키를 지원하려면 tr()
을 사용하세요. 영어로 종료하려면 "Ctrl+Q"를 사용하는 것이 좋지만 네덜란드어 번역기에서는 "Ctrl+A"(Afsluiten)를, 독일어 번역기에서는 "Strg+E"(Beenden)를 사용하는 것이 좋을 수 있습니다. Ctrl 키 가속기에 tr()
을 사용하는 경우, 두 개의 인수 형식과 함께 가속기가 수행하는 기능을 설명하는 두 번째 인수를 사용해야 합니다.
main()
함수는 평소와 같이 main.cpp
에 정의되어 있습니다.
QTranslator translator; if (translator.load(locale, u"arrowpad"_s, u"_"_s)) app.installTranslator(&translator);
현재 로캘에 따라 사용할 번역을 선택합니다. QLocale::system() 예를 들어 LANG
환경 변수를 설정하여 영향을 받을 수 있습니다. .qm
메시지 파일(및 TS 파일)에 로캘을 통합하는 명명 규칙을 사용하면 로캘에 따른 번역 파일 선택을 쉽게 구현할 수 있다는 점에 유의하세요.
선택한 로캘에 대한 QM 메시지 파일이 없는 경우 원본 소스 텍스트가 사용되며 오류가 발생하지 않습니다.
프랑스어 및 네덜란드어로 번역하기
예제 애플리케이션을 프랑스어로 번역하는 것부터 시작하겠습니다. 시작 Qt Linguist 를 arrowpad_fr.ts
으로 시작하면 7개의 소스 텍스트("&Up", "&Left" 등)가 두 개의 컨텍스트("ArrowPad" 및 "MainWindow")로 그룹화되어 있어야 합니다.
이제 다음 번역을 입력합니다:
ArrowPad
- &Up - &Haut
- &Left - &Gauche
- &Right - &Droite
- &Down - &Bas
MainWindow
- E&xit - &Quitter
- Ctrl+Q - Ctrl+Q
- &File - &Fichier
Done & Next 버튼은 번역이 완료된 것으로 표시하고 다음 소스 텍스트로 이동합니다. 각 번역을 입력한 후 단축키(번역 메뉴 모음 참조)를 사용하는 것이 더 빠릅니다.
파일을 저장하고 네덜란드어 작업 시에도 arrowpad_nl.ts
을 사용하여 동일한 작업을 수행합니다:
ArrowPad
- &업 - &옴호그
- 왼쪽 - &링크
- &오른쪽 - &권리
- 아래 - 옴라 &g
MainWindow
- E&xit - &Afsluiten
- Ctrl+Q - Ctrl+A
- 파일 - &저장
tt1_fr.ts
및 tt1_nl.ts
번역 소스 파일을 QM 파일로 변환해야 합니다. 이전에 했던 것처럼 Qt Linguist 을 사용할 수도 있지만, lrelease
명령줄 도구를 사용하면 애플리케이션에 대한 모든 QM 파일을 개별적으로 로드하고 File|Release Qt Linguist.
Type
lrelease arrowpad.pro
를 입력합니다.
cmake --build . --target release_translations
그러면 arrowpad_fr.qm
과 arrowpad_nl.qm
이 모두 생성됩니다.
arrowpad_fr.qm
을 사용하려면 시스템 언어를 프랑스어로 변경합니다. Unix에서는 다음 두 명령 중 하나가 작동합니다:
export LANG=fr setenv LANG fr
Windows 또는 Mac에서는 표시 언어를 프랑스어로 설정합니다.
이제 프로그램을 실행하면 프랑스어 버전이 표시됩니다:
네덜란드어로도 똑같이 시도합니다(Unix에서는 LANG=nl
사용). 이제 네덜란드어 버전이 나타납니다:
연습
번역 중 하나를 Qt Linguist 의 번역 중 하나를 완료되지 않은 것으로 표시합니다(예: "완료" 확인란의 선택을 취소하여 lupdate
, lrelease
, 예제를 실행합니다. 이 변경이 어떤 영향을 미쳤나요?
LANG=fr_CA
(프랑스어 캐나다)를 설정하고 예제 프로그램을 다시 실행합니다. 결과가 LANG=fr
와 동일한 이유를 설명하세요.
네덜란드어 번역에서 가속기 중 하나를 변경하여 &Bestand와 &Boven 사이의 충돌을 제거합니다.
© 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.