개요
Qt GUI 프로그램을 만들 때 버튼 클릭으로 프로그램의 언어를 바꾸기 위해서 진행하였다.
Qt에는 Linguist라는 툴을 제공하기 때문에 쉽게 다국어 기능을 구현할 수 있다.
사용 환경
VMware - Ubuntu 22.04 64bit
과정
1. qttools 모듈 다운로드
cd ~/qt6/src
wget https://download.qt.io/official_releases/qt/6.5/6.5.1/submodules/qttools-everywhere-src-6.5.1.tar.xz
tar xf qttools-everywhere-src-6.5.1.tar.xz
2. 빌드 디렉토리 생성 및 구성
mkdir -p ~/qt6/host-build/qttools
cd ~/qt6/host-build/qttools
$HOME/qt6/host/bin/qt-configure-module ../../src/qttools-everywhere-src-6.5.1
cmake --build . --parallel 8
cmake --install .
3. 경로 지정
- 현재 터미널 세션에서 바로 실행
export PATH=~/qt6/host/bin:$PATH
이후 같은 터미널 세션에서 lupdate, lrelease, linguist 등을 경로 지정 없이 사용할 수 있다.
- 영구적으로 적용
export PATH=~/qt6/host/bin:$PATH
source ~/.bashrc
매번 터미널을 열 때마다 명령어를 실행하기 싫다면 해당 명령어를 쉘 초기화 파일(~.bashrc)에 추가하면 된다.
4. LanguageManager 클래스 생성
#ifndef LANGUAGEMANAGER_H
#define LANGUAGEMANAGER_H
#include <QObject>
#include <QTranslator>
#include <QGuiApplication>
class LanguageManager : public QObject
{
Q_OBJECT
Q_PROPERTY(QString currentLanguage READ currentLanguage WRITE setCurrentLanguage NOTIFY languageChanged)
public:
explicit LanguageManager(QGuiApplication *app, QObject *parent = nullptr)
: QObject(parent), m_app(app), m_currentLanguage("ko_KR"), m_translator(nullptr)
{
loadLanguage(m_currentLanguage);
}
QString currentLanguage() const { return m_currentLanguage; }
public slots:
void setCurrentLanguage(const QString &language) {
if (m_currentLanguage != language) {
loadLanguage(language);
m_currentLanguage = language;
emit languageChanged();
}
}
signals:
void languageChanged();
private:
void loadLanguage(const QString &language) {
// 이전 번역기 제거
if (m_translator) {
m_app->removeTranslator(m_translator);
delete m_translator;
m_translator = nullptr;
}
// 새 번역기 생성 및 파일 로드
m_translator = new QTranslator(this);
QString qmFile = QString(":/translations/%1.qm").arg(language);
if (m_translator->load(qmFile)) {
m_app->installTranslator(m_translator);
} else {
qWarning() << "번역 파일 로드 실패:" << qmFile;
}
}
QGuiApplication *m_app;
QTranslator *m_translator;
QString m_currentLanguage;
};
#endif // LANGUAGEMANAGER_H
5. main.cpp에 LanguageManager 등록
#include "LanguageManager.h"
LanguageManager languageManager(&app);
engine.rootContext()->setContextProperty("languageManager", &languageManager);
6. 코드 수정
text: qsTr("설정온도(℃)")
Button {
onClicked: {
languageManager.setCurrentLanguage("ko_KR")
}
}
Button {
onClicked: {
languageManager.setCurrentLanguage("en_US")
}
}
번역할 텍스트 앞에 qsTr을 붙혀준다.
그리고 버튼을 누르면 적용할 언어를 languageManger에 넘긴다.
7. 번역 파일(.ts) 생성
lupdate . -ts translations/en_US.ts translations/ko_KR.ts
프로젝트의 루트 디렉토리에서 lupdate를 실행하여 번역 파일을 생성한다.
8. Qt Linguist 실행
linguist translations/en_US.ts
Source language는 그대로 두면 되고 Target language에서 원하는 언어와 나라로 설정하면 된다.
qsTr이 붙은 text들을 자동으로 추출하여 하나씩 번역하기 편하게 나온다.
아래에 Translation to American English는 이전에 선택한 언어와 국가의 언어를 입력하는 공간이다.
상단 바에 있는 체크버튼을 눌러서 번역을 검토하고 저장을 누르고 나오면 된다.
9. 번역 파일(.qm) 생성
터미널에 아래 명령을 입력한다.
lrelease translations/en_US.ts
lrelease translations/ko_KR.ts
10. .qrc에 등록 후 CMakeList 파일에 추가
qt6_add_resources(translation_resources translations.qrc)
${translation_resources}
결과
Korea 버튼을 누르면 좌측 화면으로 나오고 English 버튼을 누르면 우측 화면으로 나온다.