텍스트 ID 기반 번역
텍스트 ID 번역 메커니즘은 국제화 및 로컬라이제이션을 위한 산업적 강점 시스템입니다. 애플리케이션의 각 텍스트에는 텍스트 대신 소스 코드에서 사용하는 고유 식별자(텍스트 ID)가 있습니다. 따라서 많은 수의 번역된 텍스트를 훨씬 쉽게 관리할 수 있습니다.
텍스트 ID로 국제화하기
일반 텍스트 대신 텍스트 ID를 사용하는 경우 애플리케이션을 국제화하는 일반적인 방법은 동일하지만 세부 사항은 약간 다릅니다:
- 텍스트 ID 기반 번역 시스템의 기능과 매크로는 일반 텍스트 시스템과 다릅니다. qsTr() 대신 qsTrId() 함수를, QT_TR_NOOP() 대신 QT_TRID_NOOP() 매크로를, QT_TR_N_NOOP() 대신 QT_TRID_N_NOOP() 매크로를 사용합니다.)
- 일반 텍스트 문자열 대신 텍스트 ID를 사용자 인터페이스 문자열로 사용합니다. 예를 들어
qsTrId("id-back-not-front")
- 텍스트 ID로 컨텍스트 매개변수를 지정할 수 없으므로 철자가 같지만 의미가 다른 단어는 별도의 텍스트 ID가 필요합니다. 예를 들어
qsTrId("id-back-backstep")
은 뒤로 가기( Back)와 뒤로 가기(id-back-not-front
)를 구분합니다. - 텍스트 ID 기반 번역에는 컨텍스트 이름이 허용되지 않으므로 Qt Linguist 에는 컨텍스트 이름 없이 파일에 있는 ID가 나열됩니다.
- 개발 빌드용 사용자 인터페이스에 표시되는 엔지니어링 영어 텍스트는
//%
주석으로 표시됩니다. 이 코멘트를 포함하지 않으면 사용자 인터페이스에 텍스트 ID가 표시됩니다. 이것은 매개 변수가 있는 텍스트가 있을 때 특히 중요합니다.//%
댓글은 문자열에 매개변수 표시기를 포함해야 합니다. 예를 들어//% "Number of files: %1"
- 번역기에 추가 정보를 제공하는
//:
주석은 일반 텍스트 시스템에서는 선택 사항입니다. 그러나 텍스트 ID 기반 시스템에서는 이 추가 정보가 없으면 텍스트 ID만 있고 번역가가 추가 컨텍스트 없이는 이를 통해 합리적인 번역을 하지 못할 수 있으므로 이 추가 정보는 필수입니다. 설명이 긴 텍스트 ID를 사용하고 코멘트를 사용하지 않을 수도 있지만, 코멘트가 있는 것이 더 이해하기 쉬운 경우가 많습니다.
아래의 나란한 코드 스니펫은 텍스트 ID 기반 번역과 일반 텍스트 기반 번역을 비교한 것입니다:
텍스트 ID 기반 | 일반 텍스트 기반 |
---|---|
Text { id: backTxt; //: The back of the object, not the front //% "Back" //~ Context Not related to back-stepping text: qsTrId("id-back-not-front"); } | Text { id: backTxt; //: The back of the object, not the front //~ Context Not related to back-stepping text: qsTr("Back","Not front") } |
텍스트 ID를 사용한 로컬라이제이션
텍스트 ID를 사용한 로컬라이제이션은 일반 텍스트와 거의 동일한 프로세스를 따릅니다.
업데이트 도구를 사용하여 번역을 추가할 TS 파일을 생성합니다. 번역 파일의 소스 값은 일반 텍스트가 아닌 텍스트 ID가 되므로 번역의 정확성을 보장하기 위해 설명적인 텍스트 ID나 좋은 추가 주석 또는 둘 다 필요합니다.
위의 텍스트 ID 기반 사용자 인터페이스 텍스트 예시에서는 .ts 파일에 다음과 같은 콘텐츠가 생성됩니다:
<message id="id-back-not-front"> <source>Back</source> <extracomment>The back of the object, not the front</extracomment> <translation type="unfinished"></translation> <extra-Context>Not related to back-stepping</extra-Context> </message>
주어진 텍스트에 사용할 수 있는 번역이 없는 경우(일반적으로 개발 후반부까지) 사용자 인터페이스에 적절한 텍스트가 아닌 텍스트 ID가 표시됩니다. 애플리케이션을 테스트에 더 유용하게 사용하기 위해 lrelease
엔지니어링 영어 소스 텍스트( //%
댓글의)를 번역 텍스트로 사용하고 느낌표(!)와 같은 표시를 하면 아직 번역되지 않은 텍스트를 볼 수 있도록 할 수 있습니다.
ID 기반 번역 그룹화하기
각 ID 기반 번역에 레이블을 할당하여 대규모 프로젝트의 ID 기반 항목을 더 작은 그룹으로 정리할 수 있습니다. ID 기반 항목에 레이블을 할당하려면 예를 들어 C++에서 레이블 이름을 지정하는 //@
주석을 추가합니다:
//% "Open file" //@ FileOperations qtTrId("msg.open");
또는 QML에서:
//% "Open file" //@ FileOperations qsTrId("msg.open");
에서 TS 파일을 열면 Qt Linguist에서 라벨이 같은 ID 기반 항목은 문맥에 따라 그룹화되는 텍스트 기반 항목과 유사하게 함께 그룹화됩니다. 레이블이 없는 항목은 <unnamed label>
아래에 나타납니다.
참고: 레이블 이름은 조회나 고유성에 영향을 미치지 않습니다: ID는 전 세계적으로 고유하게 유지되며 레이블을 참조하지 않고도 qtTrId("msgid")
을 통해 계속 로드할 수 있습니다. 레이블 태그는 번역기의 탐색을 개선하는 데만 사용되며 런타임 동작을 변경하지 않습니다.
CMake 구성
CMake로 빌드할 때는 .ts 파일에 접두사 qml_
를 사용합니다. 예를 들어, qml_en.ts
. CMakeLists.txt 파일에서 *.ts 파일을 TS_FILES
의 값으로 나열하는 qt_add_translations 함수를 추가하고 프로젝트의 main.qml 파일의 URI에 RESOURCE_PREFIX 값을 /i18n으로 설정합니다:
qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts RESOURCE_PREFIX Main/i18n )
qmake를 사용한 고급 사용
많은 로캘을 대상으로 하는 프로젝트의 경우 .pro 파일에서 번역 정보를 제거하고 대신 별도의 스크립트로 번역을 관리할 수 있습니다. 이 스크립트는 원하는 각 대상에 대해 lrelease
및 lupdate
을 호출할 수 있습니다.
업데이트는 다음과 같이 스크립트로 작성할 수 있습니다:
lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts ...
최종 .qm 파일 생성은 다음과 같이 스크립팅할 수 있습니다:
lrelease <project-dir>/i18n/myapp-text_en_GB.ts lrelease <project-dir>/i18n/myapp-text_en_US.ts ...
© 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.