이 페이지에서

지역화된 시계 예시

이 예제는 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 파일로 컴파일함으로써 lupdate 및 lrelease 의 기능을 통합합니다. 다음 TS 파일이 생성됩니다:

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

qt_add_qml_module(...): URI qtexamples.localizedclock 아래에 Main.qml 파일을 포함한 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::English) {
        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()을 사용하여 소스 텍스트 "Locale: %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

© 2026 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.