QT tr() 다국어 지원

QT/Basics 2015. 4. 15. 11:32

Qt는 언어를 바꾸기위해 소스코드를 바꾸지 않아도 되도록 다국어 지원을 한다.

   . Qt는 data를 다룰때 unicode string 을 사용한다. (QString QStringlist QChar)

   . Qt는 런타임에 어플리케이션 스트링을 자동적으로 읽어올 수 있는 기반시스템을 제공한다.

   . 또한 Qt Extended는 어플리케이션을 처음 시작할 때 언어 관련 파일을 자동적으로 로드한다.

 

다국어 지원을 위해서 tr() 함수를 사용한다.

   예) QString str(tr("Hello"));

   . QString tr(QString const&) 함수는 모든 클래스에 대해 moc에 의해 번역이 수행된다.

 

   . 추가적으로 comment 와 context 를 사용할 수 있다.

     ts 파일을 context(name, comment, extracomment, message) 등으로 구성되는데

     - context는 string scope 을 정의하는 기능(XML의 context로 생각하면 됨)

        생략 시 클래스 이름(Q_OBJECT 매크로가 정의된 QObject 의 class name)

        두개의 문장이나 구를 구분하는데 사용됨  

        즉, 같은 문장이라도 context가 다르면 2개를 번역을 해주어야 함.      

     - comment는 string이 뜻이 애매모호할 때 부가적인 설명을 붙이는 기능이다.

        QString str(tr("Hello", "this is comment"));

     - message가 실제 데이터 내용인데 source(원본) 과 translation으로 구성된다.

 

     .ts 파일의 내부를 보는데 위 내용을 알면 도움이 될것이다.

     ts : transltion source

     qm : qt message

 

Qt Extended 는 번역을 위해 몇가지 툴을 제공하는데 lupdate와 lrelease이다.

    lupdate : 소스로 부터 tr 함수의 string 파일로 부터 .ts 파일을 만든다.

    lrelease : 업데이트된 .ts 파일을 바이너리 파일인 .qm 파일로 만든다.

                  qm파일은 어플리케이션이 시작할 때 로딩되어 다국어를 읽을 수 있게 한다.

    Qt Linguist : .ts 파일을 그래픽 적으로 편집할 수 있게 하는 툴이다.

                     번역 상태가 Unfinished (번역안됨), Obsolete(이미 사용되어지지 않음, 회색으로 표시)

                     Finished (번역 끝남, 화면에 녹색 체크표시) 3가지 상태가 존재한다.

 

Qt Extended 는 언어 파일 추출을 위해 두가지 make target를 제공한다.

    make lupdate : 언어에 따른 ts 파일 생성

    make lrelease : ts 파일을 qm 파일로 변환 하고 i18n/<lang>/<application name>.qm 으로 qm파일을 설치

 

변수에 tr을 사용할 때 QT_TR_NOOP 또는 QT_TRANSLATE_NOOP 매크로 사용

static const char* str[] = {

   QT_TR_NOOP("String 1"),

   QT_TR_NOOP("String 2"),

   QT_TR_NOOP("String 3"),

   QT_TR_NOOP("String 4"),

}

 

QT_TRANSLATE_NOOP는

QT_TRANSLATE_NOOP("Context", "String 1")

와 같이 context를 사용할 수 있다.

 

 

TS 파일 내부 예

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="ko_KR">
<defaultcodec></defaultcodec>
<context>
    <name>English (U.S.)</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="2"/>
        <source>English (U.S.)</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>Korean</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="1"/>
        <source>Korean</source>
        <translation>?쒓뎅??/translation>
    </message>
</context>
</TS>


Posted by 모래반지빵냐빵냐
,