diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 70fe4c923..29aa9faa0 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1664,26 +1664,26 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_premium_summary_title" = "Telegram Premium"; "lng_premium_summary_top_about" = "Go **beyond the limits**, get **exclusive features** and support us by subscribing to **Telegram Premium**."; -"lng_premium_summary_subtitle1" = "Doubled Limits"; -"lng_premium_summary_about1" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; -"lng_premium_summary_subtitle2" = "4Gb Upload Size"; -"lng_premium_summary_about2" = "Increased upload size from 2Gb to 4Gb to per document, unlimited storage overall."; -"lng_premium_summary_subtitle3" = "Faster Download Speed"; -"lng_premium_summary_about3" = "No more limits on the speed with which media and documents are downloaded."; -"lng_premium_summary_subtitle4" = "Voice-to-Text Conversion"; -"lng_premium_summary_about4" = "Ability to read the transcript of any incoming voice message."; -"lng_premium_summary_subtitle5" = "No Ads"; -"lng_premium_summary_about5" = "No more ads in public channels where Telegram sometimes shows ads."; -"lng_premium_summary_subtitle6" = "Unique Reactions"; -"lng_premium_summary_about6" = "Additional animated reactions on messages available only to the Premium subscribers."; -"lng_premium_summary_subtitle7" = "Premium Stickers"; -"lng_premium_summary_about7" = "Exclusive enlarged stickers featuring additional effects, updated monthly."; -"lng_premium_summary_subtitle8" = "Advanced Chat Management"; -"lng_premium_summary_about8" = "Tools to set default folder, auto-archive and hide new chats from non-contacts."; -"lng_premium_summary_subtitle9" = "Profile Badge"; -"lng_premium_summary_about9" = "A badge next to your name showing that you are helping support Telegram."; -"lng_premium_summary_subtitle10" = "Animated Profile Pictures"; -"lng_premium_summary_about10" = "Video avatars animated in chat lists and chats to allow for additional self-expression."; +"lng_premium_summary_subtitle_double_limits" = "Doubled Limits"; +"lng_premium_summary_about_double_limits" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; +"lng_premium_summary_subtitle_more_upload" = "4Gb Upload Size"; +"lng_premium_summary_about_more_upload" = "Increased upload size from 2Gb to 4Gb to per document, unlimited storage overall."; +"lng_premium_summary_subtitle_faster_download" = "Faster Download Speed"; +"lng_premium_summary_about_faster_download" = "No more limits on the speed with which media and documents are downloaded."; +"lng_premium_summary_subtitle_voice_to_text" = "Voice-to-Text Conversion"; +"lng_premium_summary_about_voice_to_text" = "Ability to read the transcript of any incoming voice message."; +"lng_premium_summary_subtitle_no_ads" = "No Ads"; +"lng_premium_summary_about_no_ads" = "No more ads in public channels where Telegram sometimes shows ads."; +"lng_premium_summary_subtitle_unique_reactions" = "Unique Reactions"; +"lng_premium_summary_about_unique_reactions" = "Additional animated reactions on messages available only to the Premium subscribers."; +"lng_premium_summary_subtitle_premium_stickers" = "Premium Stickers"; +"lng_premium_summary_about_premium_stickers" = "Exclusive enlarged stickers featuring additional effects, updated monthly."; +"lng_premium_summary_subtitle_advanced_chat_management" = "Advanced Chat Management"; +"lng_premium_summary_about_advanced_chat_management" = "Tools to set default folder, auto-archive and hide new chats from non-contacts."; +"lng_premium_summary_subtitle_profile_badge" = "Profile Badge"; +"lng_premium_summary_about_profile_badge" = "A badge next to your name showing that you are helping support Telegram."; +"lng_premium_summary_subtitle_animated_userpics" = "Animated Profile Pictures"; +"lng_premium_summary_about_animated_userpics" = "Video avatars animated in chat lists and chats to allow for additional self-expression."; "lng_premium_summary_bottom_subtitle" = "About Telegram Premium"; "lng_premium_summary_bottom_about" = "While the free version of Telegram already gives its users more than any other messaging application, **Telegram Premium** pushes its capabilities even further.\n\n**Telegram Premium** is a paid option, because most Premium Features require additional expenses from Telegram to third parties such as data center providers and server manufacturers. Contributions from **Telegram Premium** users allow us to cover such costs and also help Telegram stay free for everyone."; "lng_premium_summary_button" = "Subscribe for {cost} per month."; diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index b00f2ba3f..1be91b58f 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -47,6 +47,97 @@ using SectionCustomTopBarData = Info::Settings::SectionCustomTopBarData; constexpr auto kBodyAnimationPart = 0.90; constexpr auto kTitleAnimationPart = 0.15; +struct Entry { + const style::icon *icon; + rpl::producer title; + rpl::producer description; +}; + +[[nodiscard]] base::flat_map EntryMap() { + return base::flat_map{ + { + QString("double_limits"), + Entry{ + &st::settingsPremiumIconDouble, + tr::lng_premium_summary_subtitle_double_limits(), + tr::lng_premium_summary_about_double_limits(), + }, + }, + { + QString("more_upload"), + Entry{ + &st::settingsPremiumIconFiles, + tr::lng_premium_summary_subtitle_more_upload(), + tr::lng_premium_summary_about_more_upload(), + }, + }, + { + QString("faster_download"), + Entry{ + &st::settingsPremiumIconSpeed, + tr::lng_premium_summary_subtitle_faster_download(), + tr::lng_premium_summary_about_faster_download(), + }, + }, + { + QString("voice_to_text"), + Entry{ + &st::settingsPremiumIconVoice, + tr::lng_premium_summary_subtitle_voice_to_text(), + tr::lng_premium_summary_about_voice_to_text(), + }, + }, + { + QString("no_ads"), + Entry{ + &st::settingsPremiumIconChannelsOff, + tr::lng_premium_summary_subtitle_no_ads(), + tr::lng_premium_summary_about_no_ads(), + }, + }, + { + QString("unique_reactions"), + Entry{ + &st::settingsPremiumIconLike, + tr::lng_premium_summary_subtitle_unique_reactions(), + tr::lng_premium_summary_about_unique_reactions(), + }, + }, + { + QString("premium_stickers"), + Entry{ + &st::settingsIconStickers, + tr::lng_premium_summary_subtitle_premium_stickers(), + tr::lng_premium_summary_about_premium_stickers(), + }, + }, + { + QString("advanced_chat_management"), + Entry{ + &st::settingsIconChat, + tr::lng_premium_summary_subtitle_advanced_chat_management(), + tr::lng_premium_summary_about_advanced_chat_management(), + }, + }, + { + QString("profile_badge"), + Entry{ + &st::settingsPremiumIconStar, + tr::lng_premium_summary_subtitle_profile_badge(), + tr::lng_premium_summary_about_profile_badge(), + }, + }, + { + QString("animated_userpics"), + Entry{ + &st::settingsPremiumIconPlay, + tr::lng_premium_summary_subtitle_animated_userpics(), + tr::lng_premium_summary_about_animated_userpics(), + }, + }, + }; +} + class TopBar final : public Ui::RpWidget { public: TopBar(not_null parent); @@ -240,21 +331,9 @@ void Premium::setupContent() { const auto &stLabel = st::defaultFlatLabel; const auto iconSize = st::settingsPremiumIconDouble.size(); - const auto icons = std::array{ { - &st::settingsPremiumIconDouble, - &st::settingsPremiumIconFiles, - &st::settingsPremiumIconSpeed, - &st::settingsPremiumIconVoice, - &st::settingsPremiumIconChannelsOff, - &st::settingsPremiumIconLike, - &st::settingsIconStickers, - &st::settingsIconChat, - &st::settingsPremiumIconStar, - &st::settingsPremiumIconPlay, - } }; - + auto entryMap = EntryMap(); auto iconContainers = std::vector(); - iconContainers.reserve(int(icons.size())); + iconContainers.reserve(int(entryMap.size())); auto titlePadding = st.padding; titlePadding.setBottom(0); @@ -295,17 +374,33 @@ void Premium::setupContent() { iconContainers.push_back(dummy); }; - using namespace tr; - addRow(lng_premium_summary_subtitle1(), lng_premium_summary_about1()); - addRow(lng_premium_summary_subtitle2(), lng_premium_summary_about2()); - addRow(lng_premium_summary_subtitle3(), lng_premium_summary_about3()); - addRow(lng_premium_summary_subtitle4(), lng_premium_summary_about4()); - addRow(lng_premium_summary_subtitle5(), lng_premium_summary_about5()); - addRow(lng_premium_summary_subtitle6(), lng_premium_summary_about6()); - addRow(lng_premium_summary_subtitle7(), lng_premium_summary_about7()); - addRow(lng_premium_summary_subtitle8(), lng_premium_summary_about8()); - addRow(lng_premium_summary_subtitle9(), lng_premium_summary_about9()); - addRow(lng_premium_summary_subtitle10(), lng_premium_summary_about10()); + auto icons = std::vector(); + icons.reserve(int(entryMap.size())); + { + using Order = std::vector; + const auto &account = _controller->session().account(); + const auto mtpOrder = account.appConfig().get( + "premium_promo_order", + Order()); + const auto processEntry = [&](Entry &entry) { + icons.push_back(entry.icon); + addRow(base::take(entry.title), base::take(entry.description)); + }; + + if (!mtpOrder.empty()) { + for (const auto &key : mtpOrder) { + auto it = entryMap.find(key); + if (it == end(entryMap)) { + continue; + } + processEntry(it->second); + } + } else { + for (auto &entry : ranges::views::values(entryMap)) { + processEntry(entry); + } + } + } content->resizeToWidth(content->height());