현지화된 시계 예제

이 예제는 다른 언어의 복수형 처리, 현지화된 시간 및 날짜 형식을 포함하여 CMake와 Qt Quick 에서 Qt의 번역 및 현지화 기능을 사용하는 모범 사례를 보여줍니다.

Qt 애플리케이션 번역에 대한 자세한 내용은 Qt Linguist 매뉴얼을 참조하십시오.

사용자 인터페이스

이 예는 시스템의 로캘과 언어로 현재 시간과 날짜를 보여줍니다. UI의 텍스트는 다음 언어에 대해 추가로 현지화되어 있습니다: 영어, 독일어, 프랑스어, 스페인어, 이탈리아어, 일본어, 한국어, 포르투갈어, 아랍어, 중국어. 데스크톱이 다른 언어로 되어 있으면 영어로 다시 표시됩니다.

시스템을 변경하지 않고 다양한 언어와 로캘을 테스트하기 위해 이 예제에서는 명령줄 인수로 로캘도 허용합니다. 예를 들어, --locale de 옵션을 사용하여 명령줄에서 localizedClock을 시작하면 독일에서 일반적으로 사용되는 날짜 및 시간 형식과 함께 독일어로 시계를 표시합니다.

스크린샷은 en_US 버전을 보여줍니다:

국제화

애플리케이션에서 번역은 기본 창 제목과 플레이스홀더 및 복수형 등 몇 가지 UI 텍스트를 설정하는 데 사용됩니다. 애플리케이션은 복수형이 활성화된 상태에서 초를 계산합니다( 복수형 처리하기 참조). 따라서 초 수에 따라 번역 함수는 대상 언어에 맞는 정확한 문법 번호로 다른 번역을 반환합니다. 예를 들어 영어의 경우 초 수가 1보다 크면 복수형이 사용되고, 그렇지 않으면 단수형이 사용됩니다. 복수형 번역 규칙에서 다양한 언어에 대한 복수형 번역 규칙을 확인할 수 있습니다.

로캘은 날짜와 시간이 표시되는 방식에도 영향을 줍니다. 현재 로캘의 국가 규칙에 따라 형식이 지정됩니다. 예를 들어 독일 로캘에서는 24시간 시간이 표시되고 월 앞에 요일이 표시되는 반면, 미국 로캘에서는 12시간 시계를 사용하며 요일 앞에 월이 표시됩니다.

이 스크린샷은 en_GB 버전을 보여줍니다. 데이터 형식은 위의 en_US 버전과 다르지만 두 경우 모두 동일한 영어 복수 번역이 로드됩니다.

다음은 de_DE 버전의 스크린샷으로, GB와 마찬가지로 미국과는 다른 날짜 형식을 가지고 있습니다. 일반 및 복수형에 대한 독일어 번역이 그에 따라 로드되는 것을 확인할 수 있습니다.

구현

구현은 세 부분으로 구성됩니다:

CMakeLists.txt

애플리케이션의 CMake 파일은 Qt의 번역 및 현지화 지원을 활성화합니다. 다음은 관련 부분입니다:

find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick): 국제화에 필수적인 Linguist 등 필요한 Qt 6 모듈을 찾아서 연결합니다.

qt_standard_project_setup(...): 나열된 로캘을 지원하는 국제화 시스템을 설정합니다. I18N_SOURCE_LANGUAGE 은 소스 코드에 영어 텍스트가 포함되어 있으므로 기본값(영어)으로 남겨둡니다.

qt_standard_project_setup(REQUIRES 6.8
    I18N_TRANSLATED_LANGUAGES de ar ko zh ja fr it es pt)

qt_add_translations(...): clock 을 기본 이름으로 사용하여 "i18n" 디렉터리에 번역 소스 파일(TS 파일)을 생성하고 번역이 포함된 경우 바이너리 .qm 파일로 컴파일하여 lupdatelrelease 의 기능을 번들로 제공합니다. 생성되는 TS 파일은 다음과 같습니다:

  • "clock_{de, ar, ko, zh, ja, fr, it, es, pt}.ts": qt_standard_project_setupI18N_TRANSLATED_LANGUAGES 에 나열된 언어당 하나의 TS 파일로 해당 언어에 대한 번역이 포함되어 있습니다.
  • "clock_en.ts": 소스 코드에 복수형 번역("%n초")이 있으므로 영어 복수형을 포함합니다. qt_add_translations 함수는 소스 코드에서 텍스트의 언어를 영어로 지정하고 I18N_SOURCE_LANGUAGE 을 기본값으로 남겨두었으므로 여기에 복수형만 씁니다. 따라서 일반 텍스트는 번역이 필요하지 않습니다.
qt_add_translations(localizedClock
    TS_FILE_BASE i18n/clock
    RESOURCE_PREFIX i18n
)

qt_add_qml_module(...): Main.qml 파일을 포함하여 qtexamples.localizedclock URI 아래에 QML 모듈을 추가합니다.

