커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
150
955
3,878
3,871,508
  현재접속자 : 68 (회원 0)






배너 신청 문의

 
작성일 : 15-03-17 22:09
[QT/Win32] Qt 다국어 처리
 글쓴이 : korone
조회 : 11,207   추천 : 0  
   http://www.podovat.com/?p=396 [1446]
이글은 제가 podovat.com의 blog 올린글(http://www.podovat.com/?p=396)에서 퍼온것입니다.

Qt의 다국어 처리는 소스코드내의 tr로 감싸진 문자열을 분석하여 ts파일로 자동 추출하고 이를 Qt 번역 유틸리티인 linguist를 이용해 번역한 다음 qm파일을 생성합니다.
최종 생성된 qm파일은 프로젝트 내에서 QTranslator 객체를 생성해서 QApplication객체에 설정하면 됩니다.이의 과정을 자세히 정리해 보면 다음과 같이 처리 합니다.


1. tr()로 감싸기
QPushButton* btn = new QPushButton(“Name”);
위의 코드에서 QPushButton에 “Name”과 같이 문자열을 입력하면 Qt에서는 다국어 처리를 하지 않는다고 판단을 합니다.
만약 “Name”이라는 글자를 한국어로 “이름”, 중국어로 해당되는 문자열로 번역하기 위해서는 다음과 같이 tr() 매크로로 감싸 주어야 합니다.

QPushButton* btn = new QPushButton(tr(“Name”));


팁1. 디자이너등 버튼등을 배치하는 경우, 위의 C++ 소스코드내에서 했던 tr의 과정을 Qt에 의해 내부적으로 자동처리 되기 때문에 소스코드 상에서 특별한 작업을 하지 않아도 됩니다.

팁2. 소스코드내에서의 문자열은 1개의 언어로만 쓰여져야 하고, 되도록이면 영문으로 작성하는것이 좋습니다. 이러한 이유는, 번역하기 위한 언어가 여러가지 일때의 혼란을 막기 위해서 입니다.


2. lupdate 처리
소스코드와 디자이너 등에서 입력한 다국어 문자열은 Qt의 유틸리티를 이용해서 ts파일로 생성해야 합니다.
ts파일은 각 소스코드내의 tr로 감싸진 문자열을 모두 자동으로 읽어 xml형식으로 저장을 합니다.
만약 작성중인 프로그램이 영어, 한국어, 일본어, 중국어를 지원해야 한다면 총 네개의 ts파일이 필요한데, 참고로 영어의 경우 앞서 1에서 말한것과 같이 소스코드내에 작성한 코드가 영어이기 때문에 필요가 없으므로, 한국어, 일본어, 중국어를 위한 ts파일 3개만 생성을 하면 됩니다.
이 세개의 ts파일을 생성하기 위해서 Qt는 여러방법을 제공하는데, 그중 하나는 프로젝트 파일에 명시적으로 기술을 하고 lupdate명령어를 통해서 자동처리 하는 것입니다.

 

Qt프로젝트 파일인 .pro파일에 다음과 같이 TRANSLATIONS항목에 생성할 ts파일을 기술 합니다.
TRANSLATIonS += lang_ko.ts lang_ja.ts lang_zh.ts


TRANSLATIONS파일에 기술된 세개의 파일명에 대한 특별한 규칙은 없지만, 보통 앞에 프로젝트와의 연관성 혹은 이것이 다국어 언어파일이란것을 알 수 있도록 한 내용을 쓰고(여기서는 lang이라고 붙였습니다.)
그 뒤에 실제 어떠한 언어를 위한것인지를 구분하기 위한 구분자를 추가합니다.
일반적으로 _(언더바) 뒤에 언어별 약자를 기록하게 되며 ISO639표준(http://ko.wikipedia.org/wiki/ISO_639) 에 있는 언어별 약자를 쓰는것이 좋습니다.(한국어:ko, 일본어:ja, 중국어:zh)


.pro파일에 생성할 ts파일을 기록한 후에, Qt에서 제공하는 유틸리티인 lupdate를 이용해서 다음과 같이 ts파일을 생성합니다.
$ lupdate test.pro
위와 같이 lupdate 명령어 뒤에 현재 프로젝트 파일을 지정하면, 프로젝트 파일내에 있는 TRANSLATIONS에 기술된 파일명을 소스코드내에서 tr()로 묶여진 문자열을 추출하여 파일을 생성합니다.


만약 QtCreator상에서 이를 수행하고 싶은 경우 Menu – Tools – External – Linguist – Update Translations(lupdate)를 선택하시면 동일하게 처리할 수 있습니다.


3. Linguist
2의 과정을 거쳐 생성된 ts파일은 이제 Linguist라는 유틸리티를 통해 번역을 할 수 있는데, Qt설치 디렉토리에 위치한 Linguist유틸리티를 실행합니다.


그림1) Linguist

 

Linguist 실행후 Menu – File – Open으로 2에서 생성된 ts파일을 하나를 열면 다음과 같은 창이 표시가 됩니다.




그림2) 언어파일 설정

 

위의 그림2 에서 대상언어를 언어, 국가/지역을 선택하면 다음과 같이 번역할 문자열이 표시가 됩니다.


그림3) ts파일을 불러온 Linguist(프로젝트의 보호를 위해 주요 화면은 가렸습니다.)


그림3과 같이 프로그램의 모든 언어를 불러왔다면, 다음의 그림과 같이 원본 텍스트를 참고하여, 대상언어로 번역을 합니다.


그림4)

 

