mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-07 23:53:58 +02:00
Correct implementation of auto-translation.
This commit is contained in:
parent
d9016b7979
commit
10e4c59f2e
6 changed files with 41 additions and 31 deletions
|
@ -4292,6 +4292,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
"lng_sensitive_toast" = "You can update the visibility of sensitive media in **Settings > Chat Settings > Sensitive content**";
|
"lng_sensitive_toast" = "You can update the visibility of sensitive media in **Settings > Chat Settings > Sensitive content**";
|
||||||
|
|
||||||
"lng_translate_show_original" = "Show Original";
|
"lng_translate_show_original" = "Show Original";
|
||||||
|
"lng_translate_return_original" = "View Original ({language})";
|
||||||
"lng_translate_bar_to" = "Translate to {name}";
|
"lng_translate_bar_to" = "Translate to {name}";
|
||||||
"lng_translate_bar_to_other" = "Translate to {name}";
|
"lng_translate_bar_to_other" = "Translate to {name}";
|
||||||
"lng_translate_menu_to" = "Translate To";
|
"lng_translate_menu_to" = "Translate To";
|
||||||
|
|
|
@ -1116,29 +1116,37 @@ void Controller::fillAutoTranslateButton() {
|
||||||
[] {},
|
[] {},
|
||||||
st::manageGroupTopicsButton,
|
st::manageGroupTopicsButton,
|
||||||
{ &st::menuIconTranslate }));
|
{ &st::menuIconTranslate }));
|
||||||
const auto toggled = autotranslate->lifetime().make_state<
|
struct State {
|
||||||
rpl::event_stream<bool>
|
rpl::event_stream<bool> toggled;
|
||||||
>();
|
rpl::variable<bool> isLocked = false;
|
||||||
|
};
|
||||||
|
const auto state = autotranslate->lifetime().make_state<State>();
|
||||||
autotranslate->toggleOn(rpl::single(
|
autotranslate->toggleOn(rpl::single(
|
||||||
channel->autoTranslation()
|
channel->autoTranslation()
|
||||||
) | rpl::then(toggled->events()));
|
) | rpl::then(state->toggled.events()));
|
||||||
const auto isLocked = channel->levelHint() < requiredLevel;
|
state->isLocked = (channel->levelHint() < requiredLevel);
|
||||||
const auto reason = Ui::AskBoostReason{
|
const auto reason = Ui::AskBoostReason{
|
||||||
.data = Ui::AskBoostAutotranslate{ .requiredLevel = requiredLevel },
|
.data = Ui::AskBoostAutotranslate{ .requiredLevel = requiredLevel },
|
||||||
};
|
};
|
||||||
|
|
||||||
autotranslate->setToggleLocked(isLocked);
|
state->isLocked.value() | rpl::start_with_next([=](bool locked) {
|
||||||
|
autotranslate->setToggleLocked(locked);
|
||||||
|
}, autotranslate->lifetime());
|
||||||
|
|
||||||
autotranslate->toggledChanges(
|
autotranslate->toggledChanges(
|
||||||
) | rpl::start_with_next([=](bool value) {
|
) | rpl::start_with_next([=](bool value) {
|
||||||
if (!isLocked) {
|
if (!state->isLocked.current()) {
|
||||||
_autotranslateSavedValue = toggled;
|
_autotranslateSavedValue = value;
|
||||||
} else if (value) {
|
} else if (value) {
|
||||||
toggled->fire(false);
|
state->toggled.fire(false);
|
||||||
|
auto weak = Ui::MakeWeak(autotranslate);
|
||||||
CheckBoostLevel(
|
CheckBoostLevel(
|
||||||
_navigation->uiShow(),
|
_navigation->uiShow(),
|
||||||
_peer,
|
_peer,
|
||||||
[=](int level) {
|
[=](int level) {
|
||||||
|
if (const auto strong = weak.data()) {
|
||||||
|
state->isLocked = (level < requiredLevel);
|
||||||
|
}
|
||||||
return (level < requiredLevel)
|
return (level < requiredLevel)
|
||||||
? std::make_optional(reason)
|
? std::make_optional(reason)
|
||||||
: std::nullopt;
|
: std::nullopt;
|
||||||
|
|
|
@ -3686,6 +3686,11 @@ void History::translateOfferFrom(LanguageId id) {
|
||||||
}
|
}
|
||||||
} else if (!_translation) {
|
} else if (!_translation) {
|
||||||
_translation = std::make_unique<HistoryTranslation>(this, id);
|
_translation = std::make_unique<HistoryTranslation>(this, id);
|
||||||
|
using Flag = PeerData::TranslationFlag;
|
||||||
|
if (peer->autoTranslation()
|
||||||
|
&& (peer->translationFlag() == Flag::Enabled)) {
|
||||||
|
translateTo(Core::App().settings().translateTo());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_translation->offerFrom(id);
|
_translation->offerFrom(id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7557,10 +7557,6 @@ void HistoryWidget::checkLastPinnedClickedIdReset(
|
||||||
void HistoryWidget::setupTranslateBar() {
|
void HistoryWidget::setupTranslateBar() {
|
||||||
Expects(_history != nullptr);
|
Expects(_history != nullptr);
|
||||||
|
|
||||||
if (_history->peer->autoTranslation()) {
|
|
||||||
_history->translateTo(Core::App().settings().translateTo());
|
|
||||||
}
|
|
||||||
|
|
||||||
_translateBar = std::make_unique<HistoryView::TranslateBar>(
|
_translateBar = std::make_unique<HistoryView::TranslateBar>(
|
||||||
this,
|
this,
|
||||||
controller(),
|
controller(),
|
||||||
|
|
|
@ -372,11 +372,16 @@ void TranslateBar::setup(not_null<History*> history) {
|
||||||
const auto&,
|
const auto&,
|
||||||
const auto&) {
|
const auto&) {
|
||||||
using Flag = PeerData::TranslationFlag;
|
using Flag = PeerData::TranslationFlag;
|
||||||
//const auto autotranslation = history->peer->autoTranslation();
|
const auto automatic = history->peer->autoTranslation();
|
||||||
return (history->peer->translationFlag() != Flag::Enabled)
|
return (history->peer->translationFlag() != Flag::Enabled)
|
||||||
? rpl::single(QString())
|
? rpl::single(QString())
|
||||||
: history->translatedTo()
|
: history->translatedTo()
|
||||||
? tr::lng_translate_show_original()
|
? (automatic
|
||||||
|
? tr::lng_translate_return_original(
|
||||||
|
lt_language,
|
||||||
|
rpl::single(Ui::LanguageName(
|
||||||
|
history->translateOfferedFrom())))
|
||||||
|
: tr::lng_translate_show_original())
|
||||||
: history->translateOfferedFrom()
|
: history->translateOfferedFrom()
|
||||||
? Ui::TranslateBarTo(to)
|
? Ui::TranslateBarTo(to)
|
||||||
: rpl::single(QString());
|
: rpl::single(QString());
|
||||||
|
|
|
@ -53,28 +53,23 @@ void TranslateTracker::setup() {
|
||||||
const auto peer = _history->peer;
|
const auto peer = _history->peer;
|
||||||
peer->updateFull();
|
peer->updateFull();
|
||||||
|
|
||||||
using namespace rpl::mappers;
|
|
||||||
_trackingLanguage = rpl::combine(
|
|
||||||
Data::AmPremiumValue(&_history->session()),
|
|
||||||
Core::App().settings().translateChatEnabledValue(),
|
|
||||||
_1 && _2);
|
|
||||||
|
|
||||||
const auto channel = peer->asChannel();
|
const auto channel = peer->asChannel();
|
||||||
auto autoTranslationValue = (channel
|
auto autoTranslationValue = (channel
|
||||||
? channel->flagsValue()
|
? channel->flagsValue()
|
||||||
: rpl::single(Data::Flags<ChannelDataFlags>::Change({}, {}))
|
: rpl::single(Data::Flags<ChannelDataFlags>::Change({}, {}))
|
||||||
) | rpl::map([=](Data::Flags<ChannelDataFlags>::Change data) {
|
) | rpl::map([=](Data::Flags<ChannelDataFlags>::Change data) {
|
||||||
return (data.value & ChannelDataFlag::AutoTranslation);
|
return (data.value & ChannelDataFlag::AutoTranslation);
|
||||||
}) | rpl::distinct_until_changed();
|
}) | rpl::distinct_until_changed();
|
||||||
rpl::combine(
|
|
||||||
_trackingLanguage.value(),
|
using namespace rpl::mappers;
|
||||||
std::move(autoTranslationValue)
|
_trackingLanguage = rpl::combine(
|
||||||
) | rpl::start_with_next([=](bool tracking, bool autotranslation) {
|
Core::App().settings().translateChatEnabledValue(),
|
||||||
|
Data::AmPremiumValue(&_history->session()),
|
||||||
|
std::move(autoTranslationValue),
|
||||||
|
_1 && (_2 || _3));
|
||||||
|
_trackingLanguage.value() | rpl::start_with_next([=](bool tracking) {
|
||||||
_trackingLifetime.destroy();
|
_trackingLifetime.destroy();
|
||||||
if (autotranslation) {
|
if (tracking) {
|
||||||
_history->translateOfferFrom({ QLocale::French });
|
|
||||||
AssertIsDebug();
|
|
||||||
} else if (tracking) {
|
|
||||||
recognizeCollected();
|
recognizeCollected();
|
||||||
trackSkipLanguages();
|
trackSkipLanguages();
|
||||||
} else {
|
} else {
|
||||||
|
@ -115,7 +110,7 @@ bool TranslateTracker::add(
|
||||||
bool skipDependencies) {
|
bool skipDependencies) {
|
||||||
Expects(_addedInBunch >= 0);
|
Expects(_addedInBunch >= 0);
|
||||||
|
|
||||||
if (item->out()
|
if ((item->out() && !item->history()->peer->autoTranslation())
|
||||||
|| item->isService()
|
|| item->isService()
|
||||||
|| !item->isRegular()
|
|| !item->isRegular()
|
||||||
|| item->isOnlyEmojiAndSpaces()) {
|
|| item->isOnlyEmojiAndSpaces()) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue