LINUX.ORG.RU

Я победил переводы программ на Qt + cmake и имею сказать много матов

 , ,


1

4

Во-первых, я сам не люблю писать документацию, но ска, хотя бы пример использования то авторы могли накропать в доку. В общем держите:

function(IWANTTRANSLATIONS PROJECT )
    qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES ru)

    qt_add_translations(${PROJECT} QM_FILES ${TS_FILES}
        INCLUDE_DIRECTORIES ${PROJECT})
    add_dependencies(${PROJECT} ${PROJECT}_lupdate)
    add_dependencies(${PROJECT} update_translations)
    set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}_ru.qm
        PROPERTIES QT_RESOURCE_ALIAS "${PROJECT}_ru_RU.qm"
    )
    qt_add_resources(${PROJECT} ${PROJECT}_translations.qrc
        PREFIX /translations
            FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}_ru.qm)
endfunction()

Можно объявить в корневом CMakeFiles.txt и потом в подкаталогах накатывать с помощью iwanttranslations(projectname)

Похлопайте мне что ли, я кресло прожег пока разбирался.

Похлопайте мне что ли, я кресло прожег пока разбирался….

если ты программист то ты сделал свою работу за которую тебе платят деньги, что не так?

если ты не программист - занимайся своими делами а не делами программирования!

anonymous2 ★★★★★
()

Смени стул и объясни какую проблему ты решал. А потом попробуй сделать решение, которое работает с Qt4, Qt5 и Qt6.

anonymous
()

Ммм.. сладкая и вкусная макрокаша вместо нормальных

    ShowMessage(Qt::Translate(Translate::TR_USER_ISWRONG), number);

Где в человекочитаемом файле объявляется массив значений

enum Translate {
    ...
    TR_USER_ISWRONG,
    ...

TranslateValues[] = {
    ...
    [TR_USER_ISWRONG] = "Пацан, твой %d - фигня"
    ...

Ну или вообще во внешнем файле, который будет интегрироваться:

    "translations" : {
        ...
        "TR_USER_ISWRONG" : "Пацан, твой %d - фигня",
        ...
PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

TR_USER_ISWRONG

Суррогатные идентификаторы для строк? Фу. Подход gettext с идентификаторами-строками на дефлотном языке гораздо разумнее.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 2)

Во-первых, я сам не люблю писать документацию

Я сегодня написал прожку для автоматизации перевода документации, правда заточенную для PureBasic, а потому что тоже не хочу ручками делать, пусть скрипт и Google сделают это за меня.

AZJIO
()
Ответ на: комментарий от PPP328

Дада, разумнее. Особенно когда у тебя в языке оригинале там одно слово но в разных контекстах разный перевод.

На, охлаждайся: https://doc.qt.io/qt-6/i18n-source-translation.html#disambiguate-identical-text

anonymous
()
Ответ на: комментарий от anonymous2

если ты программист то ты сделал свою работу за которую тебе платят деньги, что не так?

если ты не программист - занимайся своими делами а не делами программирования!

А всегда ли платят за саморазвитие? Как один мне сказал, когда я был молодым «Всё что вложишь в себя то и будет». У нас на работе можно не уходить с работы и помрёшь «дураком».

AZJIO
()
Ответ на: комментарий от Dr64h

для примера можешь сам создать проект в креаторе, добавить пару переведенных строк и убедиться что файл переводов вообще никто не трогает и не заполняет. и далее его надо еще бы в сам бинарник включить бы.

ckotctvo
() автор топика
Ответ на: комментарий от anonymous

Ровно 0 человек это использует. Ещё не видел программы, где программист разделял бы такие значения. Потому что чтобы это разделять, нужно понимать, что это слово может иметь разный контекст в разных ситуациях в другом языке. Надпись «назад», когда речь идёт о «front/back» тому доказательство.

PPP328 ★★★★★
()
Ответ на: комментарий от ckotctvo
cmake_minimum_required(VERSION 3.24)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)

project("hello_tr")

add_executable(${PROJECT_NAME} "src/main.cpp")

find_package(Qt6 REQUIRED COMPONENTS Core LinguistTools CONFIG)

target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core)

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES ru)

