Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 684
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме QtВсе вопросы
QtMiddleПроектирование систем

Как обрабатывать интернационализацию (i18n) и локализацию в Qt?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Строки помечаются макросом tr(), извлекаются утилитой lupdate в .ts файлы, переводятся в Linguist, компилируются lrelease в .qm и загружаются через QTranslator::load() + QApplication::installTranslator().

Шаг 1: пометка строк в коде

#include <QObject>
#include <QString>

class MyDialog : public QDialog {
    Q_OBJECT
public:
    MyDialog(QWidget *parent = nullptr) : QDialog(parent) {
        // tr() — основной макрос для переводимых строк
        setWindowTitle(tr("Settings"));

        // Контекстная подсказка для переводчика
        label->setText(tr("File", "menu item"));

        // Множественное число
        statusLabel->setText(tr("%n file(s) found", "", fileCount));

        // tr() вне класса QObject
        QString msg = QCoreApplication::translate("MyDialog", "Error");
    }
};

Интернационализация и локализация в Qt

Qt предоставляет полный инструментарий для i18n: макрос tr() для пометки строк, утилиты lupdate / lrelease для работы с файлами переводов и класс QTranslator для загрузки перевода во время выполнения.

Шаг 2: объявление файлов переводов в .pro / CMake

# CMakeLists.txt (Qt 6 + CMake)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets LinguistTools)

set(TS_FILES
    translations/myapp_ru.ts
    translations/myapp_de.ts
)

qt_add_translations(
    myapp                  # target
    TS_FILES ${TS_FILES}
    QM_FILES_OUTPUT_VARIABLE QM_FILES
)

# Ресурсы автоматически встраиваются в бинарник
qt_add_resources(myapp "translations"
    PREFIX "/i18n"
    FILES ${QM_FILES}
)

Шаг 3: извлечение и компиляция переводов

# Извлечь строки из исходников в .ts файлы
lupdate src/ -ts translations/myapp_ru.ts translations/myapp_de.ts

# Открыть GUI-редактор переводов
linguist translations/myapp_ru.ts

# Скомпилировать .ts -> .qm (бинарные файлы перевода)
lrelease translations/myapp_ru.ts -qm translations/myapp_ru.qm

Шаг 4: загрузка перевода в runtime

#include <QApplication>
#include <QTranslator>
#include <QLocale>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QTranslator translator;
    // QLocale::system() определяет язык ОС
    const QString locale = QLocale::system().name(); // например, "ru_RU"

    // Загрузка из ресурсов Qt
    if (translator.load(":/i18n/myapp_" + locale)) {
        app.installTranslator(&translator);
    }

    // Можно загрузить Qt-переводы для стандартных диалогов
    QTranslator qtTranslator;
    qtTranslator.load(":/i18n/qt_" + locale);
    app.installTranslator(&qtTranslator);

    MainWindow w;
    w.show();
    return app.exec();
}

Динамическое переключение языка

void MainWindow::changeLanguage(const QString &locale) {
    static QTranslator *current = nullptr;
    if (current) {
        qApp->removeTranslator(current);
        delete current;
    }
    current = new QTranslator(this);
    if (current->load(":/i18n/myapp_" + locale)) {
        qApp->installTranslator(current);
    }
    // Qt автоматически пошлёт QEvent::LanguageChange всем виджетам
    // Переопределите changeEvent() для повторной установки текстов
}

void MainWindow::changeEvent(QEvent *e) {
    if (e->type() == QEvent::LanguageChange) {
        ui->retranslateUi(this); // если используется Qt Designer
        // или вручную: label->setText(tr("Settings"));
    }
    QMainWindow::changeEvent(e);
}

Форматирование чисел, дат, валют

QLocale locale(QLocale::Russian, QLocale::Russia);

// Числа
qDebug() << locale.toString(1234567.89, 'f', 2); // "1 234 567,89"

// Даты
qDebug() << locale.toString(QDate::currentDate(), QLocale::LongFormat);

// Валюта (Qt не имеет встроенного форматирования валюты — используйте ICU или собственный шаблон)
qDebug() << locale.currencySymbol(); // "руб."

Подводные камни

  • Конкатенация строк вместо %1: tr("Hello") + name — непереводимо; используйте tr("Hello %1").arg(name).
  • tr() вне класса QObject: tr() недоступна в глобальных функциях; используйте QCoreApplication::translate("context", "string").
  • Забытый lupdate после изменений: новые строки не появятся в .ts файле автоматически — нужно перезапускать lupdate.
  • Отсутствие LanguageChange в динамическом переключении: если не переопределить changeEvent(), уже показанные виджеты остаются с текстами предыдущего языка.
  • Жёстко закодированные строки в .ui файлах: Qt Designer помечает строки как переводимые по умолчанию, но если снять галочку — lupdate их пропустит.
  • Множественное число без %n: ручная конкатенация вроде tr("%1 файлов").arg(n) не работает для языков со сложными правилами множественного числа (русский, арабский); используйте только tr("%n", "", n).
  • Кодировка .ts файлов: .ts — это XML в UTF-8; открытие в редакторе с другой кодировкой портит строки с кириллицей.
  • QLocale vs системный язык: QLocale::system() на Windows может вернуть en_US, даже если пользователь выбрал другой язык интерфейса — проверяйте QLocale::system().uiLanguages().

Частые вопросы на собеседовании

  • Как Qt работает с многопоточностью? Что такое QThread и паттерн worker-object?
  • Как работает управление памятью в Qt?
  • В каких проектах Qt оправдан, а где он становится источником лишней сложности?
  • Что такое иерархия объектов Qt и как работает владение по принципу parent-child?

Типичные ошибки

  • Объяснять i18n и localization только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Смешивать signals/slots с generic callbacks и забывать про thread affinity.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для i18n и localization, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.
  • Понимает границу между C++ кодом, runtime/framework metadata и editor/UI слоем.

Как вы знаете этот вопрос?

Проверить себя по теме Qt →

Источники

  • https://doc.qt.io/qt-6/internationalization.html

Связанные темы

Qtobject-lifetimeperformance-debuggingui-architecture