CLion 관리 Qt 프로젝트 국제 화 지원 방법 설정
이전 편블 로그에서 나 는 cmake 를 어떻게 사용 하여 당신 의 qt 프로젝트 를 관리 하 는 지 소 개 했 지만,한 가 지 는 내 가 말 하지 않 았 다.그것 이 바로 국제 화(i18n)에 대한 처리 이다.
오늘 은 cmake+clion 설정 을 사용 하여 국제 화 지원 을 포함 하 는 프로젝트 를 관리 하 는 방법 을 소개 합 니 다.
준비 작업
너 는 아래 의 공 구 를 준비 해 야 한다.
리 눅 스에 서 Qt 를 직접 다운로드 하지 않 으 려 면 시스템 창고 로 포장 할 수도 있 습 니 다.
# ubuntu
sudo apt-get install build-essential libglu1-mesa-dev libpulse-dev libglib2.0-dev
sudo apt-get --no-install-recommends install libqt*5-dev qt*5-dev qml-module-qtquick-* qt*5-doc-html
# Arch/Manjato
sudo pacman -S base-devel
sudo pacman -S --needed qt5
CLion 의 2020.3 이상 버 전 을 선택 한 것 은 자체 Qt 프로젝트 템 플 릿 을 제공 하여 우리 가 프레임 워 크 를 만 드 는 번 거 로 움 을 줄 였 기 때 문 입 니 다.물론 구형 CLion 을 사용 하고 있다 면 Qt 항목 설정 을 참고 하 세 요.
Qt 6 는 cmake 설정 에서 유사 합 니 다.몇 개의 함수 이름 만 수정 하면 됩 니 다.나중에 언급 합 니 다.
프로젝트 생 성
선행 작업 이 끝 난 후에 프로젝트 를 만 들 수 있 습 니 다.다음 그림 과 같 습 니 다.
기본 값 은 c++14 기준 입 니 다.저 는 개인 적 으로 c+17 을 더 좋아 하지만 오늘 의 예 는 c+14 를 사용 해도 됩 니 다.
생 성 이 완료 되면 다음 CMakeLists.txt 파일 을 얻 을 수 있 습 니 다.
cmake_minimum_required(VERSION 3.17)
project(untitled1)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(QT_VERSION 5)
# Qt modules
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)
add_executable(${PROJECT_NAME} main.cpp)
# qt cmake ,
#
if (NOT CMAKE_PREFIX_PATH)
message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
"(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
endif ()
# Qt modules
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})
CLion 은 cmake 로 프로젝트 를 구성 하 는 것 입 니 다.cmake 의 설정 은 당연히 없어 서 는 안 됩 니 다.프로젝트 다음 에는 Hello World 예제
main.cpp
를 미리 기록 한 것 도 있다.컴 파일 을 누 르 면 프로그램 이 만 든 창 을 볼 수 있 습 니 다.이제 우 리 는 본론 으로 들 어가 야 한다.
국제 화 지원 설정
국제 화 를 더욱 잘 보 여주 기 위해 서 우 리 는 예 코드 를 다음 과 같이 바 꿔 야 한다.
#include <QApplication>
#include <QHBoxLayout>
#include <QMessageBox>
#include <QPushButton>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget window;
auto btn1 = new QPushButton{QObject::tr("click left button")};
QObject::connect(btn1, &QPushButton::clicked, [w = &window]() {
QMessageBox::information(w,
QObject::tr("clicked left button"),
QObject::tr("you clicked left button"));
});
auto btn2 = new QPushButton{QObject::tr("click right button")};
QObject::connect(btn2, &QPushButton::clicked, [w = &window]() {
QMessageBox::information(w,
QObject::tr("clicked right button"),
QObject::tr("you clicked right button"));
});
auto mainLayout = new QHBoxLayout;
mainLayout->addWidget(btn1);
mainLayout->addWidget(btn2);
window.setLayout(mainLayout);
window.show();
return QApplication::exec();
}
국제 화의 세부 사항 에 대해 우 리 는 많이 소개 할 뿐 번역 해 야 할 문 자 를QObject::tr
로 처리 해 야 한 다 는 것 만 알 면 된다.실행 을 클릭 하면 화면 에 모두 영어 가 있 는 것 을 볼 수 있 습 니 다.왜냐하면 지금 우 리 는 국제 화 지원 을 추가 하지 않 았 기 때 문 입 니 다.
Qt 의 번역 파일 은 ts 파일 과 qm 파일 로 구성 되 어 있 으 며,ts 파일 은 인간 이 번역 하 는 데 사용 되 며,Qt 는 ts 파일 에 따라 qm 파일 을 생 성 합 니 다.이것 은 프로그램 이 사용 하 는 바 이 너 리 파일 로 인간 이 직접 읽 을 수 없습니다.
그래서 프로젝트 에서 우 리 는 ts 파일 에 만 관심 을 가지 면 됩 니 다.다음은 lang 서브 디 렉 터 리 를 만 듭 니 다.우 리 는 그 중에서 영어 에서 중국어 와 일본어 로 번역 하 는 작업 을 해 야 합 니 다.
mkdir lang
그러나 우 리 는 스스로 ts 파일 을 만 들 필요 가 없다.왜냐하면 이것 은 Qt 가 자동 으로 완성 할 수 있 기 때문이다.다음은 cmake 를 수정 하여 국제 화 를 지원 할 수 있 도록 하 겠 습 니 다.
cmake_minimum_required(VERSION 3.17)
project(untitled1)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)
set(TS_FILES
${CMAKE_SOURCE_DIR}/lang/zh_CN.ts
${CMAKE_SOURCE_DIR}/lang/ja_JP.ts)
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} LinguistTools REQUIRED)
qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES})
add_executable(${PROJECT_NAME} main.cpp ${TS_FILES})
if (NOT CMAKE_PREFIX_PATH)
message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
"(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
endif ()
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})
와,설정 이 길 어 지고 무서워 졌어 요.사실 핵심 내용 은 이 몇 줄 밖 에 없어 요.
set(TS_FILES
${CMAKE_SOURCE_DIR}/lang/zh_CN.ts
${CMAKE_SOURCE_DIR}/lang/ja_JP.ts)
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} LinguistTools REQUIRED)
qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES})
add_executable(${PROJECT_NAME} main.cpp ${TS_FILES} ${QM_FILES})
첫 번 째 줄 은 우리 가 필요 로 하 는 ts 파일 의 이름 을 변수 에 설정 하 는 것 을 잘 이해 합 니 다.이어서 우 리 는
Qt5::LinguistTools
를 도입 했다.이것 은 c++라 이브 러 리 가 아니 라 ts 파일 과 qm 파일 을 생 성 하 는 데 도움 을 주 는 cmake 모듈 이기 때문에 프로그램 에 연결 할 수 없다.마지막 줄 도 간단 합 니 다.ts 파일 을 컴 파일 러 의존 프로젝트 에 넣 고 변경 되면 프로그램 을 다시 구축 합 니 다.
관건 은
qt5_create_translation
여기 있 습 니 다.이 함 수 는 ts 파일 을 만 드 는 데 도움 을 줄 것 입 니 다.ts 파일 이 존재 하면 ts 파일 을 업데이트 하여 새로 추 가 된 번역 을 추가 합 니 다.이 단계 가 끝나 지 않 았 습 니 다.ts 파일 을 업데이트 한 후에 ts 파일 에 올 바른 번역 정보 가 있 는 지 확인 합 니 다.cmake 의 컴 파일 디 렉 터 리 에서 ts 파일 과 같은 이름 의 qm 파일 을 만 듭 니 다.
중간
${CMAKE_CURRENT_SOURCE_DIR}
은 어느 디 렉 터 리 의 원본 파일 에서 번역 할 텍스트 를 가 져 올 지 지정 하 는 것 입 니 다.qm 파일 이 최종 적 으로 사용 되 지 않 으 면 실제로 생 성 되 지 않 습 니 다.qm 파일 을 만 들 수 있 도록 의존 도 를 넣 었 고 더 좋 은 방법 도 있 습 니 다.나중에 소개 하 겠 습 니 다.
Qt 6 에서 우 리 는 함수 명 을
qt_create_translation
로 바 꾸 기만 하면 된다.ts 파일 을 만 들 고 업데이트 하려 면 함 수 를
qt5_add_translation
로 바 꾸 면 자동 으로 ts 파일 에 따라 qm 파일 을 생 성 하지만 ts 파일 이 존재 하지 않 으 면 오 류 를 보고 합 니 다.Qt 6 에 서 는 이름 이qt_add_translation
로 변 합 니 다.상술 한 일 은 make 할 때 진 행 됩 니 다.예 를 들 어 다음 과 같 습 니 다.
번역 추가
번역 을 추가 하 는 것 은 할 말 이 없습니다.ts 파일 을 직접 편집 할 수 있 습 니 다.xml 형식 이기 때문에 편집 하기 가 쉽 습 니 다.
그러나 번역 은 텍스트 와 코드 의 문맥 을 참고 해 야 할 때 가 있 습 니 다.이 럴 때 는 Qt Linguist 를 사용 해 야 합 니 다.
구체 적 인 사용 세부 사항 은 더 이상 군말 하지 않 으 니,너 는 정원 과 인터넷 의 다른 양질 의 문장 을 참고 할 수 있다.
컴 파일 이 실 행 된 후에 빌 드 디 렉 터 리 에서 두 개의 qm 파일 을 볼 수 있 습 니 다.이때 우리 의 프로그램 은 국제 화 지원 을 완성 하지 못 했 습 니 다.코드 에서 우 리 는 이 qm 파일 을 사용 해 야 합 니 다.
#include <QLocale>
#include <QTranslator>
int main()
{
QApplication a(argc, argv);
QTranslator trans;
if (trans.load("./" + QLocale().name() + ".qm")) {
QCoreApplication::installTranslator(&trans);
}
...
return a.exec();
}
로 컬 qm 파일 을QTranslator
로 불 러 옵 니 다.QLocale
name 방법 은"ja"와 같은 방법 으로 되 돌아 갈 수 있 습 니 다.JP'의 이름.내 시스템 의 기본 설정 은 일본어 이기 때문에 프로그램 을 실행 하면 이러한 화면 을 볼 수 있 습 니 다.
만약 당신 의 환경 이 중국어 라면 화면 도 중국어 입 니 다.이것 이 바로 Qt 의 i18n 국제 화 지원 입 니 다.
다 중 언어 자원 을 프로그램 에 연결 합 니 다.
지난 절 이 끝 날 때 까지 우 리 는 사실 i18n 을 다 말 했 습 니 다.당신 은 프로그램 을 포장 할 때 qm 파일 과 프로그램 을 함께 놓 을 수 있 고 설치 할 때 도 같은 디 렉 터 리 에 놓 을 수 있 습 니 다.
그러나 이런 방안 은 단점 이 있다.
사실 방법 도 있 습 니 다.우 리 는 이 qm 파일 들 을 모두 qrc 에 통합 할 수 있 습 니 다.
우선 디 렉 터 리 아래 에
translations.qrc
파일 을 만 듭 니 다.
<RCC>
<qresource>
<file>zh_CN.qm</file>
<file>ja_JP.qm</file>
</qresource>
</RCC>
자원 파일 의 경 로 를 상관 하지 않 습 니 다.CMakeLists.txt 에 대해 수정 을 해 야 하기 때 문 입 니 다.
set(CMAKE_AUTORCC ON) # rcc
#
configure_file(translations.qrc ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
...
add_executable(${PROJECT_NAME} main.cpp ${TS_FILES} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
주의해 야 할 것 은configure_file
줄 입 니 다.우 리 는 qrc 파일 을 컴 파일 디 렉 터 리 에 그대로 복사 하 였 습 니 다.qm 파일 도 거기에서 생 성 되 었 기 때 문 입 니 다.현재 qrc 는 자동 으로 처리 되 고 우리 의 qm 파일 은 의존 항목 으로 도 자동 으로 생 성 될 수 있 습 니 다.
프로젝트 를 다시 컴 파일 하면 이번에 우 리 는 qm 가 생 성 된 것 을 발견 할 수 있 습 니 다.
Qt rcc 를 사용 하여 자원 을 프로그램 에 끼 워 넣 었 기 때문에 cpp 코드 도 조정 해 야 합 니 다.
QTranslator trans;
-if (trans.load("./" + QLocale().name() + ".qm")) {
+if (trans.load(":/" + QLocale().name() + ".qm")) {
QCoreApplication::installTranslator(&trans);
}
주의.
가:
로 바 뀌 었 습 니 다.이것 은 우리 가 지정 한 경로 가 자원 에 포 함 된 것 을 의미 합 니 다.이렇게 하면 국제 화 지원 이 철저히 완 성 됩 니 다.리 눅 스 의
LANG
환경 변 수 를 수정 함으로써 우 리 는 프로그램의 언어 를 자 유 롭 게 설정 할 수 있 습 니 다.효 과 는 다음 과 같 습 니 다.총결산
지금 나 는 완전한 CMakeLists.txt 를 참고 로 붙인다.너 자신의 프로젝트 에 대해 당연히 조정 해 야 한다.
cmake_minimum_required(VERSION 3.17)
project(untitled1)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)
set(TS_FILES
${CMAKE_SOURCE_DIR}/lang/zh_CN.ts
${CMAKE_SOURCE_DIR}/lang/ja_JP.ts)
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} LinguistTools REQUIRED)
configure_file(translations.qrc ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES})
add_executable(${PROJECT_NAME} main.cpp ${TS_FILES} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
message(${QM_FILES})
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})
가일층현재 당신 은 이미 clion 으로 자신의 다 중 언어 지원 프로젝트 를 관리 할 수 있 지만,현재 의 방안 은 여전히 완벽 하 다 고 할 수 없습니다.
ts 파일 의 업데이트 와 qm 파일 의 생 성 은 컴 파일 기간 에 진행 되 어야 하기 때문에 상기 작업 을 단독으로 진행 할 수 없습니다.문서 의 견해 에 따 르 면 다 중 언어 에 대한 지원 은 일반적으로 소프트웨어 자체 의 기능 이 기본적으로 완 선 된 후에 이 루어 진다.ts 파일 과 qm 파일 은 자주 변경 되 지 않 기 때문에 컴 파일 기간 에 함께 처리 하면 받 아들 일 수 있다.
그러나 사실상 소프트웨어 의 기능 은 증 량 업 데 이 트 를 하고 번역 도 정정 과 개선 을 하기 때문에 전체 프로젝트 를 다시 컴 파일 하 는 대가 가 너무 높다.
그렇다면 i18n 의 처 리 를 독립 시 킬 수 있 을 까?답 은 괜 찮 지만 우 리 는 더 이상 LinguistTools 를 빌 릴 수 없다.LinguistTools 는 내부 에서
add_custom_command
사용 되 기 때문에 하나의 컴 파일 목 표를 독립 적 으로 구성 할 수 없 기 때문에 다른 길 을 찾 아야 한다.수 정 된 코드 를 살 펴 보 겠 습 니 다.
# LinguistTools
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
# ts qm
# ALL make all
add_custom_target(update_all_ts_files ALL)
add_custom_target(create_all_qm_files ALL)
# $PATH lupdate lrelease,
find_file(LUPDATE_PATH lupdate)
find_file(LRELEASE_PATH lrelease)
# ts , update_ts_file_<NAME> create_qm_file_<NAME>
foreach(TS_FILE ${TS_FILES})
# zh_CN.ts zh_CN
get_filename_component(I18N_NAME ${TS_FILE} NAME_WE)
set(TS_TARGET_NAME "update_ts_file_${I18N_NAME}")
add_custom_target(${TS_TARGET_NAME}
COMMAND ${LUPDATE_PATH} ${CMAKE_CURRENT_SOURCE_DIR} -ts ${TS_FILE}
VERBATIM)
# update_ts_file_<NAME> update_all_ts_files ,
add_dependencies(update_all_ts_files ${TS_TARGET_NAME})
set(QM_TARGET_NAME "create_qm_file_${I18N_NAME}")
set(QM_FILE "${CMAKE_CURRENT_BINARY_DIR}/${I18N_NAME}.qm")
add_custom_target(${QM_TARGET_NAME}
COMMAND ${LRELEASE_PATH} ${TS_FILE} -qm ${QM_FILE}
VERBATIM)
# ts qm , ts
add_dependencies(${QM_TARGET_NAME} ${TS_TARGET_NAME})
add_dependencies(create_all_qm_files ${QM_TARGET_NAME})
endforeach()
configure_file(translations.qrc ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
add_executable(${PROJECT_NAME} main.cpp ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
# qrc qm , qm
add_dependencies(${PROJECT_NAME} create_all_qm_files)
복잡 해 보이 지만 실제로 위의 코드 는 한 가지 일 만 하고 다음 과 같은 의존 체인 을 만 들 었 습 니 다.현재 ts 파일 을 업데이트 하고 qm 파일 을 생 성 하 는 것 은 단독 절차 로 존재 할 수 있 습 니 다.이것 은
qt5_create_translation
과qt5_add_translation
할 수 없 는 것 입 니 다.좋 습 니 다.우 리 는 번역 을 임의로 바 꿀 수 있 습 니 다.전체 항목 을 다시 번역 하지 않 고 스스로 풍족 하 게 먹 을 수 있 습 니 다.
더 구체 적 인 프로젝트 가 i18n 을 어떻게 설정 하 는 지 보고 싶다 면 저도 하나이 문장가 있 습 니 다.도움 이 된다 고 생각 하지 않 는 다 면 스타 를 해 보 세 요.
CLion 관리 Qt 프로젝트 의 국제 화 지원 을 설정 하 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 CLion Qt 국제 화 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embeddable Common Lisp 및 Qt5로 GUI 애플리케이션 ~ 개발 환경 구축 ~ECL(Embeddable Common Lisp)의 Qt 바인딩인 을 도입하고 싶습니다. ※ OS는 Ubuntu 17.10을 사용하고 있습니다. ※ 사전에 ECL을 설치해 주십시오. ECL은 다음 기사를 참고하여 설...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.