CLion 관리 Qt 프로젝트 국제 화 지원 방법 설정

15289 단어 CLionQt국제 화
Qt 6 가 발표 되면 서 cmake 도 qmake 를 인수 하 겠 다 고 공식 선언 했다.
이전 편블 로그에서 나 는 cmake 를 어떻게 사용 하여 당신 의 qt 프로젝트 를 관리 하 는 지 소 개 했 지만,한 가 지 는 내 가 말 하지 않 았 다.그것 이 바로 국제 화(i18n)에 대한 처리 이다.
오늘 은 cmake+clion 설정 을 사용 하여 국제 화 지원 을 포함 하 는 프로젝트 를 관리 하 는 방법 을 소개 합 니 다.
준비 작업
너 는 아래 의 공 구 를 준비 해 야 한다.
  • Qt 5.13+(Qt 5.15.2 를 사 용 했 습 니 다)
  • CLion 2020.3+
  • GCC 9.0+(c++17 을 지원 하 는 것 이 좋 으 며,최소 요 구 는 c++11 지원)
  • 그 중에서 GCC 는 보통 자체 적 으로 설치 한 Qt 에 부대 가 있 고 그렇지 않 으 면 윈도 우즈 에서 vs 2019 컴 파 일 러 를 사용 해도 된다.
    리 눅 스에 서 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로 불 러 옵 니 다.QLocalename 방법 은"ja"와 같은 방법 으로 되 돌아 갈 수 있 습 니 다.JP'의 이름.
    내 시스템 의 기본 설정 은 일본어 이기 때문에 프로그램 을 실행 하면 이러한 화면 을 볼 수 있 습 니 다.

    만약 당신 의 환경 이 중국어 라면 화면 도 중국어 입 니 다.이것 이 바로 Qt 의 i18n 국제 화 지원 입 니 다.
    다 중 언어 자원 을 프로그램 에 연결 합 니 다.
    지난 절 이 끝 날 때 까지 우 리 는 사실 i18n 을 다 말 했 습 니 다.당신 은 프로그램 을 포장 할 때 qm 파일 과 프로그램 을 함께 놓 을 수 있 고 설치 할 때 도 같은 디 렉 터 리 에 놓 을 수 있 습 니 다.
    그러나 이런 방안 은 단점 이 있다.
  • 지원 하 는 언어 가 많 으 면 처리 해 야 할 작은 파일 이 많아 서 오류 가 발생 할 수 있 습 니 다.
  • 컴 파일 의존 에 qm 와 같은 무관 한 파일 을 넣 어야 합 니 다
  • 코드 결벽 증 이 있 는 저 에 게 두 번 째 는 특히 참 을 수 없습니다.그러나 이 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_translationqt5_add_translation할 수 없 는 것 입 니 다.

    좋 습 니 다.우 리 는 번역 을 임의로 바 꿀 수 있 습 니 다.전체 항목 을 다시 번역 하지 않 고 스스로 풍족 하 게 먹 을 수 있 습 니 다.
    더 구체 적 인 프로젝트 가 i18n 을 어떻게 설정 하 는 지 보고 싶다 면 저도 하나이 문장가 있 습 니 다.도움 이 된다 고 생각 하지 않 는 다 면 스타 를 해 보 세 요.
    CLion 관리 Qt 프로젝트 의 국제 화 지원 을 설정 하 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 CLion Qt 국제 화 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기