Correct implementation of auto-translation.

This commit is contained in:
John Preston 2025-04-25 18:33:08 +04:00
parent d9016b7979
commit 10e4c59f2e
6 changed files with 41 additions and 31 deletions

View file

@ -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";

View file

@ -1116,29 +1116,37 @@ void Controller::fillAutoTranslateButton() {
[] {},
st::manageGroupTopicsButton,
{ &st::menuIconTranslate }));
const auto toggled = autotranslate->lifetime().make_state<
rpl::event_stream<bool>
>();
struct State {
rpl::event_stream<bool> toggled;
rpl::variable<bool> isLocked = false;
};
const auto state = autotranslate->lifetime().make_state<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;

View file

@ -3686,6 +3686,11 @@ void History::translateOfferFrom(LanguageId id) {
}
} else if (!_translation) {
_translation = std::make_unique<HistoryTranslation>(this, id);
using Flag = PeerData::TranslationFlag;
if (peer->autoTranslation()
&& (peer->translationFlag() == Flag::Enabled)) {
translateTo(Core::App().settings().translateTo());
}
} else {
_translation->offerFrom(id);
}

View file

@ -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<HistoryView::TranslateBar>(
this,
controller(),

View file

@ -372,11 +372,16 @@ void TranslateBar::setup(not_null<History*> 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());

View file

@ -53,12 +53,6 @@ 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()
@ -66,15 +60,16 @@ void TranslateTracker::setup() {
) | rpl::map([=](Data::Flags<ChannelDataFlags>::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()) {