qt6_add_translations(${PROJECT_NAME}
    TS_OUTPUT_DIRECTORY "translations"
    QM_OUTPUT_DIRECTORY "translations")
#include <QDebug>

#include <QCoreApplication>
#include <QTranslator>
#include <QString>

int main(int argc, char* argv[])
{
    QCoreApplication app{argc, argv};
    QTranslator translator{};
    QString locale_str{app.arguments().isEmpty() ? "en" : app.arguments().at(1)};
    bool res{};

    res = translator.load(
        qApp->applicationName() + "_" + locale_str,
        qApp->applicationDirPath() + "/translations"
    );

    qDebug() << "LOAD_RESULT:" << res;

    res = qApp->installTranslator(&translator);

    qDebug() << "INSTALL_RESULT:" << res;

    QString test_str{QObject::tr("Hello, World!")};

    qDebug() << "LOCALE:" << locale_str;
    qDebug() << "TEST_STRING:" << test_str;

    return app.exec();
}
cmake -B build

cmake --build ./build --target update_translations

sed -i -e 's/<translation type="unfinished"><\/translation>/<translation>Привет, Мир!<\/translation>/g' ./translations/hello_tr_ru.ts

cmake --build ./build

./build/hello_tr en
LOAD_RESULT: true
INSTALL_RESULT: true
LOCALE: "en"
TEST_STRING: "Hello, World!"

./build/hello_tr ru
LOAD_RESULT: true
INSTALL_RESULT: true
LOCALE: "ru"
TEST_STRING: "Привет, Мир!"
Dr64h ★★★★
()
Последнее исправление: Dr64h (всего исправлений: 1)
Ответ на: комментарий от ckotctvo

на qmake оно еще и работает. просто берет и работает само.

Если проще на нём, то используй его. У меня вообще несколько систем сборки поддерживается одновременно.

Dr64h ★★★★
()
Ответ на: комментарий от Dr64h

5й qt? видимо дело в версии. я уже матерился на то как поломали QTextEditor в 6м и до 6.11 он был неюзабелен. Переводы не работают из коробки. И тут еще и QSettings не может не то сохранить, не то прочитать массивы… Походу они освоили ИИ или педермэнов набрали чтоб ESG получить

ckotctvo
() автор топика
Ответ на: комментарий от ckotctvo

В пятой версии у них криво всё было, в шестой более менее сделали.

Для пятой вроде нужно использовать qt5_create_translation и qt5_add_translation, по сравнению с шестой много ручной возни надо делать.

И тут еще и QSettings не может не то сохранить, не то прочитать массивы…

Не знаю что там, я когда им пользовался мне он не таким гибким показался и я перешёл на KDE'шный заменитель, а потом вообще свой формат написал.

Dr64h ★★★★
()
Ответ на: комментарий от Dr64h

ну не знаю. я столкнулся с тем что на 6.11 само по себе не работает. надо руками добавлять в зависимости перевод.

«сарай загадок» только от программирования

ckotctvo
() автор топика
Ответ на: комментарий от ckotctvo

Там отдельно таргет update_translations надо дёргать, я выше уже привел пример как, но можно и в cmake по умолчанию к сборке исполняемого файла прикрутить.

Dr64h ★★★★
()
Ответ на: комментарий от PPP328

Ещё не видел программы, где программист разделял бы такие значения.

Ага, для перечислений программист разделяет такие значения, а тут нет.

anonymous
()

У меня в проекте чтобы подключить переводы понадобилось добавить только qt_add_translations(${PROJECT} TS_FILES translations/ru.rs и всё работает. Сдаётся мне, ты недочитал доку и обвелосипедился.

anonymous
()