С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577

Динамический перевод приложения

02.01.2021, 00:09. Показов 4257. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, необходимо сделать динамический перевод приложения. На данный момент реализовал перевод с перезагрузкой приложения, т.е. выбираем язык, записываем значение в реестр, перезапускаем приложение, вытягиваем с реестра значение и подставляем соответствующий файл переводов. Хотелось бы убрать эту перезагрузку и менять перевод динамически. Пробовал как здесь https://evileg.com/ru/post/153/, но код довольно громоздкий и малопонятный, да и компилятор ругается на устаревшие вещи, типа currentIndexChanged.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.01.2021, 00:09
Ответы с готовыми решениями:

Динамический перевод
Всем привет. В приложении много форм, привязаны два языка. Переключение идёт в меню. Все переводится, работает. Но на лету обновляется...

Перевод статического массива в динамический
Данная программа работает, но ее необходимо переделать под динамический массив. НЕ НАДО менять библ ввода и вывода на cout, если возможно...

Перевод из статического массива в динамический. (двумерный)
как это сделать? или кто может - сразу, код: #include <iostream.h> #include <iomanip.h> #include <conio.h> int main() { ...

27
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 10:30
Разве нельзя максимально просто? Все надписи в приложении выводятся на экран из строкового массива. Массивов два - с английским и русским текстом. Просто когда нужно, менять массив и перерисовывать окно приложения.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 11:58
Примерно так, без реестра, без файла, без перезагрузки:
Миниатюры
Динамический перевод приложения  
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
03.01.2021, 12:14
Цитата Сообщение от alexu_007 Посмотреть сообщение
Разве нельзя максимально просто?
В Qt предусмотрен перевод без перезагрузки.
А что что вы предлагаете, ппц какой жуткий костыль.
Миниатюры
Динамический перевод приложения  
2
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 12:22
Ну да, а с реестром костыль меньше... Понятно, я сделал максимально просто, без всяких красивых меню. То, что можно за час накидать, включая и само тестовое приложение. И ведь работает.
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
03.01.2021, 12:24
Дело не в реестре и не в меню.
В Qt встроена отличная система перевода, которую вы проигнорировали и предложили вместо неё костыль.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 13:41
Ну, вопрос был задан? Я предложил костыль, вы предложили официальный метод - пусть выбирает.

Добавлено через 10 минут
Ну посмотрел я этот официальный перевод - там ппц сколько телодвижений сделать нужно. Только для того, что-бы поменять текст в метках.
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
03.01.2021, 13:49
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ну посмотрел я этот официальный перевод - там ппц сколько телодвижений сделать нужно. Только для того, что-бы поменять текст в метках.
Перейдёшь небольшой порог объёма программы, и официальный способ станет очень простым, а костыль будет всё расти и расти, пока вся программа не станет костылём и не сдохнет.
0
692 / 464 / 162
Регистрация: 01.10.2015
Сообщений: 1,273
03.01.2021, 13:56
Цитата Сообщение от alexu_007 Посмотреть сообщение
там ппц сколько телодвижений сделать нужно.
И сколько же? Тем более, сравнивая с ручным вводом немаленьких C-style массивов, т.е. методом, предлагаемым вами. Просто вы предлагаете более низко-уровневый подход. Особенно, при наличии стандартного метода, предоставляемого самим фреймворком. Предлагаете "закат Солнца вручную", так обоснуйте его преимущества. Штатный метод позволяет унифицировать перевод, избежать перезагрузки, хардкодинга "магических" массивов. А выше вам пояснили то же самое, только более лаконично.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 15:18
Может быть. Я не программист и не пишу больших программ.
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
03.01.2021, 18:59
Teylor, переводы в Qt делать нужно (если правильно, а не через костыли) при помощи встроенной утилиты Linguist. И сделать это гораздо проще, чем городить собственные костыли. Если что, ищите примеры в интернете или скачайте книгу "Qt 4.7 Практическое программирование на С++" (Андрей Боровский). В книге на странице 24 разобран пример как сделать собственный перевод. Там всё очень и очень просто. Если будете использовать этот метод. То создайте новый проект и в самом конце. Файл перевода (.ts) можно создать не так как описано в этой книге (через консоль), а в самом креаторе, когда будете создавать новый проект. Дальше открываете его утилитой Linguist из самого креатора и пишите нужный перевод
1
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 21:22
Никто не хотел помогать, пока я не влез со своим костылём... Мотивация!
1
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
03.01.2021, 21:28  [ТС]
Recrut_rf, Linguist'ом пользуюсь давно, даже не знаю как можно обойтись без него. Как создавать .ts файлы не суть важно, что так, что эдак делается за минуту. Но вот с динамическим изменением все также проблемы. Еще могу понять, когда меняешь язык в приложении с одним окном, а когда во время смены у тебя их 2+...
За книгу спасибо.
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
03.01.2021, 22:02
installTranslator для установки языка.

