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

View file

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

View file

@ -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);
} }

View file

@ -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(),

View file

@ -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());

View file

@ -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()) {