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






배너 신청 문의

 
작성일 : 15-03-17 22:09
[QT/Win32] Qt 다국어 처리
 글쓴이 : korone
조회 : 12,029   추천 : 0  
   http://www.podovat.com/?p=396 [1540]
이글은 제가 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 220
번호 제   목 글쓴이 날짜 조회 추천
220 자신이 해야 할 일을 결정하는 사람은 세상에… rqyuspv875 10-21 5 0
219 산다는것 그것은 치열한 전투이다. -로망로랑… rqyuspv875 10-21 3 0
218 인간의 삶 전체는 단지 한 순간에 불과하다 . … rqyuspv875 10-21 3 0
217 source 삶이 그대를 속일지라도 슬퍼하거나 노… rqyuspv875 10-21 3 0
216 내일은 내일의 태양이 뜬다 피할수 없으면 즐… wyltqme425 10-20 9 0
215 인생이란 학교에는 불행 이란 훌륭한 스승이 … wyltqme425 10-20 6 0
214 최고에 도달하려면 최저에서 시작하라.-P.시… wyltqme425 10-20 2 0
213 해야 할 것을 하라. 모든 것은 타인의 행복을 … wyltqme425 10-20 3 0
212 평생 살 것처럼 꿈을 꾸어라.그리고 내일 죽… wyltqme425 10-20 10 0
211 이룰수 없는 꿈을 꾸고 이길수 없는 적과 싸… wyltqme425 10-20 7 0
210 만약 우리가 할 수 있는 일을 모두 한다면 우… wyltqme425 10-20 16 0
209 꿈을 계속 간직하고 있으면 반드시 실현할 때… wyltqme425 10-20 7 0
208 사막이 아름다운 것은 어딘가에 샘이 숨겨져 … wyltqme425 10-20 4 0
207 자신의 본성이 어떤것이든 그에 충실하라 . … wyltqme425 10-20 3 0
206 아래에 비교하면 남음이 있다.-명심보감[쇼미… wyltqme425 10-20 7 0
205 nephew 삶이 있는 한 희망은 있다 -키케로유혜… wyltqme425 10-20 7 0
204 고통이 남기고 간 뒤를 보라! 고난이 지나면 … rqyuspv875 10-20 7 0
203 진짜 문제는 사람들의 마음이다.그것은 절대… rqyuspv875 10-20 9 0
202 지금이야 말로 일할때다. 지금이야말로 싸울… rqyuspv875 10-20 6 0
201 도저히 손댈 수가 없는 곤란에 부딪혔다면 과… rqyuspv875 10-20 19 0
200 우선 무엇이 되고자 하는가를 자신에게 말하… rqyuspv875 10-20 9 0
199 longer 자신감 있는 표정을 지으면 자신감이 생… rqyuspv875 10-20 3 0
198 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 3059 0
197 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 4758 0
196 [QT/X11] QWT for qt android (1) 구름님 03-07 6311 1
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 10251 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5871 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5738 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 6070 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 20192 1
 1  2  3  4  5  6  7  8  


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