Для реакции на это:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void WindowEditor::changeEvent(QEvent *e)
{
  QWidget::changeEvent(e);
 
  switch (e->type()) {
    case QEvent::LanguageChange:
      ui->retranslateUi(this);
      break;
 
    default:
      break;
  }
}
Не работает?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
03.01.2021, 22:24
Цитата Сообщение от Teylor Посмотреть сообщение
Но вот с динамическим изменением все также проблемы.
У меня нет проблем:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "widget.h"
#include "ui_widget.h"
 
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    str_RU << "Программа вычисляет сумму трёх чисел:" << "Введите число 1:" <<
              "Введите число 2:" << "Введите число 3:" << "Сумма:" <<
              "Вычислить сумму";
 
    str_EN << "The program calculates the sum of three numbers:" << "Enter the number 1:" <<
              "Enter the number 2:" << "Enter the number 3:" << "Amount:" <<
              "Calculate the amount";
 
    print_labels(0);
 
    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
    QObject::connect(ui->radioButton_1,SIGNAL(pressed()),this,SLOT(press_radiobtn_1()));
    QObject::connect(ui->radioButton_2,SIGNAL(pressed()),this,SLOT(press_radiobtn_2()));
}
 
 
 
Widget::~Widget()
{
    delete ui;
}
 
 
 
void Widget::print_labels(bool b)
{
    QStringList str_out;
 
    if(!b)  str_out = str_RU;
    else    str_out = str_EN;
 
    ui->label_01->setText(str_out.at(0));
    ui->label_02->setText(str_out.at(1));
    ui->label_03->setText(str_out.at(2));
    ui->label_04->setText(str_out.at(3));
    ui->label_05->setText(str_out.at(4));
 
    ui->pbtn_01->setText(str_out.at(5));
}
 
 
 
void Widget::press_pbtn_01()
{
    QString str;
    quint32 a ,b, c, sum;
 
    str = ui->lineEdit_1->text();
    a = str.toInt();
    str = ui->lineEdit_2->text();
    b = str.toInt();
    str = ui->lineEdit_3->text();
    c = str.toInt();
 
    sum = a + b + c;
    ui->lineEdit_4->setText(QString::number(sum));
}
 
 
 
void Widget::press_radiobtn_1()
{
    print_labels(0);
}
 
 
 
void Widget::press_radiobtn_2()
{
    print_labels(1);
}

Еще могу понять, когда меняешь язык в приложении с одним окном, а когда во время смены у тебя их 2+...
Для каждого окна пишешь свой костыль, а переключаешь всё по глобальной переменной, которую видно во всех окнах.
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
04.01.2021, 16:25  [ТС]
Rius, неа. Пробовал как здесь https://evileg.com/ru/post/153/, потом также, но с вашим обработчиком события, ничего не меняется.
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
04.01.2021, 16:26
Teylor, в одном окне меняется, в двух уже нет?
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
04.01.2021, 17:08  [ТС]
Rius, да даже в одном не меняется.
0
Эксперт .NET
 Аватар для Rius
13058 / 7623 / 1665
Регистрация: 25.05.2015
Сообщений: 23,165
Записей в блоге: 14
04.01.2021, 17:11
В одном - меняется. Пример выше. Исходники вы видели.
Если у вас не получается воспроизвести, вы что-то упускаете.
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
04.01.2021, 17:13  [ТС]
.pro
C++ (Qt)
1
2
3
TRANSLATIONS += translations/russian.ts \
    translations/ukrainian.ts \
    translations/english.ts
SettingsWindow.h
C++ (Qt)
1
2
3
4
5
6
7
#include <QTranslator>
 
protected:
    void changeEvent(QEvent * event) override;
 
private:
    QTranslator qtLanguageTranslator;
[B]Settings.cpp[B]
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "SettingsWindow.h"
#include "ui_SettingsWindow.h"
 
SettingsWindow::SettingsWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SettingsWindow)
{
    ui->setupUi(this);
 
    ui->languageSelection->addItems(QStringList() << "Русский" << "Українська" << "English");
 
    connect(ui->languageSelection, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
                [=]{
            qtLanguageTranslator.load("ukrainian");   // Загружаем перевод
            qApp->installTranslator(&qtLanguageTranslator);        // Устанавливаем перевод в приложение
        });
 
        // Сделаем первоначальную инициализацию перевода для окна прилоежния
        qtLanguageTranslator.load(QString("russian"));
        qApp->installTranslator(&qtLanguageTranslator);
}
 
SettingsWindow::~SettingsWindow()
{
    delete ui;
}
 
void SettingsWindow::changeEvent(QEvent *event)
{
  QWidget::changeEvent(event);
 
  switch (event->type()) {
    case QEvent::LanguageChange:
      ui->retranslateUi(this);
      break;
 
    default:
      break;
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2021, 17:13
Помогаю со студенческими работами здесь

Динамический класс на основе двусвязного списка(перевод кода с Java на С++)
Логика задачи: Создать динамический класс Route на основе двусвязного списка, где каждый элемент типа stop (стоп). Класс должен...

Построение динамического массива в функции и его перевод в глобальный динамический массив
Здравствуйте, моя проблема заключается в передаче построеного в функции динамического массива fdarray в глобальный динамический массив...

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

Динамический прицел для игры (изображение поверх directX приложения)
Вообщем мне требуется написать программ. Смысл в следующем: Игра-шутер (directX приложение) не имеет крестика по центру экрана. При...

Перевод приложения
Здравствуйте форумчане! Хочу перевести игру &quot;Кто хочет стать миллионером&quot; с русского на один из языков. Есть одна проблемка, распаковал апк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru