mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added translation preferences.
This commit is contained in:
parent
7aede75e43
commit
f82bae15f0
6 changed files with 119 additions and 26 deletions
|
@ -3390,6 +3390,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
"lng_translate_box_original" = "Original";
|
"lng_translate_box_original" = "Original";
|
||||||
"lng_translate_box_error" = "Translate failed.";
|
"lng_translate_box_error" = "Translate failed.";
|
||||||
|
|
||||||
|
"lng_translate_settings_subtitle" = "Translate Messages";
|
||||||
|
"lng_translate_settings_show" = "Show Translate Button";
|
||||||
|
"lng_translate_settings_choose" = "Do Not Translate";
|
||||||
|
"lng_translate_settings_about" = "The 'Translate' button will appear when you open a context menu on a text message.";
|
||||||
|
|
||||||
"lng_launch_exe_warning" = "This file has a {extension} extension.\nAre you sure you want to run it?";
|
"lng_launch_exe_warning" = "This file has a {extension} extension.\nAre you sure you want to run it?";
|
||||||
"lng_launch_svg_warning" = "Opening this file can potentially expose your IP address to its sender. Continue?";
|
"lng_launch_svg_warning" = "Opening this file can potentially expose your IP address to its sender. Continue?";
|
||||||
"lng_launch_exe_sure" = "Run";
|
"lng_launch_exe_sure" = "Run";
|
||||||
|
|
|
@ -23,18 +23,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/text/text_options.h"
|
#include "ui/text/text_options.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "storage/localstorage.h"
|
#include "storage/localstorage.h"
|
||||||
|
#include "boxes/translate_box.h"
|
||||||
#include "ui/boxes/confirm_box.h"
|
#include "ui/boxes/confirm_box.h"
|
||||||
#include "mainwidget.h"
|
#include "mainwidget.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "core/application.h"
|
#include "core/application.h"
|
||||||
#include "lang/lang_instance.h"
|
#include "lang/lang_instance.h"
|
||||||
#include "lang/lang_cloud_manager.h"
|
#include "lang/lang_cloud_manager.h"
|
||||||
|
#include "settings/settings_common.h"
|
||||||
#include "styles/style_layers.h"
|
#include "styles/style_layers.h"
|
||||||
#include "styles/style_boxes.h"
|
#include "styles/style_boxes.h"
|
||||||
#include "styles/style_info.h"
|
#include "styles/style_info.h"
|
||||||
#include "styles/style_passport.h"
|
#include "styles/style_passport.h"
|
||||||
#include "styles/style_chat_helpers.h"
|
#include "styles/style_chat_helpers.h"
|
||||||
#include "styles/style_menu_icons.h"
|
#include "styles/style_menu_icons.h"
|
||||||
|
#include "styles/style_settings.h"
|
||||||
|
|
||||||
#include <QtGui/QGuiApplication>
|
#include <QtGui/QGuiApplication>
|
||||||
#include <QtGui/QClipboard>
|
#include <QtGui/QClipboard>
|
||||||
|
@ -1096,6 +1099,44 @@ void LanguageBox::prepare() {
|
||||||
setTitle(tr::lng_languages());
|
setTitle(tr::lng_languages());
|
||||||
|
|
||||||
const auto topContainer = Ui::CreateChild<Ui::VerticalLayout>(this);
|
const auto topContainer = Ui::CreateChild<Ui::VerticalLayout>(this);
|
||||||
|
Settings::AddSubsectionTitle(
|
||||||
|
topContainer,
|
||||||
|
tr::lng_translate_settings_subtitle());
|
||||||
|
|
||||||
|
const auto translateEnabled = Settings::AddButton(
|
||||||
|
topContainer,
|
||||||
|
tr::lng_translate_settings_show(),
|
||||||
|
st::settingsButtonNoIcon
|
||||||
|
)->toggleOn(rpl::single(Core::App().settings().translateButtonEnabled()));
|
||||||
|
|
||||||
|
translateEnabled->toggledValue(
|
||||||
|
) | rpl::filter([](bool checked) {
|
||||||
|
return (checked != Core::App().settings().translateButtonEnabled());
|
||||||
|
}) | rpl::start_with_next([=](bool checked) {
|
||||||
|
Core::App().settings().setTranslateButtonEnabled(checked);
|
||||||
|
Core::App().saveSettingsDelayed();
|
||||||
|
}, translateEnabled->lifetime());
|
||||||
|
|
||||||
|
const auto label = lifetime().make_state<rpl::event_stream<QLocale>>();
|
||||||
|
const auto translateSkip = Settings::AddButtonWithLabel(
|
||||||
|
topContainer,
|
||||||
|
tr::lng_translate_settings_choose(),
|
||||||
|
label->events() | rpl::map(Ui::LanguageName),
|
||||||
|
st::settingsButtonNoIcon);
|
||||||
|
label->fire(QLocale(Core::App().settings().skipTranslationForLanguage()));
|
||||||
|
translateSkip->setClickedCallback([=] {
|
||||||
|
Ui::BoxShow(this).showBox(
|
||||||
|
Box(Ui::ChooseLanguageBox, [=](QLocale locale) {
|
||||||
|
label->fire(QLocale(locale));
|
||||||
|
Core::App().settings().setSkipTranslationForLanguage(
|
||||||
|
locale.language());
|
||||||
|
}),
|
||||||
|
Ui::LayerOption::KeepOther);
|
||||||
|
});
|
||||||
|
Settings::AddSkip(topContainer);
|
||||||
|
Settings::AddDividerText(
|
||||||
|
topContainer,
|
||||||
|
tr::lng_translate_settings_about());
|
||||||
|
|
||||||
const auto select = topContainer->add(
|
const auto select = topContainer->add(
|
||||||
object_ptr<Ui::MultiSelect>(
|
object_ptr<Ui::MultiSelect>(
|
||||||
|
|
|
@ -7,12 +7,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "boxes/translate_box.h"
|
#include "boxes/translate_box.h"
|
||||||
|
|
||||||
|
#include "core/application.h"
|
||||||
|
#include "core/core_settings.h"
|
||||||
#include "data/data_peer.h"
|
#include "data/data_peer.h"
|
||||||
#include "lang/lang_instance.h"
|
#include "lang/lang_instance.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
#include "main/main_session.h"
|
#include "main/main_session.h"
|
||||||
#include "mtproto/sender.h"
|
#include "mtproto/sender.h"
|
||||||
#include "settings/settings_common.h"
|
#include "settings/settings_common.h"
|
||||||
|
#include "spellcheck/platform/platform_language.h"
|
||||||
#include "ui/effects/loading_element.h"
|
#include "ui/effects/loading_element.h"
|
||||||
#include "ui/layers/generic_box.h"
|
#include "ui/layers/generic_box.h"
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
|
@ -73,13 +76,6 @@ namespace {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] QString LanguageName(const QLocale &locale) {
|
|
||||||
return (locale.language() == QLocale::English
|
|
||||||
&& locale.country() == QLocale::UnitedStates)
|
|
||||||
? u"English"_q
|
|
||||||
: locale.nativeLanguageName();
|
|
||||||
}
|
|
||||||
|
|
||||||
class ShowButton : public RpWidget {
|
class ShowButton : public RpWidget {
|
||||||
public:
|
public:
|
||||||
ShowButton(not_null<Ui::RpWidget*> parent);
|
ShowButton(not_null<Ui::RpWidget*> parent);
|
||||||
|
@ -129,6 +125,17 @@ rpl::producer<Qt::MouseButton> ShowButton::clicks() const {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
QString LanguageName(const QLocale &locale) {
|
||||||
|
if (locale.language() == QLocale::English
|
||||||
|
&& (locale.country() == QLocale::UnitedStates
|
||||||
|
|| locale.country() == QLocale::AnyCountry)) {
|
||||||
|
return u"English"_q;
|
||||||
|
} else {
|
||||||
|
const auto name = locale.nativeLanguageName();
|
||||||
|
return name.left(1).toUpper() + name.mid(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TranslateBox(
|
void TranslateBox(
|
||||||
not_null<Ui::GenericBox*> box,
|
not_null<Ui::GenericBox*> box,
|
||||||
not_null<PeerData*> peer,
|
not_null<PeerData*> peer,
|
||||||
|
@ -137,7 +144,8 @@ void TranslateBox(
|
||||||
box->setWidth(st::boxWideWidth);
|
box->setWidth(st::boxWideWidth);
|
||||||
box->addButton(tr::lng_box_ok(), [=] { box->closeBox(); });
|
box->addButton(tr::lng_box_ok(), [=] { box->closeBox(); });
|
||||||
const auto container = box->verticalLayout();
|
const auto container = box->verticalLayout();
|
||||||
const auto defaultId = Lang::LanguageIdOrDefault(Lang::Id());
|
const auto defaultId = QLocale(
|
||||||
|
Core::App().settings().skipTranslationForLanguage()).name().mid(0, 2);
|
||||||
|
|
||||||
const auto api = box->lifetime().make_state<MTP::Sender>(
|
const auto api = box->lifetime().make_state<MTP::Sender>(
|
||||||
&peer->session().mtp());
|
&peer->session().mtp());
|
||||||
|
@ -264,26 +272,32 @@ void TranslateBox(
|
||||||
if (loading->toggled()) {
|
if (loading->toggled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Ui::BoxShow(box).showBox(Box([=](not_null<GenericBox*> b) {
|
Ui::BoxShow(box).showBox(Box(ChooseLanguageBox, [=](QLocale locale) {
|
||||||
b->setTitle(tr::lng_languages());
|
state->locale.fire_copy(locale);
|
||||||
for (const auto &lang : Languages()) {
|
loading->show(anim::type::instant);
|
||||||
const auto locale = QLocale(lang);
|
translated->hide(anim::type::instant);
|
||||||
const auto button = Settings::AddButton(
|
send(locale.name().mid(0, 2));
|
||||||
b->verticalLayout(),
|
|
||||||
rpl::single(LanguageName(locale)),
|
|
||||||
st::defaultSettingsButton);
|
|
||||||
button->setClickedCallback([=] {
|
|
||||||
state->locale.fire_copy(locale);
|
|
||||||
loading->show(anim::type::instant);
|
|
||||||
translated->hide(anim::type::instant);
|
|
||||||
send(locale.name().mid(0, 2));
|
|
||||||
b->closeBox();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
b->addButton(tr::lng_cancel(), [=] { b->closeBox(); });
|
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChooseLanguageBox(
|
||||||
|
not_null<Ui::GenericBox*> box,
|
||||||
|
Fn<void(QLocale)> callback) {
|
||||||
|
box->setTitle(tr::lng_languages());
|
||||||
|
for (const auto &lang : Languages()) {
|
||||||
|
const auto locale = QLocale(lang);
|
||||||
|
const auto button = Settings::AddButton(
|
||||||
|
box->verticalLayout(),
|
||||||
|
rpl::single(LanguageName(locale)),
|
||||||
|
st::defaultSettingsButton);
|
||||||
|
button->setClickedCallback([=] {
|
||||||
|
callback(locale);
|
||||||
|
box->closeBox();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
@ -13,10 +13,16 @@ namespace Ui {
|
||||||
|
|
||||||
class GenericBox;
|
class GenericBox;
|
||||||
|
|
||||||
|
[[nodiscard]] QString LanguageName(const QLocale &locale);
|
||||||
|
|
||||||
void TranslateBox(
|
void TranslateBox(
|
||||||
not_null<Ui::GenericBox*> box,
|
not_null<Ui::GenericBox*> box,
|
||||||
not_null<PeerData*> peer,
|
not_null<PeerData*> peer,
|
||||||
MsgId msgId,
|
MsgId msgId,
|
||||||
TextWithEntities text);
|
TextWithEntities text);
|
||||||
|
|
||||||
|
void ChooseLanguageBox(
|
||||||
|
not_null<Ui::GenericBox*> box,
|
||||||
|
Fn<void(QLocale)> callback);
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
@ -267,7 +267,8 @@ QByteArray Settings::serialize() const {
|
||||||
<< qint32(_chatQuickAction)
|
<< qint32(_chatQuickAction)
|
||||||
<< qint32(_hardwareAcceleratedVideo ? 1 : 0)
|
<< qint32(_hardwareAcceleratedVideo ? 1 : 0)
|
||||||
<< qint32(_suggestAnimatedEmoji ? 1 : 0)
|
<< qint32(_suggestAnimatedEmoji ? 1 : 0)
|
||||||
<< qint32(_cornerReaction.current() ? 1 : 0);
|
<< qint32(_cornerReaction.current() ? 1 : 0)
|
||||||
|
<< qint32(_skipTranslationForLanguage);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -361,6 +362,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||||
qint32 chatQuickAction = static_cast<qint32>(_chatQuickAction);
|
qint32 chatQuickAction = static_cast<qint32>(_chatQuickAction);
|
||||||
qint32 suggestAnimatedEmoji = _suggestAnimatedEmoji ? 1 : 0;
|
qint32 suggestAnimatedEmoji = _suggestAnimatedEmoji ? 1 : 0;
|
||||||
qint32 cornerReaction = _cornerReaction.current() ? 1 : 0;
|
qint32 cornerReaction = _cornerReaction.current() ? 1 : 0;
|
||||||
|
qint32 skipTranslationForLanguage = _skipTranslationForLanguage;
|
||||||
|
|
||||||
stream >> themesAccentColors;
|
stream >> themesAccentColors;
|
||||||
if (!stream.atEnd()) {
|
if (!stream.atEnd()) {
|
||||||
|
@ -558,6 +560,9 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||||
if (!stream.atEnd()) {
|
if (!stream.atEnd()) {
|
||||||
stream >> cornerReaction;
|
stream >> cornerReaction;
|
||||||
}
|
}
|
||||||
|
if (!stream.atEnd()) {
|
||||||
|
stream >> skipTranslationForLanguage;
|
||||||
|
}
|
||||||
if (stream.status() != QDataStream::Ok) {
|
if (stream.status() != QDataStream::Ok) {
|
||||||
LOG(("App Error: "
|
LOG(("App Error: "
|
||||||
"Bad data for Core::Settings::constructFromSerialized()"));
|
"Bad data for Core::Settings::constructFromSerialized()"));
|
||||||
|
@ -727,6 +732,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
|
||||||
}
|
}
|
||||||
_suggestAnimatedEmoji = (suggestAnimatedEmoji == 1);
|
_suggestAnimatedEmoji = (suggestAnimatedEmoji == 1);
|
||||||
_cornerReaction = (cornerReaction == 1);
|
_cornerReaction = (cornerReaction == 1);
|
||||||
|
_skipTranslationForLanguage = skipTranslationForLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Settings::getSoundPath(const QString &key) const {
|
QString Settings::getSoundPath(const QString &key) const {
|
||||||
|
@ -1036,4 +1042,19 @@ float64 Settings::DefaultDialogsWidthRatio() {
|
||||||
: kDefaultDialogsWidthRatio;
|
: kDefaultDialogsWidthRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Settings::setTranslateButtonEnabled(bool value) {
|
||||||
|
_skipTranslationForLanguage = std::abs(_skipTranslationForLanguage)
|
||||||
|
* (value ? 1 : -1);
|
||||||
|
}
|
||||||
|
bool Settings::translateButtonEnabled() const {
|
||||||
|
return _skipTranslationForLanguage > 0;
|
||||||
|
}
|
||||||
|
void Settings::setSkipTranslationForLanguage(QLocale::Language language) {
|
||||||
|
const auto enabled = translateButtonEnabled();
|
||||||
|
_skipTranslationForLanguage = language * (enabled ? 1 : -1);
|
||||||
|
}
|
||||||
|
QLocale::Language Settings::skipTranslationForLanguage() const {
|
||||||
|
return QLocale::Language(std::abs(_skipTranslationForLanguage));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
|
@ -722,6 +722,11 @@ public:
|
||||||
return _chatQuickAction;
|
return _chatQuickAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setTranslateButtonEnabled(bool value);
|
||||||
|
[[nodiscard]] bool translateButtonEnabled() const;
|
||||||
|
void setSkipTranslationForLanguage(QLocale::Language language);
|
||||||
|
[[nodiscard]] QLocale::Language skipTranslationForLanguage() const;
|
||||||
|
|
||||||
[[nodiscard]] static bool ThirdColumnByDefault();
|
[[nodiscard]] static bool ThirdColumnByDefault();
|
||||||
[[nodiscard]] static float64 DefaultDialogsWidthRatio();
|
[[nodiscard]] static float64 DefaultDialogsWidthRatio();
|
||||||
[[nodiscard]] static qint32 SerializePlaybackSpeed(float64 speed) {
|
[[nodiscard]] static qint32 SerializePlaybackSpeed(float64 speed) {
|
||||||
|
@ -836,6 +841,7 @@ private:
|
||||||
#endif // Q_OS_MAC
|
#endif // Q_OS_MAC
|
||||||
HistoryView::DoubleClickQuickAction _chatQuickAction =
|
HistoryView::DoubleClickQuickAction _chatQuickAction =
|
||||||
HistoryView::DoubleClickQuickAction();
|
HistoryView::DoubleClickQuickAction();
|
||||||
|
int _skipTranslationForLanguage = -int(QLocale::English);
|
||||||
|
|
||||||
bool _tabbedReplacedWithInfo = false; // per-window
|
bool _tabbedReplacedWithInfo = false; // per-window
|
||||||
rpl::event_stream<bool> _tabbedReplacedWithInfoValue; // per-window
|
rpl::event_stream<bool> _tabbedReplacedWithInfoValue; // per-window
|
||||||
|
|
Loading…
Add table
Reference in a new issue