번역을 위한 소스 코드 작성
애플리케이션을 현지화할 수 있는 방식으로 QML 및 Qt C++ 소스 코드를 작성하세요:
- 번역을 위한 문자열 표시
- 문자열 연결 대신 매개변수 사용하기
- 복수형 처리하기
- 지역 번호 설정 사용
- 날짜, 시간 및 통화 국제화
- 번역 가능한 데이터 텍스트 문자열 표시
- 번역기를 위한 주석 추가
- 동일한 텍스트 모호성 제거
- 키보드 단축키를 번역 가능하게 만들기
- 로캘을 사용하여 현지화 기능 확장
- 번역 활성화
- 동적 언어 변경에 대비하기
C++ 애플리케이션을 개발할 때는 C++ 코드에 대한 추가 고려 사항도 참조하세요.
번역할 문자열 표시
애플리케이션에서 번역해야 하는 대부분의 텍스트는 단일 단어 또는 짧은 구문으로 구성되어 있습니다. 이러한 텍스트는 일반적으로 창 제목, 메뉴 항목, 도구 설명, 버튼, 확인란 및 라디오 버튼에 대한 레이블로 나타납니다.
Qt는 각 창이 생성될 때마다 문구를 번역하여 번역 사용으로 인한 성능 비용을 최소화합니다. 대부분의 애플리케이션에서 메인 창은 한 번만 생성됩니다. 대화 상자는 한 번 생성된 후 필요에 따라 표시되거나 숨겨지는 경우가 많습니다. 초기 번역이 이루어지면 번역된 창에 대한 런타임 오버헤드가 더 이상 발생하지 않습니다. 생성, 소멸 및 이후에 생성되는 창에만 번역 성능 비용이 발생합니다.
런타임에 언어를 전환하는 애플리케이션을 만들 수 있지만 노력이 필요하고 런타임 성능 비용이 발생합니다.
번역 함수를 사용하여 QML 및 C++ 코드에서 번역을 위해 사용자가 볼 수 있는 UI 텍스트를 표시합니다. Qt는 번역 가능한 각 문자열을 연관된 번역 컨텍스트에 따라 색인을 생성합니다. 동일한 구문이 충돌 없이 두 개 이상의 컨텍스트에서 나타날 수 있습니다. 특정 컨텍스트에서 구문이 두 번 이상 발생하면 한 번만 번역되고 컨텍스트 내의 모든 발생에 번역이 적용됩니다.
QML: qsTr() 사용
QML에서는 다음 함수를 사용하여 .qml 파일에서 번역을 위해 사용자가 볼 수 있는 문자열을 표시할 수 있습니다:
- qsTr()
- qsTranslate()
- qsTrId()
일반적으로 qsTr()
함수를 사용합니다:
Text {
id: txt1
text: qsTr("Back")
}
이 코드는 번역 소스(TS) 파일에서 Back을 키 항목으로 만듭니다. 런타임에 번역 시스템은 키워드 Back을 조회한 다음 현재 시스템 로캘에 해당하는 번역 값을 가져옵니다. 결과는 text
속성으로 반환되며 UI에는 현재 로캘에 적합한 Back 번역이 표시됩니다. 번역을 찾을 수 없는 경우 qsTr()
은 원래 문자열을 반환합니다.
번역 컨텍스트는 지정된 파일에 대해 다음과 같이 설정할 수 있습니다:
pragma Translator: ChosenContext
또는
pragma Translator: "Chosen::Context"
qsTranslate()
을 통해 설정된 컨텍스트는 pragma
Translator
을 통해 설정된 컨텍스트보다 우선합니다. QML에서 기본적으로 번역 컨텍스트는 파일 이름입니다.
C++: tr() 사용
C++에서는 tr() 함수를 사용하여 텍스트를 번역 가능한 것으로 표시하고 번역된 텍스트를 표시합니다. 번역 컨텍스트는 문자열이 사용되는 QObject 서브클래스의 이름입니다. 새 QObject 기반 클래스에 대한 번역 컨텍스트를 정의하려면 새 클래스 정의에서 Q_OBJECT 매크로를 사용합니다.
tr()
이 호출되면 번역 활성화에 설명된 대로 애플리케이션 개체에 설치해야 하는 QTranslator 개체를 사용하여 번역 가능한 문자열을 찾습니다.
예를 들어 LoginWidget
이 QWidget 의 하위 클래스라고 가정합니다:
이는 사용자가 볼 수 있는 문자열의 99%를 차지합니다. 문자열 리터럴을 번역 가능으로 표시하는 방법에 대한 자세한 내용은 번역 가능한 데이터 텍스트 문자열 표시하기를 참조하세요.
따옴표로 묶은 텍스트가 QObject 하위 클래스의 멤버 함수에 없는 경우 적절한 클래스의 tr()
함수 또는 QCoreApplication::translate() 함수를 직접 사용하세요:
void some_global_function(LoginWidget *logwid) { QLabel *label = new QLabel( LoginWidget::tr("Password:"), logwid); } void same_global_function(LoginWidget *logwid) { QLabel *label = new QLabel( QCoreApplication::translate("LoginWidget", "Password:"), logwid); }
참고: QT_NO_CAST_FROM_ASCII
매크로를 정의하여 애플리케이션을 컴파일하여 const char *
에서 QString 로의 자동 변환을 비활성화하면 누락된 문자열을 포착할 가능성이 높습니다. 자세한 내용은 QString::fromUtf8() 및 QString::fromLatin1()를 참조하세요.
문자열 연결 대신 매개변수 사용
언어마다 구, 절 및 문장에서 단어를 배열하는 방식이 다르므로 단어와 데이터를 연결하여 문자열을 만들지 마세요. 대신 %
을 사용하여 문자열에 매개변수를 삽입하세요.
예를 들어 After processing file %1, file %2 is next in line
문자열에서 %1
과 %2
은 번호가 매겨진 매개변수입니다. 런타임에 %1
및 %2
은 각각 첫 번째 및 두 번째 파일 이름으로 대체됩니다. 번역에는 동일한 번호의 매개변수가 표시되어야 하지만 반드시 같은 순서로 표시될 필요는 없습니다. 문자열을 독일어로 번역하면 문구가 뒤바뀔 수 있습니다. 예를 들어 Datei %2 wird bearbeitet, wenn Datei %1 fertig ist
. 번역에는 번호가 매겨진 두 매개 변수가 모두 표시되지만 순서는 반대로 표시됩니다.
QML: .arg() 사용
다음 QML 스니펫에는 %1
과 %2
이라는 두 개의 숫자 매개 변수가 있는 문자열이 있습니다. 이 매개변수는 .arg()
함수와 함께 삽입됩니다.
Text { text: qsTr("File %1 of %2").arg(counter).arg(total) }
%1
는 첫 번째 매개 변수를 참조하고 %2
는 두 번째 매개 변수를 참조하므로 이 코드는 다음과 같은 출력을 생성합니다: 파일 2 중 3.
C++: QString::arg() 사용
C++에서는 QString::arg() 함수를 사용하여 매개변수를 대체할 수 있습니다:
void FileCopier::showProgress(int done, int total, const QString ¤tFile) { label.setText(tr("%1 of %2 files copied.\nCopying: %3") .arg(done) .arg(total) .arg(currentFile)); }
이 코드는 다음과 같은 출력을 생성합니다: 파일 10개 중 5개 복사됨. 복사 중: somefile.txt.
복수형 처리하기
번역 함수에 추가 정수 매개변수(n)를 전달하고 번역 가능한 각 문자열에 복수형에 대한 특수 표기법(%n
)을 사용할 수 있습니다.
n의 값에 따라 번역 함수는 대상 언어에 맞는 올바른 문법 번호를 사용하여 다른 번역을 반환합니다. 또한 %n
이 나타나면 n의 값으로 대체됩니다.
예를 들어 %n message(s) saved
문자열의 영어 및 프랑스어 번역에는 서로 다른 복수형이 필요합니다.
n | 번역 없음 | 프랑스어 | 영어 |
---|---|---|---|
0 | "저장된 메시지 0개" | "0 메시지 저장됨" | "저장된메시지 0개" |
1 | "1 메시지(들) 저장됨" | "1 메시지 저장됨" | "메시지 1개 저장됨" |
2 | "2 메시지(들) 저장됨" | "2메시지 저장됨" | "저장된메시지 2개" |
37 | "37개의 메시지가 저장됨" | "37개의메시지 저장됨" | "37개의메시지가 저장됨" |
이 관용구는 이중 형태와 같이 복수형이 여러 개 있는 대상 언어에서도 작동합니다. 또한 이 관용구는 프랑스어와 같이 단수가 필요한 언어의 경우 == 0
대소문자를 올바르게 처리합니다.
Qt Linguist 및 lrelease
에서 복수형이 포함된 문자열을 번역하는 데 사용하는 규칙에 대한 요약은 복수형에 대한 번역 규칙을 참조하세요.
모국어에서 복수형을 처리하려면 이 언어에 대한 TS 파일도 로드하세요. lupdate
도구 -pluralonly
명령줄 옵션을 사용하여 복수형이 포함된 항목만 포함된 TS 파일을 만듭니다.
또는 lconvert
도구의 -pluralonly
명령줄 옵션을 사용하여 기존 TS 파일에서 복수형이 아닌 모든 형식을 제거할 수 있습니다.
QML 예제
다음 QML 코드 스니펫은 소스 텍스트를 올바른 복수형으로 변환하고 %n
을 total
의 값으로 바꿉니다:
Text { text: qsTr("%n message(s) saved", "", total) }
C++ 예제
다음 C++ 코드 스니펫은 %n
을 count()
함수가 반환하는 값으로 바꿉니다:
int n = messages.count(); showMessage(tr("%n message(s) saved", "", n));
지역 번호 설정 사용
매개변수를 지정할 때 %L
수정자를 포함하면 현재 지역 설정에 따라 번호가 현지화됩니다. 변환은 사용자가 설정한 경우 기본 로캘을, 그렇지 않으면 시스템 전체 로캘을 사용합니다.
QML: %L 사용
예를 들어 다음 QML 스니펫에서 %L1
은 현재 선택한 로캘(지리적 영역)의 숫자 서식 규칙에 따라 첫 번째 매개변수의 서식을 지정합니다:
Text { text: qsTr("%L1").arg(total) }
total
이 숫자 4321.56인 경우 영어 지역 설정(로캘)을 사용하면 출력은 4,321.56이 되고 독일어 지역 설정에서는 4.321,56이 됩니다.
C++: Ln 사용
C++에서는 %Ln
을 사용하여 n
의 현지화된 표현을 생성할 수 있습니다. QLocale::setDefault()을 사용하여 기본 로캘을 설정할 수 있습니다.
날짜, 시간 및 통화 국제화하기
현지에서 선호하는 형식을 사용하여 날짜, 시간 및 통화를 표시합니다.
QML: QtQml 함수 사용
QML에는 날짜 및 시간 서식을 지정하기 위한 특별한 문자열 내 수정자가 없습니다. 대신 현재 로캘(지리적 영역)을 쿼리하고 Date 의 메서드를 사용하여 문자열의 서식을 지정해야 합니다.
Qt.locale()
메서드는 로캘에 대한 정보가 포함된 Locale 객체를 반환합니다. 특히 Locale.name 속성에는 현재 로캘의 언어와 국가가 포함되어 있습니다. 값을 그대로 사용하거나 구문 분석하여 현재 로캘에 적합한 콘텐츠를 결정할 수 있습니다.
다음 코드 조각은 Date()
를 사용하여 현재 날짜와 시간을 가져온 다음 이를 현재 로캘에 맞는 문자열로 변환합니다. 그런 다음 적절한 번역을 위해 %1
매개변수에 날짜 문자열을 삽입합니다.
Text { text: qsTr("Date %1").arg(Date().toLocaleString(Qt.locale())) }
통화 번호를 현지화하려면 Number 유형을 사용합니다. 이 유형은 숫자를 현지화된 통화 문자열로 변환하는 Date
유형과 유사한 기능을 가지고 있습니다.
C++: QLocale 클래스 사용
C++에서는 QLocale::timeFormat() 또는 QLocale::toString(QTime) 또는 toString(QDate)
을 사용합니다:
QLabel *label = new QLabel(this); label->setText(tr("Date %1").arg(QLocale().toString(QDate::currentDate()));
번역 가능한 데이터 텍스트 문자열 표시
_NoOp
함수(QML)와 _NOOP
매크로(C++)를 사용하여 lupdate
도구에서 추출할 수 있도록 번역 가능한 문자열 리터럴을 표시합니다.
QML: _NOOP 함수 사용
QML에서는 다음 함수를 사용하여 번역 가능한 문자열 리터럴을 표시합니다:
사용자가 재부팅하지 않고 시스템 언어를 변경하는 경우 시스템에 따라 배열 및 목록 모델과 기타 데이터 구조의 문자열이 자동으로 새로 고쳐지지 않을 수 있습니다. UI에 표시될 때 텍스트를 강제로 새로 고치려면 QT_TR_NOOP()
함수를 사용하여 문자열을 선언해야 합니다. 그런 다음 표시할 개체를 채울 때 각 텍스트에 대한 번역을 명시적으로 검색해야 합니다.
예를 들어
ListModel { id: myListModel ListElement { //: Capital city of Finland name: QT_TR_NOOP("Helsinki") } } ... Text { text: qsTr(myListModel.get(0).name) // Get the translation of the name property in element 0 }
C++: NOOP 매크로 사용
함수 외부에서 완전히 번역 가능한 텍스트의 경우 문맥 없이 텍스트만 확장하는 QT_TR_NOOP() 및 QT_TRANSLATE_NOOP() 매크로를 사용합니다.
QT_TR_NOOP()
의 예
QString FriendlyConversation::greeting(int type) { static const char *greeting_strings[] = { QT_TR_NOOP("Hello"), QT_TR_NOOP("Goodbye") }; return tr(greeting_strings[type]); }
QT_TRANSLATE_NOOP()
의 예시:
static const char *greeting_strings[] = { QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"), QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye") }; QString FriendlyConversation::greeting(int type) { return tr(greeting_strings[type]); } QString global_greeting(int type) { return QCoreApplication::translate("FriendlyConversation", greeting_strings[type]); }
번역자를 위한 댓글 추가
번역 가능한 것으로 표시한 문자열 앞에 소스 코드에 주석을 추가하여 그 용도를 명확히 할 수 있습니다. 이 댓글은 번역가에게 전달하는 TS 파일에 포함됩니다.
참고: TS 파일은 소스 텍스트와 번역된 텍스트의 위치가 포함된 XML 파일입니다. 업데이트된 TS 파일은 바이너리 번역 파일로 변환되어 최종 애플리케이션의 일부로 포함됩니다.
QML: //: 및 //~ 사용
다음 코드 스니펫에서 //:
줄의 텍스트는 번역기의 기본 주석입니다.
//~
줄의 텍스트는 선택적 추가 정보입니다. 텍스트의 첫 단어는 TS 파일의 XML 요소에서 추가 식별자로 사용되므로 첫 단어가 문장의 일부가 아닌지 확인하세요. 예를 들어, 컨텍스트 백스텝과 관련이 없음 주석은 TS 파일에서 <extra-Context>Not related to back-stepping
로 변환됩니다.
Text { id: txt1; // This UI string is only used here //: The back of the object, not the front //~ Context Not related to back-stepping text: qsTr("Back"); }
C++: 댓글 문자 사용
C++에서 주석을 추가하려면 코드의 tr()
호출에 //:
형식의 주석을 추가하거나 주석의 시작과 끝을 표시하여 주석을 달면 됩니다.
다음 예에서는 각 호출의 컨텍스트에서 tr()
에 전달된 문자열과 주석이 연결되어 있습니다:
//: This name refers to a host name. hostNameLabel->setText(tr("Name:")); /*: This text refers to a C++ code example. */ QString example = tr("Example");
선택적 댓글을 추가하려면 다음을 사용합니다:
//~ <field name> <field contents>
필드 이름은 도메인 접두사(필드에서 영감을 얻은 파일 형식의 기존 파일 확장자), 하이픈, 밑줄로 구분된 표기법의 실제 필드 이름으로 구성되어야 합니다. TS 파일에 저장하는 경우, 필드 이름과 접두사 extra-
를 합쳐서 XML 요소 이름을 구성합니다. 필드 콘텐츠는 XML 이스케이프 처리되지만, 그렇지 않으면 요소의 콘텐츠 그대로 표시됩니다. 각 메시지에 고유한 필드를 얼마든지 추가할 수 있습니다.
예시:
//: This is a comment for the translator. //= qtn_foo_bar //~ loc-layout_id foo_dialog //~ loc-blank False //~ magic-stuff This might mean something magic. QString text = MyMagicClass::tr("Sim sala bim.");
C++에서는 등호 기호를 사용하여 고유 식별자를 추가합니다:
//= <id>
번역가 댓글에는 번역가라는 키워드를 사용할 수 있습니다. 번역자 키워드 바로 앞에 나타나는 메타데이터는 전체 TS 파일에 적용됩니다.
동일한 텍스트의 모호성 제거
번역 시스템은 동일한 텍스트를 여러 번 번역할 필요가 없도록 UI 텍스트 문자열을 고유한 항목으로 통합합니다. 그러나 텍스트가 다른 텍스트와 동일하게 보이지만 다른 의미를 가질 수 있습니다. 예를 들어, 영어에서 back은 한 걸음 뒤로 물러나는 것을 의미하기도 하고 물체의 앞쪽 반대쪽 부분을 의미하기도 합니다. 번역 시스템에 이 두 가지 의미를 알려주어야 번역기가 두 개의 개별 번역을 만들 수 있습니다.
QML: qsTr()에 모호성 해제자 추가하기
QML에서 qsTr()
함수의 두 번째 매개 변수로 모호한 문자열을 추가합니다.
다음 코드 스니펫에서 not front
ID는 이 Back 텍스트를 뒤로 물러나는 Back 텍스트와 구분합니다:
Text { id: txt1 // This UI string is used only here //: The back of the object, not the front //~ Context Not related to back-stepping text: qsTr("Back", "not front") }
C++: tr()에 모호성 해제자 추가하기
C++에서는 tr() 호출에 모호한 문자열을 전달합니다.
다음 코드 스니펫에서 recipient
ID는 수신자의 이름과 발신자의 이름을 구분합니다:
MyWindow::MyWindow() { QLabel *senderLabel = new QLabel(tr("Name:")); QLabel *recipientLabel = new QLabel(tr("Name:", "recipient")); ...
키보드 단축키를 번역 가능하게 만들기
가장 일반적인 형태인 키보드 단축키는 특정 작업을 수행하기 위해 누르는 키의 조합을 말합니다. standard shortcuts 의 경우 표준 키를 사용하여 각 바로 가기에 연결된 플랫폼별 키 시퀀스를 요청합니다.
사용자 지정 바로 가기의 경우 Ctrl+Q 또는 Alt+F와 같이 사람이 읽을 수 있는 문자열을 사용합니다. 다른 언어의 사용자를 위해 적절한 단축키로 번역할 수 있습니다.
애플리케이션에서 키보드 단축키를 하드 코딩한 경우 번역기가 이를 재정의할 수 없습니다.
메뉴 항목 및 버튼 텍스트에 키보드 단축키를 사용하는 경우 밑줄로 표시된 니모닉 문자는 밑줄이 그어진 문자와 함께 Alt 또는 Ctrl을 누르면 메뉴 항목을 클릭하거나 버튼을 누르는 것과 동일한 동작이 수행됨을 나타냅니다.
예를 들어 애플리케이션에서 File 메뉴의 니모닉 문자로 F를 사용하는 경우가 많으므로 메뉴 항목을 클릭하거나 Alt+F를 눌러 메뉴를 열 수 있습니다. 번역 가능한 문자열("파일")에 니모닉 문자를 정의하려면 앞에 앰퍼샌드( "&File"
)를 붙입니다. 문자열의 번역에도 앰퍼샌드가 있어야 하며, 가급적이면 같은 문자 앞에 앰퍼샌드가 있어야 합니다.
QML 예제
QML:
Menu { id: fileMenu title: qsTr("&File") MenuItem { objectName: "quitMenuItem" text: qsTr("E&xit") onTriggered: Qt.quit() } }
C++: QKeySequence 클래스 사용
C++에서는 QAction 및 QKeySequence 객체를 사용하여 작업을 트리거하는 키보드 단축키를 지정합니다:
exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcuts(QKeySequence::Quit);
키보드 단축키의 번역은 QShortcut 컨텍스트와 연관됩니다.
로캘을 사용하여 현지화 기능 확장하기
지역마다 다른 그래픽이나 오디오가 더 적합할 수 있습니다.
일반적으로 이미지 현지화는 피하세요. 지역적 말장난이나 과장된 은유에 의존하기보다는 전 세계적으로 적합한 아이콘을 만드세요. 그러나 아랍어 및 히브리어 로캘의 경우 왼쪽과 오른쪽을 가리키는 화살표 이미지를 반대로 바꿔야 할 수도 있습니다.
로캘은 기본 파일 선택기 중 하나이므로 파일 선택을 사용하여 시스템 로캘에 따라 리소스로 제공하는 이미지를 다르게 표시할 수 있습니다.
다음 섹션의 QML 및 C++ 코드 예제에서는 애플리케이션 리소스에 다음 파일을 제공하고 언어 및 국가 코드를 하위 폴더 이름으로 사용한다고 가정합니다:
images ├── language-icon.png ├── +en_GB │ └── language-icon.png └── +fi_FI └── language-icon.png
QML: 이미지 소스 설정
다음 QML 코드 스니펫은 현재 로캘에 따라 아이콘 소스 이미지를 선택하는 방법을 보여줍니다:
icon.source: "qrc:/images/language-icon.png"
C++: QFileSelector 사용
다음 C++ 코드 스니펫은 QFileSelector 을 사용하여 시스템 로캘에 따라 images
폴더에서 언어 아이콘을 선택합니다:
const QFileSelector selector; const QIcon languageIcon(selector.select(":/images/language-icon.png"));
번역 활성화
TS 파일 이름에는 ISO 언어 및 국가 코드가 포함되어야 합니다:
예를 들어 qml_de.ts
은 대상 언어를 독일어로 설정하고 qml_de_CH.ts
은 대상 언어를 독일어로, 대상 국가를 스위스로 설정합니다. lrelease
도구는 시스템 로캘에 따라 애플리케이션이 로드하는 qml_de.qm
및 qml_de_CH.qm
이라는 QM 파일을 생성합니다.
QML: QQmlApplicationEngine 사용
QML에서는 QQmlApplicationEngine 을 사용하여 기본 QML 파일이 포함된 디렉터리의 i18n
이라는 하위 디렉터리에서 번역 파일을 자동으로 로드합니다. 번역 파일 이름에는 qml_
접두사가 있어야 합니다. 예를 들어 qml_en_US.qm
입니다.
애플리케이션은 QJSEngine::uiLanguage 또는 Qt.uiLanguage 속성 값이 변경되면 번역을 다시 로드합니다.
C++: QTranslator 사용
C++에서는 TS 파일 이름에 애플리케이션 이름이 포함되어야 합니다. 예: app_de_DE.ts
.
일반적으로 Qt C++ 애플리케이션의 main()
함수는 다음과 같습니다:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator myappTranslator; if (myappTranslator.load(QLocale::system(), u"myapp"_s, u"_"_s, u":/i18n"_s)) app.installTranslator(&myappTranslator); return app.exec(); }
번역 인식 애플리케이션의 경우 QTranslator 객체를 생성하고, 런타임에 사용자의 UI 표시 로케일에 따라 load 번역을 생성한 다음 번역기 객체를 애플리케이션에 설치합니다.
동적 언어 변경에 대비하기
Qt Widgets 와 Qt Quick 는 모두 Qt의 이벤트 시스템을 사용하여 번역 변경에 대해 클래스에 알립니다.
LanguageChange 이벤트는 QCoreApplication::installTranslator() 함수를 사용하여 새 번역을 설치할 때 게시됩니다. 다른 애플리케이션 컴포넌트도 Item 유형에서 파생된 위젯이나 QML 유형이 LanguageChange
이벤트를 게시하여 스스로 업데이트하도록 강제할 수 있습니다.
기본적으로 LanguageChange
이벤트는 모든 최상위 창으로 전파되며, 거기서부터 Item에서 파생된 위젯 또는 QML 유형의 전체 트리를 통해 전파됩니다.
Qt Widgets: changeEvent 재정의
QWidget 서브클래스의 기본 이벤트 핸들러는 QEvent::LanguageChange 이벤트에 응답하고 필요할 때 changeEvent()
함수를 호출합니다.
Qt 위젯이 설치된 QTranslator 객체의 변경 사항을 인식하도록 하려면 위젯의 changeEvent() 함수를 재구현하여 이벤트가 LanguageChange 이벤트인지 확인하고 tr() 함수를 사용하여 위젯이 표시하는 텍스트를 업데이트합니다. 예를 들어
void MyWidget::changeEvent(QEvent *event) { if (event->type() == QEvent::LanguageChange) { titleLabel->setText(tr("Document Title")); ... okPushButton->setText(tr("&OK")); } else QWidget::changeEvent(event); }
Qt Widgets Designer UI 파일(.ui) 및 uic
을 사용하는 경우 새 번역 파일을 읽고 ui.retranslateUi(this)
을 직접 호출할 수 있습니다:
void MyWidget::changeEvent(QEvent *event) { if (event->type() == QEvent::LanguageChange) { ui.retranslateUi(this); } else QWidget::changeEvent(event); }
다른 변경 이벤트를 전달하려면 함수의 기본 구현을 호출하세요.
LocaleChange 이벤트에 대한 응답으로 설치된 번역기 목록이 변경되거나 애플리케이션에서 사용자가 현재 애플리케이션 언어를 변경할 수 있는 UI를 제공할 수 있습니다.
QML: 항목에서 파생된 유형에 대한 이벤트 재정의
사용자 지정 C++ 등록 유형이 없는 일반 QML 애플리케이션의 경우 QQmlApplicationEngine을 사용하면 모든 번역 바인딩의 업데이트를 트리거하는 것으로 충분합니다.
그러나 QQuickItem 에서 파생된 유형을 등록했는데 해당 속성 중 하나가 번역된 텍스트를 노출하는 경우(또는 다른 언어에 따라 달라짐) event method 을 재정의하고 해당 속성의 변경 신호를 내보냅니다(또는 바인딩 가능한 속성의 경우 notify 호출). 예를 들어
class MyItem : public QQuickItem { Q_OJBECT QML_ELEMENT Q_PROPERTY(QString greeting READ greeting NOTIFY greetingChanged) public signals: void greetingChanged(); public: QString greeting() const { return tr("Hello World!"); } bool event(QEvent *ev) override { if (ev->type() == QEvent::LanguageChange) emit greetingChanged(); return QQuickItem::event(ev); } };
이렇게 하면 해당 프로퍼티가 사용되는 QML의 모든 바인딩이 재평가되고 언어 변경이 고려됩니다.
일반 QObject 파생 클래스: 이벤트 필터 사용
일부 클래스는 QWidget 또는 QQuickItem 에서 파생되지 않았지만 여전히 언어 변경 이벤트를 처리해야 할 수 있습니다. 이 경우 QCoreApplication 에 이벤트 필터를 설치하세요.
class CustomObject : public QObject { Q_OBJECT public: QList<QQuickItem *> managedItems; CustomObject(QOject *parent = nullptr) : QObject(parent) { QCoreApplication::instance()->installEventFilter(this); } bool eventFilter(QObject *obj, QEvent *ev) override { if (obj == QCoreApplication::instance() && ev->type() == QEvent::LanguageChange) { for (auto item : std::as_const(managedItems)) QCoreApplication::sendEvent(item, ev); // do any further work on reaction, e.g. emit changed signals } return false; } };
이는 나중에 사용자 인터페이스에 표시되는 번역된 문자열(예: 사용자 정의 item model)을 클래스에서 제공하거나 클래스가 위젯 또는 퀵 아이템의 컨테이너 역할을 하여 이벤트를 전달할 책임이 있는 경우에 필요할 수 있습니다.
C++ 코드에 대한 추가 고려 사항
다음 섹션에는 번역 가능한 애플리케이션에서 Qt C++ 클래스 및 함수를 사용하는 방법에 대한 자세한 정보가 포함되어 있습니다:
모든 사용자 표시 텍스트에 QString 사용
QString 은 내부적으로 유니코드 인코딩을 사용하므로 익숙한 텍스트 처리 연산을 사용하여 전 세계의 모든 언어를 투명하게 처리할 수 있습니다. 또한 사용자에게 텍스트를 표시하는 모든 Qt 함수는 QString 객체를 파라미터로 사용하기 때문에 char *
에서 QString 로의 변환 오버헤드가 없습니다.
번역 컨텍스트 정의
QObject 및 각 QObject 서브클래스의 번역 컨텍스트는 클래스 이름 자체입니다. QObject 을 서브클래싱하는 경우 클래스 정의에서 Q_OBJECT 매크로를 사용하여 번역 컨텍스트를 재정의합니다. 이 매크로는 컨텍스트를 하위 클래스의 이름으로 설정합니다.
예를 들어 다음 클래스 정의에는 Q_OBJECT 매크로가 포함되어 있어 MainWindow
컨텍스트를 사용하는 새로운 tr()
함수를 구현합니다:
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); ...
클래스 정의에서 Q_OBJECT 을 사용하지 않으면 기본 클래스에서 컨텍스트가 상속됩니다. 예를 들어, Qt의 모든 QObject 기반 클래스는 컨텍스트를 제공하므로 Q_OBJECT 매크로 없이 정의된 새로운 QWidget 서브클래스는 tr()
함수를 호출할 경우 QWidget
컨텍스트를 사용합니다.
Qt가 아닌 클래스 번역하기
QObject 을 상속하지 않거나 Q_OBJECT 매크로를 사용하지 않는 클래스의 문자열에 대해서는 lupdate
에 추가 정보를 제공해야 합니다. Qt XML이 아닌 클래스에 번역 지원을 추가하려면 Q_DECLARE_TR_FUNCTIONS() 매크로를 사용하면 됩니다. 예를 들어
class MyClass { Q_DECLARE_TR_FUNCTIONS(MyClass) public: MyClass(); ... };
이렇게 하면 클래스와 관련된 문자열을 번역하는 데 사용할 수 있는 tr() 함수가 클래스에 제공되고 lupdate
에서 소스 코드에서 번역 가능한 문자열을 찾을 수 있습니다.
또는 lupdate
및 Qt Linguist 에서 인식하는 특정 컨텍스트를 사용하여 QCoreApplication::translate() 함수를 호출할 수도 있습니다.
QObject 서브클래스 외부에 있는 텍스트 번역하기
인용된 텍스트가 QObject 서브클래스의 멤버 함수에 없는 경우 적절한 클래스의 tr()
함수 또는 QCoreApplication::translate() 함수를 직접 사용합니다:
void some_global_function(LoginWidget *logwid) { QLabel *label = new QLabel( LoginWidget::tr("Password:"), logwid); } void same_global_function(LoginWidget *logwid) { QLabel *label = new QLabel( QCoreApplication::translate("LoginWidget", "Password:"), logwid); }
© 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.