qt_add_qml_module(localizedClock
    URI qtexamples.localizedclock
    VERSION 1.0
    QML_FILES
        Main.qml
)
main.cpp

애플리케이션의 시작점입니다. 이 부분에서는 로캘 설정, 필요한 번역 설치 및 UI 로딩을 담당합니다. 다음은 관련 코드에 대한 설명입니다:

로캘 인수를 정의합니다(예: --locale en_US 또는 --locale de_DE):

    QCommandLineParser parser;
    QCommandLineOption localeOption("locale"_L1, "Locale to be used in the user interface"_L1,
                                    "locale"_L1);
    parser.addOption(localeOption);
    parser.addHelpOption();
    parser.process(app);

인수를 구문 분석하고 제공된 로캘을 가져온 다음 입력 로캘을 애플리케이션의 기본 로캘로 설정합니다:

        QLocale locale(parser.value(localeOption));        qInfo() << "Setting locale to" << locale.name();
        QLocale::setDefault(locale);

로캘에 관계없이 영어 번역을 설치하여 다른 언어에 대한 불완전한 번역을 허용합니다. QTranslator 번역이 설치된 역순으로 텍스트에 대한 번역을 쿼리합니다:

    QTranslator enPlurals; const auto enPluralsPath = ":/i18n/clock_en.qm"_L1; if (!enPlurals.load(enPluralsPath))        qFatal("Could not load %s!", qUtf8Printable(enPluralsPath));
    app.installTranslator(&enPlurals);

지정된 로캘에 따라 번역을 설치합니다. 이전 단계에서 영어 번역이 이미 설치되었으므로 여기에는 두 개의 번역이 설치될 수 있습니다. Qt는 겹치는 키에 대해 가장 최근에 설치된 번역을 사용합니다. 따라서 로케일별 번역이 영어보다 우선하며, 누락된 번역이 있는 경우 QTranslator 이 다시 영어가 됩니다.

    QTranslator translation; if (QLocale().language() != QLocale::영어) { if (translation.load(QLocale(), "clock"_L1, "_"_L1, ":/i18n/"_L1)) {            qInfo("Loading translation %s",
                  qUtf8Printable(QDir::toNativeSeparators(translation.filePath()))); if (!app.installTranslator(&translation))                qWarning("Could not install %s!",
                         qUtf8Printable(QDir::toNativeSeparators(translation.filePath()))); } else { {            qInfo("Could not load translation to %s. Using English.",
                  qUtf8Printable(QLocale().name()); } }
Main.qml

이 QML 파일은 시간, 날짜, 사용된 로캘, 초 단위 카운터를 표시하는 애플리케이션의 기본 UI 창을 정의합니다. 다음은 관련 코드에 대한 설명입니다:

번역을 위해 qsTr()을 사용하여 창 제목을 설정합니다. 이 텍스트 QTranslator 의 번역을 찾으려면 현재 언어의 TS 파일에서 "Main" (파일 이름) 컨텍스트 내의 "Digital Clock" 텍스트를 쿼리합니다:

title: qsTr("Digital Clock")

복수형(숫자)을 지원하는 qsTr()을 사용하여 초 수를 표시합니다. 복수형은 특수 표기법 "%n"을 사용하여 활성화할 수 있습니다(복수형 처리하기 참조). n의 값에 따라 번역 함수는 대상 언어에 맞는 올바른 문법 번호로 다른 번역을 반환합니다. 예를 들어 영어의 경우 root.seconds 값이 1보다 크면 복수형이 사용되고, 그렇지 않으면 단수형이 사용됩니다. 복수형 번역 규칙에서 다양한 언어에 대한 복수형 번역 규칙을 확인할 수 있습니다.

text: qsTr("%n second(s)", "seconds", root.seconds)

현재 로캘을 표시하고 qsTr()을 사용하여 소스 텍스트 "로캘: %1"을 번역합니다. 또한 번역에는 인수 표기법 "%1"이 포함되어야 합니다. 결과적으로 텍스트의 인수(예: Qt.locale().name)를 사용하여 텍스트의 서식을 올바르게 지정할 수 있습니다:

text: qsTr("Locale: %1").arg(Qt.locale().name)

로캘 변환에 따라 시간과 날짜의 서식을 지정합니다. 국가마다 시간과 날짜를 표시하는 방법에 대한 특정 기본 설정이 있을 수 있습니다. 예를 들어 독일 로캘은 24시간 시계를 사용하고 월의 전날을 쓰는 반면, 미국 로캘은 12시간 시계를 따르고 월의 전날을 일의 전날에 배치합니다. Date.toLocaleTimeString 메서드는 이러한 고려 사항을 고려하여 주어진 로캘에 따라 시간과 날짜의 형식을 올바르게 지정합니다:

            const now = new Date();
            const locale = Qt.locale();
            root.time = now.toLocaleTimeString(locale, Locale.ShortFormat);
            root.date = now.toLocaleDateString(locale);

예제 프로젝트 @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.