그림4와 같이 영문 Map을 중국어로 변환을 완료하면 이 항목에 대해서 번역이 완료되었다는 것을 체크하기 위해 중국어 입력후 Ctrl+Enter를 누르거나, 메뉴 – 번역 – 완료 표시후 다음을 누르면 위의 그림4에서 Map옆의 물음표 표시가 체크로 변경됩니다.


그림5)

 

위의 과정을 계속반복하며, 번역을 마치면, 메뉴 – 파일 – 배포를 누릅니다.
배포는 번역된 ts파일을 qm으로 변환하는 과정인데, qm파일은 ts가 있는 디렉토리에 자동생성됩니다.
위의 예에서는 lang_cn.ts를 배포하였으므로, lang_cn.qm파일이 생성됩니다.


4. QTranslator적용하기
3의 최종과정을 통해 생성된 .qm 파일은 소스코드 내에서 QTranslator객체로 불러와서 QApplication객체에 설정해 주면 됩니다. 이의 코드는 다음과 같습니다.


QTranslator* translator = new QTranslator();
Translator->load(“lang_cn.qm”);
QApplication::installTranslator(translator);


위의 코드를 적용하는 순간 모든 언어는 중국어로 변경이 되기 때문에, 프로그램 최초 시작시 처리해 주면 됩니다.


팁1. 만약 프로그램 동작 중 언어가 변경되는 경우 이미 install된 translator객체를 삭제하고 새롭게 load합니다. 그후 이미 모든 UI에 대해서 setText 와 같이 언어 설정을 다시 적용해 줍니다.
(참고 URL: http://www.informit.com/articles/article.aspx?p=1405555&seqNum=3)


5. QML에서의 다국어 처리
QML의 경우 C++에서 했던 것과 거의 동일하게 처리가 되는데, 단지 소스코드상에 tr() 태그 대신에 QML의 경우 qsTr() 태그로 묶어 주면 동일하게 처리할 수 있습니다.


예)
Rectangle {
    width: 640
    height: 480

    text {
        text: qsTr(“Name”);
}
}


이상 위와같이 Qt의 다국어 처리에 대해 살펴보았습니다. 다음번 기회가 있을 때 본문 내용에 팁으로 소개된 언어 동적 변경에 대해서 기술해 보도록 하겠습니다.
감사합니다.
Qt Professional Service(http://podovat.com)



구름님 15-03-18 09:51
 
감사합니다!!
지루 15-03-18 10:50
 
감사합니다 저도 요즘 언어작업 하는데 그냥 하려니 힘드네요 ㄱ-; 혹시 다국어 지원 가능한 '무료' 폰트 구하는 곳 알 수 있을까요? 지금 쓰는 폰트가 중국어 간체에선 잘리네요;
 
 

Total 201
번호 제   목 글쓴이 날짜 조회 추천
201 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 2076 0
200 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 4361 0
199 [QT/X11] QWT for qt android (1) 구름님 03-07 5953 1
198 [QT/Win32] QtSingleApplication 이용하기 (1) starbig 01-18 5833 0
197 [QT/Win32] Qt 에서 Daum Maps Api geo [ 주소->좌표 변환 ] 사… starbig 01-15 6602 0
196 [QT/Win32] Qt에서 윈도우 서비스 이용하기, Qt Windows Servic starbig 01-15 5132 0
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 9445 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5576 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5394 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 5765 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 19169 1
190 [QT/Win32] Qt 다국어 처리 (2) korone 03-17 11208 0
189 [QT/Win32] signal to signal devilqoo 02-13 5094 0
188 [QT/Win32] Qt x64 바이너리 제공 사이트 (1) 인라이… 02-12 5002 1
187 [QT/Embedded] 우분투 Qt5 크로스 컴파일 (14/11/26 2차 수정) (9) 김아무… 11-12 14157 0
186 [QT/Embedded] Qt 5.3.2에서 Mouse Double Click시 이벤트 문제 (2) korone 11-11 5132 0
185 [QT/Embedded] QtWinExtras korone 11-11 5092 0
184 [QT/Win32] Qt 코딩 스타일 (편집 편) (4) devilqoo 10-22 9245 0
183 [QT/Win32] Qt와 C++11 (2) devilqoo 10-12 9707 1
182 [QT/Win32] Qt 에서의 이벤트 처리 (5) devilqoo 10-09 9057 0
181 [QT/Win32] QList와 QVector의 비교. (2) devilqoo 10-02 6554 0
180 [QT/Win32] Qt에서 사용되는 컨테이너들을 정리해 보았습… (4) devilqoo 10-01 7410 0
179 [QT/X11] qmake DEFINES 변수에 공백문자가 포함된 값을 설… (1) 별님 09-25 4795 0
178 [QT/Win32] 데이터 압축 관련 qCompress(), qUncompress() (9) 구름님 09-16 5304 0
177 [QT/Win32] QML 로 One-Source Multi-Platform (iOS, Android) 실행 tmdwn 09-03 6753 0
176 [QT/Win32] QML 로 iOS Application 제작하기 tmdwn 09-02 6757 0
175 [QT/Win32] QML 로 Android Application 제작하기 (4) tmdwn 09-02 7197 2
174 [QT/X11] qt에서 메모리 조작하기. (2) 나무나… 07-25 7345 0
173 [QT/Win32] Q_DECLARE_FLAGS 매크로 (2) 구름님 07-11 5947 2
172 [QT/Win32] Q_PROPERTY 매크로 (6) 구름님 07-09 8125 2
 1  2  3  4  5  6  7  


About korone.net | Copyright 2003 korone.net. All rights reserved.