diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index fe0e7a2a8c..1ec4ebbc69 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -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_translate_show_original" = "Show Original"; +"lng_translate_return_original" = "View Original ({language})"; "lng_translate_bar_to" = "Translate to {name}"; "lng_translate_bar_to_other" = "Translate to {name}"; "lng_translate_menu_to" = "Translate To"; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index f9416ccdaf..537c1bcb37 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -1116,29 +1116,37 @@ void Controller::fillAutoTranslateButton() { [] {}, st::manageGroupTopicsButton, { &st::menuIconTranslate })); - const auto toggled = autotranslate->lifetime().make_state< - rpl::event_stream - >(); + struct State { + rpl::event_stream toggled; + rpl::variable isLocked = false; + }; + const auto state = autotranslate->lifetime().make_state(); autotranslate->toggleOn(rpl::single( channel->autoTranslation() - ) | rpl::then(toggled->events())); - const auto isLocked = channel->levelHint() < requiredLevel; + ) | rpl::then(state->toggled.events())); + state->isLocked = (channel->levelHint() < requiredLevel); const auto reason = Ui::AskBoostReason{ .data = Ui::AskBoostAutotranslate{ .requiredLevel = requiredLevel }, }; - autotranslate->setToggleLocked(isLocked); + state->isLocked.value() | rpl::start_with_next([=](bool locked) { + autotranslate->setToggleLocked(locked); + }, autotranslate->lifetime()); autotranslate->toggledChanges( ) | rpl::start_with_next([=](bool value) { - if (!isLocked) { - _autotranslateSavedValue = toggled; + if (!state->isLocked.current()) { + _autotranslateSavedValue = value; } else if (value) { - toggled->fire(false); + state->toggled.fire(false); + auto weak = Ui::MakeWeak(autotranslate); CheckBoostLevel( _navigation->uiShow(), _peer, [=](int level) { + if (const auto strong = weak.data()) { + state->isLocked = (level < requiredLevel); + } return (level < requiredLevel) ? std::make_optional(reason) : std::nullopt; diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 35dc39acfc..cd8578a860 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -3686,6 +3686,11 @@ void History::translateOfferFrom(LanguageId id) { } } else if (!_translation) { _translation = std::make_unique(this, id); + using Flag = PeerData::TranslationFlag; + if (peer->autoTranslation() + && (peer->translationFlag() == Flag::Enabled)) { + translateTo(Core::App().settings().translateTo()); + } } else { _translation->offerFrom(id); } diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index cef6365d4c..4d34fd0b86 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -7557,10 +7557,6 @@ void HistoryWidget::checkLastPinnedClickedIdReset( void HistoryWidget::setupTranslateBar() { Expects(_history != nullptr); - if (_history->peer->autoTranslation()) { - _history->translateTo(Core::App().settings().translateTo()); - } - _translateBar = std::make_unique( this, controller(), diff --git a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp index c658692d33..576c1ac3d1 100644 --- a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp @@ -372,11 +372,16 @@ void TranslateBar::setup(not_null history) { const auto&, const auto&) { using Flag = PeerData::TranslationFlag; - //const auto autotranslation = history->peer->autoTranslation(); + const auto automatic = history->peer->autoTranslation(); return (history->peer->translationFlag() != Flag::Enabled) ? rpl::single(QString()) : 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() ? Ui::TranslateBarTo(to) : rpl::single(QString()); diff --git a/Telegram/SourceFiles/history/view/history_view_translate_tracker.cpp b/Telegram/SourceFiles/history/view/history_view_translate_tracker.cpp index df45d6ca75..5d3eae9b07 100644 --- a/Telegram/SourceFiles/history/view/history_view_translate_tracker.cpp +++ b/Telegram/SourceFiles/history/view/history_view_translate_tracker.cpp @@ -53,28 +53,23 @@ void TranslateTracker::setup() { const auto peer = _history->peer; peer->updateFull(); - using namespace rpl::mappers; - _trackingLanguage = rpl::combine( - Data::AmPremiumValue(&_history->session()), - Core::App().settings().translateChatEnabledValue(), - _1 && _2); - const auto channel = peer->asChannel(); auto autoTranslationValue = (channel ? channel->flagsValue() : rpl::single(Data::Flags::Change({}, {})) - ) | rpl::map([=](Data::Flags::Change data) { + ) | rpl::map([=](Data::Flags::Change data) { return (data.value & ChannelDataFlag::AutoTranslation); }) | rpl::distinct_until_changed(); - rpl::combine( - _trackingLanguage.value(), - std::move(autoTranslationValue) - ) | rpl::start_with_next([=](bool tracking, bool autotranslation) { + + using namespace rpl::mappers; + _trackingLanguage = rpl::combine( + Core::App().settings().translateChatEnabledValue(), + Data::AmPremiumValue(&_history->session()), + std::move(autoTranslationValue), + _1 && (_2 || _3)); + _trackingLanguage.value() | rpl::start_with_next([=](bool tracking) { _trackingLifetime.destroy(); - if (autotranslation) { - _history->translateOfferFrom({ QLocale::French }); - AssertIsDebug(); - } else if (tracking) { + if (tracking) { recognizeCollected(); trackSkipLanguages(); } else { @@ -115,7 +110,7 @@ bool TranslateTracker::add( bool skipDependencies) { Expects(_addedInBunch >= 0); - if (item->out() + if ((item->out() && !item->history()->peer->autoTranslation()) || item->isService() || !item->isRegular() || item->isOnlyEmojiAndSpaces()) {