어플리케이션 개발시 유니코드및 다국어 지원을 기본으로 하는 것이 바람직한 개발 방향이다.
Qt는 다국어 개발에 대한 좋은 솔루션을 제공하고있는데 여기서 다국어 사용 및 개발방법을 설명하고자 한다.
Linguist툴은 QML에서 qsTr(), C++소스코드의 tr()을 사용한 문자열을 가져와 XML구조의 ts파일을 만든다.
예를 들어 QML의 문자열이 사용되는 곳에 아래 코드와 같이 사용될 것이다.
Window { visible: true width: 640 height: 480 title: qsTr("Hello World") }
언어별 ts파일이 생성되어야 하는데 프로젝트파일(.pro)에 정의해주어야한다.
.pro파일을 열고 아래처럼 언어별 정의를 해주는데 이름에 규칙이나 제한은 없지만 여기선 "_" 다음에 ISO 3166-1 alpha-2 국가부호로 해줬다.
TRANSLATIONS += lang_ko.ts
이제 ts파일을 생성하기위해 QtCreator에서 Tools - External - Linguist - Update Translations (lupdate)를 실행한다.
프로젝트가 위치한 곳에 ts파일이 생성된다.
Linguist 실행하고 생성된 ts파일을 열면 컨텍스트, 문자열, 원본 코드를 볼 수 있다.
편집 - 번역파일설정을 선택해서 해당되는 언어, 국가를 설정한다.
원본 텍스트에 해당하는 문자열을 입력하고 ctrl + 엔터를 누르거나 아이콘을 클릭해서 번역을 수행한다.
번역을 완료하고 저장후에 파일 - 배포 클릭하면 ts파일이 위치한 곳에 qm파일이 생성된다.
... QGuiApplication app(argc, argv); QTranslator translator; translator.load("lang_ko.qm"); app.installTranslator(&translator); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); ...
아래의 코드는 QML에서 3D Studio 컴포넌트의 텍스트 요소의 속성(문자열)을 바꾸도록한 예제이다.
... function setLanguageMenu() { menuLight.setAttribute("textstring", qsTr("Light")) menuDrive.setAttribute("textstring", qsTr("Drive")) menuRotate.setAttribute("textstring", qsTr("Rotate")) } Studio3D{ anchors.fill: parent Presentation { id: cluster source: "qrc:/presentation/3d_example.uia" Element{ id: menuLight elementPath: "Scene.MenuLayer.Menu.Light" } Element{ id: menuDrive elementPath: "Scene.MenuLayer.Menu.Drive" } Element{ id: menuRotate elementPath: "Scene.MenuLayer.Menu.Rotate" } Component.onCompleted: { if(langKor) setLanguageMenu() } } } ...
이제 프로젝트를 빌드하고 어플리케이션이 실행되면 번역된 문자열이 출력된다.