remove AI integration and account limits

This commit is contained in:
2026-04-29 18:34:42 +02:00
parent 7098a6353c
commit 2f1345908b
56 changed files with 74 additions and 1429 deletions

View File

@@ -1,12 +0,0 @@
using System;
namespace Wino.Core.Domain.Enums;
[Flags]
public enum AiActionType
{
None = 0,
Translate = 1,
Rewrite = 2,
Summarize = 4,
}

View File

@@ -2,6 +2,5 @@ namespace Wino.Core.Domain.Enums;
public enum WinoAddOnProductType
{
AI_PACK,
UNLIMITED_ACCOUNTS
}

View File

@@ -1,10 +0,0 @@
using System.Collections.Generic;
using Wino.Core.Domain.Models.Ai;
namespace Wino.Core.Domain.Interfaces;
public interface IAiActionOptionsService
{
IReadOnlyList<AiTranslateLanguageOption> GetTranslateLanguageOptions();
IReadOnlyList<AiRewriteModeOption> GetRewriteModeOptions();
}

View File

@@ -3,7 +3,6 @@ using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Mail.Api.Contracts.Users;
@@ -19,10 +18,6 @@ public interface IWinoAccountApiClient
Task<ApiEnvelope<JsonElement>> ForgotPasswordAsync(string email, CancellationToken cancellationToken = default);
Task<ApiEnvelope<JsonElement>> LogoutAsync(string refreshToken, CancellationToken cancellationToken = default);
Task<ApiEnvelope<AuthUserDto>> GetCurrentUserAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default);
Task<ApiEnvelope<WinoStoreCollectionsIdTicketInfo>> CreateCollectionsIdTicketAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<WinoStoreCollectionsIdTicketInfo>> CreatePurchaseIdTicketAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<JsonElement>> SyncStoreEntitlementsAsync(string? storeIdKey, string? purchaseIdKey, CancellationToken cancellationToken = default);

View File

@@ -5,7 +5,6 @@ using System.Threading;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Mail.Api.Contracts.Users;
@@ -24,10 +23,6 @@ public interface IWinoAccountProfileService
Task<WinoAccount?> GetAuthenticatedAccountAsync(CancellationToken cancellationToken = default);
Task<bool> HasActiveAccountAsync();
Task<ApiEnvelope<AuthUserDto>> GetCurrentUserAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default);
Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default);
Task<ApiEnvelope<JsonElement>> SyncStoreEntitlementsAsync(CancellationToken cancellationToken = default);
Task<string?> GetSettingsAsync(CancellationToken cancellationToken = default);
Task SaveSettingsAsync(string settingsJson, CancellationToken cancellationToken = default);

View File

@@ -1,3 +0,0 @@
namespace Wino.Core.Domain.Models.Ai;
public sealed record AiRewriteModeOption(string Mode, string Label, string Description, bool IsCustom = false);

View File

@@ -1,3 +0,0 @@
namespace Wino.Core.Domain.Models.Ai;
public sealed record AiTranslateLanguageOption(string Code, string Label);

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Скрийте бутона за профила в заглавната лента, който отваря изскачащото меню за акаунта Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Уведомления за обновления в магазина",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Показвайте уведомления и действия в долния колонтитър, когато има налично обновление на Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Скрий панела за AI действия",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Скрий AI действия в съставителя и читателя на имейли.",
"SettingsAppPreferences_AiActions_Title": "AI действия",
"SettingsAppPreferences_AiActions_Description": "Изберете езиците за AI по подразбиране и къде трябва да се запазват резюметата.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Език по подразбиране за превод",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Изберете език по подразбиране за превод от AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Език за обобщение",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Обобщи с AI",
"Composer_AiSummarizeDescription": "Извлича ключови точки, действия и решения от този имейл.",
"Composer_AiTranslate": "Преведи с AI",
"Composer_AiActions": "AI действия",
"Composer_AiRewrite": "Препиши с AI",
"AiActions_CheckingStatus": "Проверка на достъпа до AI...",
"AiActions_SignedOutTitle": "Разблокирайте Wino AI Pack",
"AiActions_SignedOutDescription": "Превеждайте, преписвайте и обобщавайте имейли с AI след влизане във вашия Wino акаунт и активиране на добавката AI Pack.",
"AiActions_NoPackTitle": "AI пакет",
"AiActions_NoPackDescription": "Вие сте вписани, но AI Pack не е активен. Купете го, за да използвате инструментите за AI превод, преписване и обобщаване на Wino.",
"AiActions_UsageSummary": "{0} от {1} кредити използвани този месец.",
"Composer_AiRewritePolite": "Направи го учтиво",
"Composer_AiRewritePoliteDescription": "Улеснява формулировката, запазвайки същия смисъл.",
"Composer_AiRewriteAngry": "Направи го ядосано",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / месец",
"WinoAccount_Management_AiPackPromoRequests": "1 000 кредита",
"WinoAccount_Management_AiPackGetButton": "Вземи AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-инструменти за превод, преработка и резюмиране на имейли в Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, превод, преработка, резюмиране, производителност",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Неограничени акаунти",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Премахнете ограниченията за акаунти и добавяйте толкова имейл акаунти, колкото ви трябват.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "акаунти, неограничени, премиум, добавка",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Amaga el botó de perfil de la barra de títol que obre el desplegable del compte de Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notificacions d'actualitzacions de la Botiga",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Mostra notificacions i accions al peu de pàgina quan hi hagi una actualització disponible a Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Oculta el panell d'accions d'IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Oculta les accions d'IA en el redactor i en el lector de correu.",
"SettingsAppPreferences_AiActions_Title": "Accions d'IA",
"SettingsAppPreferences_AiActions_Description": "Trieu les llengües d'IA predeterminades i on s'han d'emmagatzemar els resums.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Idioma de traducció predeterminant",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Trieu l'idioma de destinació predeterminat utilitzat per les accions de traducció amb IA.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Idioma de resum",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Resumir amb IA",
"Composer_AiSummarizeDescription": "Extreu punts clau, accions i decisions d'aquest correu electrònic.",
"Composer_AiTranslate": "Tradueix amb IA",
"Composer_AiActions": "Accions d'IA",
"Composer_AiRewrite": "Reescriu amb IA",
"AiActions_CheckingStatus": "Comprovant l'accés a IA...",
"AiActions_SignedOutTitle": "Desbloqueja el paquet IA de Wino",
"AiActions_SignedOutDescription": "Traduïu, reescriviu i resumi correus electrònics amb IA després d'iniciar sessió al teu compte Wino i activar l'extensió AI Pack.",
"AiActions_NoPackTitle": "Cal l'AI Pack",
"AiActions_NoPackDescription": "Estàs connectat, però l'AI Pack encara no està actiu. Adquireix-lo per utilitzar les eines de traducció, reescriptura i resum amb IA de Wino.",
"AiActions_UsageSummary": "{0} de {1} crèdits utilitzats aquest mes.",
"Composer_AiRewritePolite": "Fes-ho més educat",
"Composer_AiRewritePoliteDescription": "Suavitza la redacció mantenint la mateixa intenció.",
"Composer_AiRewriteAngry": "Fes-ho enfadat",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mes",
"WinoAccount_Management_AiPackPromoRequests": "1.000 crèdits",
"WinoAccount_Management_AiPackGetButton": "Obtenir AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Eines alimentades per IA per traduir, reformular i resumir accions a Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "IA, traducció, reescriptura, resum, productivitat",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Comptes il·limitats",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Elimina la limitació de comptes i afegeix tants comptes de correu com necessitis.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "comptes, il·limitats, premium, complement",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Skrýt tlačítko profilu v liště titulku, které otevírá nabídku účtu Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Oznámení o aktualizacích z Microsoft Store.",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Zobrazovat oznámení a akce v patičce, když je k dispozici aktualizace z Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Skrýt panel akcí AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Skrýt AI akce v editoru e-mailů a čtečce.",
"SettingsAppPreferences_AiActions_Title": "AI akce",
"SettingsAppPreferences_AiActions_Description": "Vyberte výchozí jazyky pro AI a kde mají být souhrny ukládány.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Výchozí jazyk překladu",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Vyberte výchozí cílový jazyk použitý při překladech AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Jazyk shrnutí",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Shrnout pomocí AI",
"Composer_AiSummarizeDescription": "Z tohoto e-mailu vyextrahujte klíčové body, akční kroky a rozhodnutí.",
"Composer_AiTranslate": "Přeložit pomocí AI",
"Composer_AiActions": "AI akce",
"Composer_AiRewrite": "Přepsat pomocí AI",
"AiActions_CheckingStatus": "Ověřování přístupu k AI...",
"AiActions_SignedOutTitle": "Odemknout Wino AI balíček",
"AiActions_SignedOutDescription": "Překládejte, přepište a shrnujte e-maily pomocí AI po přihlášení k vašemu účtu Wino a aktivaci doplňku AI Pack.",
"AiActions_NoPackTitle": "AI Pack vyžadován",
"AiActions_NoPackDescription": "Jste přihlášeni, ale AI Pack ještě není aktivní. Zakupte si ho, abyste mohli používat Wino AI překlad, přepis a shrnutí.",
"AiActions_UsageSummary": "Použito {0} z {1} kreditů tento měsíc.",
"Composer_AiRewritePolite": "Udělej to zdvořile",
"Composer_AiRewritePoliteDescription": "Zjemní formulaci a zachová stejný záměr.",
"Composer_AiRewriteAngry": "Udělej to agresivně",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / měs.",
"WinoAccount_Management_AiPackPromoRequests": "1 000 kreditů",
"WinoAccount_Management_AiPackGetButton": "Získat AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Nástroje poháněné AI pro překlad, přeformulování a shrnutí e-mailů ve Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, překlad, přeformulování, shrnutí, produktivita",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Neomezené účty",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Odeberte omezení počtu účtů a přidejte tolik e-mailových účtů, kolik potřebujete.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "účty, neomezené, prémiový, doplněk",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Skjul profilknappen i titelbjælken, som åbner Wino-kontoens flyout.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Meddelelser om opdateringer i Microsoft Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Vis notifikationer og handlinger i bunden, når der er en opdatering i Microsoft Store tilgængelig.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Skjul AI-handlingspanel",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Skjul AI-handlinger i mailkomponisten og læseren.",
"SettingsAppPreferences_AiActions_Title": "AI-handlinger",
"SettingsAppPreferences_AiActions_Description": "Vælg standard AI-sprog og hvor resuméer skal gemmes.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Standard oversættelsessprog",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Vælg det standardmål, der bruges af AI-oversættelseshandlinger.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Opsummeringssprog",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Sammenfat med AI",
"Composer_AiSummarizeDescription": "Uddrag nøglepunkter, handlingspunkter og beslutninger fra denne e-mail.",
"Composer_AiTranslate": "Oversæt med AI",
"Composer_AiActions": "AI-handlinger",
"Composer_AiRewrite": "Omskriv med AI",
"AiActions_CheckingStatus": "Kontrollerer AI-adgang...",
"AiActions_SignedOutTitle": "Få adgang til Wino AI-pakken.",
"AiActions_SignedOutDescription": "Oversæt, omskriv og opsummer e-mails med AI, når du har logget ind på din Wino-konto og aktiveret AI Pack-tilføjelsen.",
"AiActions_NoPackTitle": "AI-pakken kræves",
"AiActions_NoPackDescription": "Du er logget ind, men AI Pack er ikke aktiveret endnu. Køb den for at bruge Winos AI-oversættelse, omskrivning og sammenfatningsværktøjer.",
"AiActions_UsageSummary": "{0} ud af {1} kreditter brugt denne måned.",
"Composer_AiRewritePolite": "Gør den høflig",
"Composer_AiRewritePoliteDescription": "Gør formuleringen mere høflig uden at ændre intentionen.",
"Composer_AiRewriteAngry": "Gør den vred",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mo",
"WinoAccount_Management_AiPackPromoRequests": "1.000 kreditter",
"WinoAccount_Management_AiPackGetButton": "Få AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-drevne værktøjer til oversættelse, omskrivning og sammenfatning af e-mails i Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, oversæt, omskriv, opsummer, produktivitet",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Ubegrænsede konti",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Fjern kontoens begrænsning og tilføj så mange mailkonti, som du har brug for.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "konti, ubegrænsede, premium, tilføjelsesmodul",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Profil-Schaltfläche in der Titelleiste ausblenden, die das Wino-Konto-Ausklappmenü öffnet.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Store-Update-Benachrichtigungen",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Zeigen Sie Benachrichtigungen und Fußzeilenaktionen, wenn ein Microsoft Store-Update verfügbar ist.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "KI-Aktionen-Panel ausblenden",
"SettingsAppPreferences_HideAiActionsPanel_Description": "KI-Aktionen im E-Mail-Verfassen- und -Lesen ausblenden.",
"SettingsAppPreferences_AiActions_Title": "KI-Aktionen",
"SettingsAppPreferences_AiActions_Description": "Standard-KI-Sprachen auswählen und Speicherort für Zusammenfassungen festlegen.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Standardsprache der Übersetzung",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Wählen Sie die Standardzielsprache, die von KI-Übersetzungsaktionen verwendet wird.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Zusammenfassungssprache",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Mit KI zusammenfassen",
"Composer_AiSummarizeDescription": "Extrahiert zentrale Punkte, Maßnahmen und Entscheidungen aus dieser E-Mail.",
"Composer_AiTranslate": "Mit KI übersetzen",
"Composer_AiActions": "KI-Aktionen",
"Composer_AiRewrite": "Mit KI umschreiben",
"AiActions_CheckingStatus": "KI-Zugriff wird geprüft...",
"AiActions_SignedOutTitle": "Wino AI-Paket entsperren",
"AiActions_SignedOutDescription": "Übersetzen, Umschreiben und Zusammenfassen von E-Mails mit KI nach der Anmeldung bei Ihrem Wino-Konto und Aktivierung des AI Pack-Add-ons.",
"AiActions_NoPackTitle": "KI-Paket erforderlich",
"AiActions_NoPackDescription": "Sie sind angemeldet, aber das KI-Paket ist noch nicht aktiv. Kaufen Sie es, um Winos KI-Übersetzung, Umschreiben und Zusammenfassungswerkzeuge zu verwenden.",
"AiActions_UsageSummary": "{0} von {1} Credits in diesem Monat verwendet.",
"Composer_AiRewritePolite": "Höflicher formulieren",
"Composer_AiRewritePoliteDescription": "Formulierung mildern, aber denselben Sinn beibehalten.",
"Composer_AiRewriteAngry": "Wütend formulieren",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mo",
"WinoAccount_Management_AiPackPromoRequests": "1.000 Credits",
"WinoAccount_Management_AiPackGetButton": "AI Pack erhalten",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "KI-gestützte Tools zum Übersetzen, Umformulieren und Zusammenfassen von Nachrichten in Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "KI, übersetzen, umschreiben, zusammenfassen, Produktivität",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Unbegrenzte Konten",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Entfernt das Kontolimit und fügt beliebig viele E-Mail-Konten hinzu.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "Konten, unbegrenzt, Premium, Add-on",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Απόκρυψη του κουμπιού προφίλ στη γραμμή τίτλου που ανοίγει το μενού λογαριασμού Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Ειδοποιήσεις ενημερώσεων Microsoft Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Εμφάνιση ειδοποιήσεων και ενεργειών στο υποσέλιδο όταν υπάρχει διαθέσιμη ενημέρωση του Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Απόκρυψη πίνακα ενεργειών AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Απόκρυψη των ενεργειών AI στον συντάκτη και στον αναγνώστη ηλεκτρονικού ταχυδρομείου.",
"SettingsAppPreferences_AiActions_Title": "Ενέργειες AI",
"SettingsAppPreferences_AiActions_Description": "Επιλέξτε προεπιλεγμένες γλώσσες AI και πού θα αποθηκεύονται οι περιλήψεις.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Προεπιλεγμένη γλώσσα μετάφρασης",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Επιλέξτε την προεπιλεγμένη γλώσσα-στόχο που χρησιμοποιούν οι ενέργειες μετάφρασης AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Γλώσσα περίληψης",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Περίληψη με AI",
"Composer_AiSummarizeDescription": "Εξαγάγετε τα κύρια σημεία, ενέργειες και αποφάσεις από αυτό το email.",
"Composer_AiTranslate": "Μετάφραση με AI",
"Composer_AiActions": "Ενέργειες AI",
"Composer_AiRewrite": "Αναδιατύπωση με AI",
"AiActions_CheckingStatus": "Έλεγχος πρόσβασης AI…",
"AiActions_SignedOutTitle": "Ξεκλειδώστε το Wino AI Pack",
"AiActions_SignedOutDescription": "Μεταφράστε, επαναγράψτε και συνοψίστε τα email με τη χρήση AI αφού συνδεθείτε στον λογαριασμό σας Wino και ενεργοποιήσετε το πρόσθετο AI Pack.",
"AiActions_NoPackTitle": "Απαιτείται το AI Pack",
"AiActions_NoPackDescription": "Έχετε συνδεθεί, αλλά το AI Pack δεν είναι ενεργό ακόμα. Αγοράστε το για να χρησιμοποιήσετε τα εργαλεία μετάφρασης AI, επαναδιατύπωσης και περίληψης του Wino.",
"AiActions_UsageSummary": "{0} από {1} πιστώσεις χρησιμοποιήθηκαν αυτό το μήνα.",
"Composer_AiRewritePolite": "Κάντε το ευγενικό",
"Composer_AiRewritePoliteDescription": "Μαλακώνει τη διατύπωση διατηρώντας τον ίδιο σκοπό.",
"Composer_AiRewriteAngry": "Κάντε το να φανεί οργισμένο",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "4,99 $ / μήνα",
"WinoAccount_Management_AiPackPromoRequests": "1.000 credits",
"WinoAccount_Management_AiPackGetButton": "Λήψη AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Εργαλεία με τεχνητή νοημοσύνη για μετάφραση, επαναγραφή και περίληψη ενέργειών στο Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, μετάφραση, επαναγραφή, περίληψη, παραγωγικότητα",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Απεριόριστοι Λογαριασμοί",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Αφαιρέστε τον περιορισμό λογαριασμών και προσθέστε όσους λογαριασμούς email χρειάζεστε.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "λογαριασμοί, απεριόριστο, premium, πρόσθετο",

View File

@@ -790,10 +790,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Hide the title bar profile button that opens the Wino account flyout.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Store update notifications",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Show notifications and footer actions when a Microsoft Store update is available.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Hide AI actions panel",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Hide AI actions in the mail composer and reader.",
"SettingsAppPreferences_AiActions_Title": "AI actions",
"SettingsAppPreferences_AiActions_Description": "Choose default AI languages and where summaries should be saved.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Default translation language",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Pick the default target language used by AI translate actions.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Summarize language",
@@ -1215,14 +1211,7 @@
"Composer_AiSummarize": "Summarize with AI",
"Composer_AiSummarizeDescription": "Extract key points, action items, and decisions from this email.",
"Composer_AiTranslate": "Translate with AI",
"Composer_AiActions": "AI Actions",
"Composer_AiRewrite": "Rewrite with AI",
"AiActions_CheckingStatus": "Checking AI access...",
"AiActions_SignedOutTitle": "Unlock Wino AI Pack",
"AiActions_SignedOutDescription": "Translate, rewrite, and summarize emails with AI after signing in to your Wino Account and activating the AI Pack add-on.",
"AiActions_NoPackTitle": "AI Pack required",
"AiActions_NoPackDescription": "You're signed in, but AI Pack is not active yet. Purchase it to use Wino's AI translation, rewrite, and summarize tools.",
"AiActions_UsageSummary": "{0} of {1} credits used this month.",
"Composer_AiRewritePolite": "Make it polite",
"Composer_AiRewritePoliteDescription": "Softens the wording while keeping the same intent.",
"Composer_AiRewriteAngry": "Make it angry",
@@ -1403,9 +1392,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mo",
"WinoAccount_Management_AiPackPromoRequests": "1,000 credits",
"WinoAccount_Management_AiPackGetButton": "Get AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-powered tools for translate, rewrite, and summarize actions in Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, translate, rewrite, summarize, productivity",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Unlimited Accounts",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Remove the account limit and add as many mail accounts as you need.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "accounts, unlimited, premium, add-on",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Ocultar el botón de perfil en la barra de título que abre el panel desplegable de la cuenta de Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notificaciones de actualizaciones de Microsoft Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Mostrar notificaciones y acciones en el pie de página cuando haya una actualización de Microsoft Store disponible.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Ocultar panel de acciones de IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Ocultar las acciones de IA en el compositor y lector de correo.",
"SettingsAppPreferences_AiActions_Title": "Acciones de IA",
"SettingsAppPreferences_AiActions_Description": "Elegir los idiomas de IA predeterminados y dónde guardar los resúmenes.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Idioma de traducción predeterminado",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Seleccione el lenguaje de destino predeterminado utilizado por las acciones de traducción IA.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Idioma de resumen",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Resumir con IA",
"Composer_AiSummarizeDescription": "Extrae puntos clave, acciones y decisiones de este correo.",
"Composer_AiTranslate": "Traducir con IA",
"Composer_AiActions": "Acciones de IA",
"Composer_AiRewrite": "Reescribir con IA",
"AiActions_CheckingStatus": "Comprobando acceso a IA...",
"AiActions_SignedOutTitle": "Desbloquear el paquete de IA de Wino",
"AiActions_SignedOutDescription": "Traduce, reescribe y resume correos con IA después de iniciar sesión en tu cuenta de Wino y activar el paquete IA.",
"AiActions_NoPackTitle": "Se requiere paquete IA",
"AiActions_NoPackDescription": "Ya has iniciado sesión, pero el paquete IA no está activo. Adquiérelo para usar las herramientas de traducción, reescritura y resumen con IA de Wino.",
"AiActions_UsageSummary": "{0} de {1} créditos usados este mes.",
"Composer_AiRewritePolite": "Hazlo más cortés",
"Composer_AiRewritePoliteDescription": "Suaviza el tono manteniendo la misma intención.",
"Composer_AiRewriteAngry": "Hazlo más enfadado",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mes",
"WinoAccount_Management_AiPackPromoRequests": "1.000 créditos",
"WinoAccount_Management_AiPackGetButton": "Obtener AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Herramientas impulsadas por IA para traducir, reescribir y resumir acciones en Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "IA, traducir, reescribir, resumir, productividad",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Cuentas ilimitadas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Elimina el límite de cuentas y añade tantas cuentas de correo como necesites.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "cuentas, ilimitadas, premium, complemento",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Piilota otsikkorivillä oleva profiilipainike, joka avaa Wino-tilin valikon.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Store-päivitysilmoitukset",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Näytä ilmoitukset ja alatunnisteen toiminnot, kun Microsoft Store -päivitys on saatavilla.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Piilota tekoälytoimintojen paneeli",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Piilota tekoälytoiminnot sähköpostin kirjoitus- ja lukutilassa.",
"SettingsAppPreferences_AiActions_Title": "Tekoälytoiminnot",
"SettingsAppPreferences_AiActions_Description": "Valitse tekoälyn oletuskielet ja mihin yhteenvetoja tallennetaan.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Oletuskäännöksen kieli",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Valitse tekoälykäännösten oletuskieli.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Tiivistämisen kieli",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Tiivistä tekoälyn avulla",
"Composer_AiSummarizeDescription": "Tuo tämän sähköpostin keskeiset kohdat, toimenpiteet ja päätökset.",
"Composer_AiTranslate": "Käännä tekoälyn avulla",
"Composer_AiActions": "Tekoälyn toimet",
"Composer_AiRewrite": "Uudelleenkirjoita tekoälyn avulla",
"AiActions_CheckingStatus": "Tarkistetaan tekoälyyn pääsyä...",
"AiActions_SignedOutTitle": "Poista Wino AI Packin lukitus",
"AiActions_SignedOutDescription": "Käännä, kirjoita ja tiivistä sähköposteja tekoälyn avulla kirjautumalla Wino-tilillesi ja aktivoimalla AI Pack -lisäosan.",
"AiActions_NoPackTitle": "AI Pack vaaditaan",
"AiActions_NoPackDescription": "Olet kirjautuneena sisään, mutta AI Pack ei ole vielä käytössä. Osta se käyttääksesi Wino'n tekoälyn käännöksiä, uudelleenkirjoitusta ja tiivistämistyökaluja.",
"AiActions_UsageSummary": "Tässä kuussa käytettyjen krediittien määrä: {0} / {1}",
"Composer_AiRewritePolite": "Tee siitä kohteliaampi",
"Composer_AiRewritePoliteDescription": "Lievittää sanamuotoa samalla säilyttäen saman tarkoituksen.",
"Composer_AiRewriteAngry": "Tee siitä vihaisen",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / kk",
"WinoAccount_Management_AiPackPromoRequests": "1 000 krediittiä",
"WinoAccount_Management_AiPackGetButton": "Hae AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-pohjaisia työkaluja kääntä-, uudelleenkirjoittamis- ja tiivistystoimintoja Wino Mailiin.",
"WinoAddOn_AI_PACK_Keywords": "AI, kääntäminen, uudelleenkirjoittaminen, tiivistäminen, tuottavuus",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Rajoittamattomat tilit",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Poista tilirajoitus ja lisää haluamasi määrän sähköpostitilejä.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "tilit, rajoittamattomat, premium, lisäosa",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Masquer le bouton de profil dans la barre de titre qui ouvre le volet du compte Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notifications de mise à jour du Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Afficher les notifications et les actions de bas de page lorsqu'une mise à jour du Microsoft Store est disponible.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Masquer le panneau des actions IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Masquer les actions IA dans le rédacteur et le lecteur de mails.",
"SettingsAppPreferences_AiActions_Title": "Actions IA",
"SettingsAppPreferences_AiActions_Description": "Choisissez les langues IA par défaut et où les résumés doivent être enregistrés.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Langue de traduction par défaut",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Choisissez la langue cible par défaut utilisée par les actions de traduction IA.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Langue de résumé",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Résumer avec l'IA",
"Composer_AiSummarizeDescription": "Extraire les points clés, les éléments d'action et les décisions de ce courriel.",
"Composer_AiTranslate": "Traduire avec l'IA",
"Composer_AiActions": "Actions IA",
"Composer_AiRewrite": "Réécrire avec l'IA",
"AiActions_CheckingStatus": "Vérification de l'accès à l'IA...",
"AiActions_SignedOutTitle": "Déverrouiller le pack IA Wino",
"AiActions_SignedOutDescription": "Traduire, réécrire et résumer les e-mails avec l'IA après vous être connecté à votre compte Wino et avoir activé l'extension AI Pack.",
"AiActions_NoPackTitle": "Pack IA requis",
"AiActions_NoPackDescription": "Vous êtes connecté, mais le pack IA n'est pas encore actif. Achetez-le pour utiliser les outils de traduction, réécriture et résumé de Wino.",
"AiActions_UsageSummary": "{0} sur {1} crédits utilisés ce mois-ci.",
"Composer_AiRewritePolite": "Rendre plus poli",
"Composer_AiRewritePoliteDescription": "Adoucit le ton tout en conservant le même sens.",
"Composer_AiRewriteAngry": "Rendre plus agressif",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "4,99 $ / mois",
"WinoAccount_Management_AiPackPromoRequests": "1 000 crédits",
"WinoAccount_Management_AiPackGetButton": "Obtenir AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Outils IA pour traduire, réécrire et résumer les actions dans Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "IA, traduire, réécrire, résumer, productivité",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Comptes illimités",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Supprimer la limite de comptes et ajouter autant de comptes de messagerie que nécessaire.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "comptes, illimités, premium, module complémentaire",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Ocultar o botón de perfil na barra de título que abre o panel da conta de Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notificacións de actualización da Microsoft Store.",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Mostrar notificacións e accións no rodapé cando haxa unha actualización da Microsoft Store disponível.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Agochar panel de accións de IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Agochar as accións de IA no redactor e no lector de correo.",
"SettingsAppPreferences_AiActions_Title": "Accións de IA",
"SettingsAppPreferences_AiActions_Description": "Elixa os idiomas de IA predeterminados e onde se deben gardar os resumos.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Idioma de tradución por defecto.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Selecciona o idioma de destino predeterminado utilizado polas accións de tradución da IA.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Idioma de resumo.",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Resumir con IA",
"Composer_AiSummarizeDescription": "Extrae puntos clave, accións e decisións deste correo.",
"Composer_AiTranslate": "Traducir con IA",
"Composer_AiActions": "Accións IA",
"Composer_AiRewrite": "Reescribe con IA",
"AiActions_CheckingStatus": "Comprobando o acceso á IA...",
"AiActions_SignedOutTitle": "Desbloquear o paquete AI de Wino",
"AiActions_SignedOutDescription": "Traducir, reescribir e resumir correos con IA despois de iniciar sesión na túa Conta Wino e activar o complemento AI Pack.",
"AiActions_NoPackTitle": "Precísase AI Pack",
"AiActions_NoPackDescription": "Iniciaste sesión, pero o AI Pack non está activo aínda. Cómprao para usar as ferramentas de tradución, reescritura e resumo de IA de Wino.",
"AiActions_UsageSummary": "{0} de {1} créditos usados este mes.",
"Composer_AiRewritePolite": "Faino máis educado",
"Composer_AiRewritePoliteDescription": "Ablanda a redacción mantendo o mesmo propósito.",
"Composer_AiRewriteAngry": "Faino enfadado",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mes",
"WinoAccount_Management_AiPackPromoRequests": "1,000 créditos",
"WinoAccount_Management_AiPackGetButton": "Obter Pacote IA",
"WinoAddOn_AI_PACK_Name": "Pacote IA de Wino",
"WinoAddOn_AI_PACK_Description": "Ferramentas alimentadas por IA para traducir, reescribir e resumir accións en Wino Mail",
"WinoAddOn_AI_PACK_Keywords": "IA, traducir, reescribir, resumir, produtividade",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Contas ilimitadas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Quita o límite de contas e engade as contas de correo que precises",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "contas, ilimitadas, premium, complemento",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Sembunyikan tombol profil di bilah judul yang membuka flyout akun Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Pemberitahuan pembaruan toko",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Tampilkan pemberitahuan dan tindakan footer saat pembaruan Microsoft Store tersedia.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Sembunyikan panel tindakan AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Sembunyikan tindakan AI di penyusun email dan pembaca email.",
"SettingsAppPreferences_AiActions_Title": "Tindakan AI",
"SettingsAppPreferences_AiActions_Description": "Pilih bahasa AI bawaan dan tempat ringkasan disimpan.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Bahasa terjemahan bawaan",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Pilih bahasa target default yang digunakan oleh tindakan terjemahan AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Bahasa ringkasan",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Ringkas dengan AI",
"Composer_AiSummarizeDescription": "Ekstrak poin-poin utama, item tindakan, dan keputusan dari email ini.",
"Composer_AiTranslate": "Terjemahkan dengan AI",
"Composer_AiActions": "Tindakan AI",
"Composer_AiRewrite": "Tulis ulang dengan AI",
"AiActions_CheckingStatus": "Memeriksa akses AI...",
"AiActions_SignedOutTitle": "Buka Paket AI Wino",
"AiActions_SignedOutDescription": "Terjemahkan, tulis ulang, dan rangkum email menggunakan AI setelah masuk ke Akun Wino Anda dan mengaktifkan add-on Paket AI.",
"AiActions_NoPackTitle": "Diperlukan Paket AI",
"AiActions_NoPackDescription": "Anda telah masuk, tetapi Paket AI belum aktif. Beli paketnya untuk menggunakan alat terjemahan AI, penulisan ulang, dan rangkuman AI Wino.",
"AiActions_UsageSummary": "{0} dari {1} kredit telah digunakan bulan ini.",
"Composer_AiRewritePolite": "Jadikan lebih sopan",
"Composer_AiRewritePoliteDescription": "Membuat kata-kata lebih halus tanpa mengubah maksudnya.",
"Composer_AiRewriteAngry": "Buat marah",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / bln",
"WinoAccount_Management_AiPackPromoRequests": "1.000 kredit",
"WinoAccount_Management_AiPackGetButton": "Dapatkan Paket AI",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Alat bertenaga AI untuk menerjemahkan, menulis ulang, dan merangkum tindakan di Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, terjemahan, menulis ulang, merangkum, produktivitas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Akun Tak Terbatas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Hapus batas akun dan tambahkan sebanyak mungkin akun email yang Anda perlukan.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "akun, tak terbatas, premium, add-on",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Nascondi il pulsante profilo nella barra del titolo che apre il menu dell'account Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notifiche di aggiornamento del Microsoft Store.",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Mostra notifiche e azioni a piè di pagina quando è disponibile un aggiornamento dal Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Nascondi pannello azioni IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Nascondi le azioni IA nel redattore di posta e nel lettore.",
"SettingsAppPreferences_AiActions_Title": "Azioni AI",
"SettingsAppPreferences_AiActions_Description": "Scegli le lingue predefinite per l'IA e dove dovrebbero essere salvati i riassunti.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Lingua di traduzione predefinita",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Seleziona la lingua di destinazione predefinita utilizzata dalle azioni di traduzione AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Lingua di riepilogo",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Riepiloga con l'IA",
"Composer_AiSummarizeDescription": "Estrai i punti chiave, le azioni e le decisioni da questa email.",
"Composer_AiTranslate": "Traduci con l'IA",
"Composer_AiActions": "Azioni IA",
"Composer_AiRewrite": "Riformula con l'IA",
"AiActions_CheckingStatus": "Verifica l'accesso all'IA...",
"AiActions_SignedOutTitle": "Sblocca Wino AI Pack",
"AiActions_SignedOutDescription": "Traduci, riscrivi e riassumi le email con l'IA dopo aver effettuato l'accesso al tuo account Wino e attivato l'add-on AI Pack.",
"AiActions_NoPackTitle": "AI Pack richiesto",
"AiActions_NoPackDescription": "Hai effettuato l'accesso, ma l'AI Pack non è attivo ancora. Acquistalo per utilizzare gli strumenti di traduzione, riscrittura e riassunto con IA di Wino.",
"AiActions_UsageSummary": "{0} di {1} crediti usati questo mese.",
"Composer_AiRewritePolite": "Rendilo più cortese",
"Composer_AiRewritePoliteDescription": "Rende la formulazione meno rigida mantenendo lo stesso intento.",
"Composer_AiRewriteAngry": "Rendilo arrabbiato",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mese",
"WinoAccount_Management_AiPackPromoRequests": "1.000 crediti",
"WinoAccount_Management_AiPackGetButton": "Ottieni AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Strumenti basati sull'IA per tradurre, riscrivere e riassumere azioni in Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "IA, traduci, riscrivi, riassumi, produttività",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Account illimitati",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Rimuovi il limite di account e aggiungi quanti account di posta ti servono.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "account, illimitato, premium, componente aggiuntivo",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Wino アカウントのドロップダウンを開くタイトルバーのプロフィールボタンを非表示にします。",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "ストアの更新通知",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Microsoft Store の更新が利用可能なときに通知とフッターのアクションを表示します。",
"SettingsAppPreferences_HideAiActionsPanel_Title": "AI アクションパネルを非表示",
"SettingsAppPreferences_HideAiActionsPanel_Description": "メール作成時およびメール閲覧時の AI アクションを非表示にします。",
"SettingsAppPreferences_AiActions_Title": "AI アクション",
"SettingsAppPreferences_AiActions_Description": "デフォルトの AI 言語と要約を保存する場所を選択します。",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "デフォルトの翻訳言語",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "AI 翻訳アクションで使用されるデフォルトのターゲット言語を選択します。",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "要約言語",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "AI で要約",
"Composer_AiSummarizeDescription": "このメールから要点、アクション項目、決定事項を抽出します。",
"Composer_AiTranslate": "AI で翻訳",
"Composer_AiActions": "AI アクション",
"Composer_AiRewrite": "AI で言い換え",
"AiActions_CheckingStatus": "AI アクセスを確認しています...",
"AiActions_SignedOutTitle": "Wino AI パックのロックを解除",
"AiActions_SignedOutDescription": "Wino ア카ウントにサインインし、AI パックのアドオンを有効にした後、AI を使用してメールを翻訳・リライト・要約します。",
"AiActions_NoPackTitle": "AI パックが必要です",
"AiActions_NoPackDescription": "サインインしていますが、AI パックはまだ有効になっていません。Wino の AI 翻訳、リライト、要約機能を使用するには購入してください。",
"AiActions_UsageSummary": "今月は {0} / {1} クレジットを使用しました。",
"Composer_AiRewritePolite": "丁寧に書き直す",
"Composer_AiRewritePoliteDescription": "意図を変えず、表現を柔らかくします。",
"Composer_AiRewriteAngry": "怒りっぽく書く",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99/月",
"WinoAccount_Management_AiPackPromoRequests": "1,000 クレジット",
"WinoAccount_Management_AiPackGetButton": "AI Packを入手",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Wino Mail で翻訳、書き換え、要約を行うAI搭載ツールです。",
"WinoAddOn_AI_PACK_Keywords": "AI、翻訳、書き換え、要約、生産性",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "無制限アカウント",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "アカウントの上限を解除し、必要なだけメールアカウントを追加できます。",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "アカウント、無制限、プレミアム、アドオン",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Wino 계정 팝업을 여는 제목 표시줄의 프로필 버튼을 숨깁니다.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "스토어 업데이트 알림",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Microsoft Store 업데이트가 이용 가능할 때 알림 및 바닥글 작업을 표시합니다.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "AI 동작 패널 숨기기",
"SettingsAppPreferences_HideAiActionsPanel_Description": "메일 작성기와 읽기에서 AI 동작을 숨깁니다.",
"SettingsAppPreferences_AiActions_Title": "AI 동작",
"SettingsAppPreferences_AiActions_Description": "AI 번역 작업에서 사용할 기본 언어와 요약 저장 위치를 선택합니다.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "기본 번역 언어",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "AI 번역 작업에서 사용할 기본 대상 언어를 선택하세요.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "요약 언어",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "AI로 요약",
"Composer_AiSummarizeDescription": "이 이메일에서 핵심 포인트, 실행 항목 및 의사결정을 추출합니다.",
"Composer_AiTranslate": "AI로 번역",
"Composer_AiActions": "AI 작업",
"Composer_AiRewrite": "AI로 재작성",
"AiActions_CheckingStatus": "AI 접근 권한 확인 중...",
"AiActions_SignedOutTitle": "Wino AI 팩 잠금 해제",
"AiActions_SignedOutDescription": "Wino 계정에 로그인하고 AI Pack 애드온을 활성화한 후 AI로 이메일을 번역, 재작성 및 요약합니다.",
"AiActions_NoPackTitle": "AI Pack 필요",
"AiActions_NoPackDescription": "로그인되어 있지만 AI Pack이 아직 활성화되어 있지 않습니다. Wino의 AI 번역, 재작성 및 요약 도구를 사용하려면 구매하십시오.",
"AiActions_UsageSummary": "{0} 중 {1} 크레딧이 이번 달에 사용되었습니다.",
"Composer_AiRewritePolite": "정중하게 다듬기",
"Composer_AiRewritePoliteDescription": "의도는 유지하면서 표현을 부드럽게 다듬습니다.",
"Composer_AiRewriteAngry": "화나게 다듬기",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 /월",
"WinoAccount_Management_AiPackPromoRequests": "1,000 크레딧",
"WinoAccount_Management_AiPackGetButton": "AI Pack 받기",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI 기반 도구로 Wino Mail에서 번역, 재작성 및 요약 작업을 수행합니다.",
"WinoAddOn_AI_PACK_Keywords": "AI, 번역, 재작성, 요약, 생산성",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "무제한 계정",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "계정 한도를 제거하고 필요한 만큼의 메일 계정을 추가합니다.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "계정, 무제한, 프리미엄, 애드온",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Slėpti pavadinimo juostos profilio mygtuką, kuris atveria Wino paskyros išskleidžiamąjį langą.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Parduotuvės atnaujinimų pranešimai",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Rodyti pranešimus ir veiksmus apačioje, kai Microsoft Store bus prieinamas atnaujinimas.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Slėpti AI veiksmų skydelį",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Slėpti AI veiksmus el. pašto rengyklėje ir skaitytuve.",
"SettingsAppPreferences_AiActions_Title": "Dirbtinio intelekto veiksmai",
"SettingsAppPreferences_AiActions_Description": "Pasirinkite numatytas AI kalbas ir kur turėtų būti saugomos santraukos.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Numatomoji vertimo kalba",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Pasirinkite numatytąją tikslinę kalbą, kuri bus naudojama AI vertimo veiksmuose.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Santraukos kalba",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Apibendrinti su AI",
"Composer_AiSummarizeDescription": "Ištraukite pagrindines mintis, veiksmų punktus ir sprendimus iš šio el. laiško.",
"Composer_AiTranslate": "Išversti su AI",
"Composer_AiActions": "AI veiksmai",
"Composer_AiRewrite": "Perrašyti su AI",
"AiActions_CheckingStatus": "Tikrinama prieiga prie AI...",
"AiActions_SignedOutTitle": "Atrakinkite Wino AI paketą",
"AiActions_SignedOutDescription": "Išverskite, perrašykite ir apibendrinkite el. laiškus naudodami AI prisijungę prie savo Wino paskyros ir aktyvavę AI Pack papildinį.",
"AiActions_NoPackTitle": "Reikia AI paketo",
"AiActions_NoPackDescription": "Jūs esate prisijungęs, tačiau AI paketas dar neveikia. Įsigykite jį, kad naudotumėte Wino AI vertimo, perrašymo ir santraukos įrankius.",
"AiActions_UsageSummary": "{0} iš {1} kreditų šį mėnesį panaudota.",
"Composer_AiRewritePolite": "Padarykite mandagų toną",
"Composer_AiRewritePoliteDescription": "Švelnina formuluotę išlaikant tą patį tikslą.",
"Composer_AiRewriteAngry": "Padarykite piktą toną",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mėn",
"WinoAccount_Management_AiPackPromoRequests": "1 000 kreditų",
"WinoAccount_Management_AiPackGetButton": "Gauti AI paketą",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI pagrindu veikiantys įrankiai vertimams, perrašymams ir santraukoms Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, vertimas, perrašymas, santraukos, produktyvumas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Neribotos paskyros",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Šalina paskyrų apribojimą ir leidžia pridėti tiek el. pašto paskyrų, kiek reikia.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "paskyros, neribotos, premium, priedas",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Verberg de profielknop in de titelbalk die het Wino-account-uitklapmenu opent.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Store-updatemeldingen",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Toon meldingen en footer-acties wanneer er een Microsoft Store-update beschikbaar is.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "AI-actiespaneel verbergen",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Verberg AI-acties in de e-mailopsteller en -lezer.",
"SettingsAppPreferences_AiActions_Title": "AI-acties",
"SettingsAppPreferences_AiActions_Description": "Kies de standaard AI-talen en waar samenvattingen moeten worden opgeslagen.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Standaard doeltaal",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Kies de standaard doeltaal die door AI-vertalingacties wordt gebruikt.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Samenvatteltaal",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Samenvatten met AI",
"Composer_AiSummarizeDescription": "Haal belangrijke punten, actiepunten en beslissingen uit deze e-mail.",
"Composer_AiTranslate": "Vertaal met AI",
"Composer_AiActions": "AI-acties",
"Composer_AiRewrite": "Herschrijven met AI",
"AiActions_CheckingStatus": "AI-toegang controleren...",
"AiActions_SignedOutTitle": "Wino AI-pack ontgrendelen",
"AiActions_SignedOutDescription": "Vertaal, herschrijf en vat e-mails samen met AI nadat u bent ingelogd op uw Wino-account en de AI Pack-add-on hebt geactiveerd.",
"AiActions_NoPackTitle": "AI Pack vereist",
"AiActions_NoPackDescription": "U bent ingelogd, maar AI Pack is nog niet actief. Koop het om de AI-vertaling, herschrijf- en samenvattingshulpmiddelen van Wino te gebruiken.",
"AiActions_UsageSummary": "{0} van {1} credits deze maand gebruikt.",
"Composer_AiRewritePolite": "Maak het beleefder",
"Composer_AiRewritePoliteDescription": "Verzacht de formulering terwijl de bedoeling hetzelfde blijft.",
"Composer_AiRewriteAngry": "Maak het boos",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mnd",
"WinoAccount_Management_AiPackPromoRequests": "1.000 credits",
"WinoAccount_Management_AiPackGetButton": "AI Pack verkrijgen",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-gedreven tools voor vertalen, herschrijven en samenvatten acties in Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, vertalen, herschrijven, samenvatten, productiviteit",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Onbeperkte accounts",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Verwijder de accountlimiet en voeg zoveel e-mailaccounts toe als je nodig hebt.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "accounts, onbeperkt, premium, add-on",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Ukryj przycisk profilu na pasku tytułu, który otwiera wysuwane menu konta Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Powiadomienia o aktualizacjach sklepu",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Pokaż powiadomienia i akcje w stopce, gdy dostępna jest aktualizacja Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Ukryj panel akcji AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Ukryj akcje AI w komponatorze i czytniku wiadomości.",
"SettingsAppPreferences_AiActions_Title": "Działania AI",
"SettingsAppPreferences_AiActions_Description": "Wybierz domyślne języki AI i miejsce zapisywania streszczeń.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Domyślny język tłumaczenia",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Wybierz domyślny język docelowy używany przez akcje tłumaczenia AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Język podsumowania",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Streszczaj AI",
"Composer_AiSummarizeDescription": "Wyodrębnia kluczowe punkty, zadania do wykonania i decyzje z tej wiadomości.",
"Composer_AiTranslate": "Tłumacz za pomocą AI",
"Composer_AiActions": "Działania AI",
"Composer_AiRewrite": "Przepisz za pomocą AI",
"AiActions_CheckingStatus": "Sprawdzanie dostępu do AI...",
"AiActions_SignedOutTitle": "Odblokuj pakiet Wino AI",
"AiActions_SignedOutDescription": "Tłumaczenie, przepisywanie i streszczanie wiadomości za pomocą AI po zalogowaniu do konta Wino i aktywacji dodatku AI Pack.",
"AiActions_NoPackTitle": "Wymagany pakiet AI",
"AiActions_NoPackDescription": "Jesteś zalogowany, ale pakiet AI nie jest jeszcze aktywny. Wykup go, aby korzystać z tłumaczenia, przepisywania i streszczania AI w Wino.",
"AiActions_UsageSummary": "{0} z {1} kredytów wykorzystano w tym miesiącu.",
"Composer_AiRewritePolite": "Uczyń to grzeczniejszym",
"Composer_AiRewritePoliteDescription": "Złagodza ton, zachowując ten sam sens.",
"Composer_AiRewriteAngry": "Uczyń to agresywnym",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mies.",
"WinoAccount_Management_AiPackPromoRequests": "1 000 kredytów",
"WinoAccount_Management_AiPackGetButton": "Pobierz Pakiet AI",
"WinoAddOn_AI_PACK_Name": "Pakiet AI Wino",
"WinoAddOn_AI_PACK_Description": "Narzędzia z AI do tłumaczenia, przepisywania i streszczania wiadomości w Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, tłumaczenie, przepisywanie, streszczanie, produktywność",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Nielimitowane konta",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Usuń ograniczenie kont i dodawaj dowolną liczbę kont pocztowych.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "konta, nieograniczony, premium, dodatek",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Ocultar o botão de perfil na barra de título que abre o menu suspenso da conta do Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notificações de atualização da Microsoft Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Exibir notificações e ações no rodapé quando houver uma atualização disponível da Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Ocultar painel de ações de IA",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Ocultar ações de IA no redator de e-mails e na leitura.",
"SettingsAppPreferences_AiActions_Title": "Ações de IA",
"SettingsAppPreferences_AiActions_Description": "Escolha os idiomas padrão da IA e onde os resumos devem ser salvos.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Idioma de tradução padrão",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Selecione o idioma de destino padrão usado pelas ações de tradução por IA.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Idioma de resumo",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Resumir com IA",
"Composer_AiSummarizeDescription": "Extrair pontos-chave, itens de ação e decisões deste e-mail.",
"Composer_AiTranslate": "Traduzir com IA",
"Composer_AiActions": "Ações de IA",
"Composer_AiRewrite": "Reescrever com IA",
"AiActions_CheckingStatus": "Verificando o acesso à IA...",
"AiActions_SignedOutTitle": "Desbloquear o Pacote de IA do Wino",
"AiActions_SignedOutDescription": "Traduza, reescreva e resuma e-mails com IA após fazer login em sua Conta Wino e ativar o complemento Pacote de IA.",
"AiActions_NoPackTitle": "Pacote de IA necessário",
"AiActions_NoPackDescription": "Você está conectado, mas o Pacote de IA ainda não está ativo. Compre-o para usar as ferramentas de tradução, reescrita e resumos com IA do Wino.",
"AiActions_UsageSummary": "{0} de {1} créditos usados neste mês.",
"Composer_AiRewritePolite": "Tornar mais polido",
"Composer_AiRewritePoliteDescription": "Suaviza a redação mantendo a mesma intenção.",
"Composer_AiRewriteAngry": "Tornar mais agressivo",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4,99 / mês",
"WinoAccount_Management_AiPackPromoRequests": "1.000 créditos",
"WinoAccount_Management_AiPackGetButton": "Obter AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Ferramentas alimentadas por IA para traduzir, reescrever e resumir ações no Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "IA, traduzir, reescrever, resumir, produtividade",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Contas ilimitadas",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Remover o limite de contas e adicionar quantas contas de e-mail você precisar.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "contas, ilimitadas, premium, complemento",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Ascundeți butonul de profil din bara de titlu care deschide meniul contului Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Notificări despre actualizările din Microsoft Store",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Afișează notificări și acțiuni în subsol atunci când este disponibilă o actualizare din Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Ascunde panoul de acțiuni AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Ascunde acțiunile AI în editorul de e-mail și în cititor.",
"SettingsAppPreferences_AiActions_Title": "Acțiuni AI",
"SettingsAppPreferences_AiActions_Description": "Alegeți limbile AI implicite și locul în care rezumatele ar trebui să fie salvate.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Limba de traducere implicită",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Alegeți limba țintă implicită utilizată de acțiunile de traducere AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Limba rezumării",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Rezumă cu AI",
"Composer_AiSummarizeDescription": "Extrage ideile principale, pașii de acțiune și deciziile din acest e-mail.",
"Composer_AiTranslate": "Translatează cu AI",
"Composer_AiActions": "Acțiuni AI",
"Composer_AiRewrite": "Rescrie cu AI",
"AiActions_CheckingStatus": "Se verifică accesul AI...",
"AiActions_SignedOutTitle": "Deblochează pachetul Wino AI",
"AiActions_SignedOutDescription": "Translatează, rescrie și rezumă e-mailuri cu AI după ce te autentifici în contul tău Wino și activezi pachetul AI.",
"AiActions_NoPackTitle": "Pachetul AI este necesar",
"AiActions_NoPackDescription": "Ești conectat, dar pachetul AI nu este încă activ. Achiziționează-l pentru a folosi instrumentele AI de traducere, rescriere și rezumare ale Wino.",
"AiActions_UsageSummary": "{0} din {1} credite utilizate în această lună.",
"Composer_AiRewritePolite": "Fă-l politicos",
"Composer_AiRewritePoliteDescription": "Îmblânzește formularea păstrând același scop.",
"Composer_AiRewriteAngry": "Fă-l furios",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / lună",
"WinoAccount_Management_AiPackPromoRequests": "1.000 credite",
"WinoAccount_Management_AiPackGetButton": "Obține AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Unelte alimentate de AI pentru traducere, rescriere și rezumare acțiuni în Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, traducere, rescrie, rezumă, productivitate",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Conturi nelimitate",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Elimină limita de conturi și adaugă cât de multe conturi de e-mail ai nevoie.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "conturi, nelimitate, premium, extensie",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Скрыть кнопку профиля в панели заголовка, которая открывает выпадающее меню учетной записи Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Уведомления об обновлениях магазина",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Показывать уведомления и действия в нижнем колонтитуле, когда доступно обновление Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Скрыть панель действий ИИ",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Скрыть функции ИИ в окне составления писем и в просмотре писем.",
"SettingsAppPreferences_AiActions_Title": "Действия ИИ",
"SettingsAppPreferences_AiActions_Description": "Выберите языки ИИ по умолчанию и место сохранения сводок.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Язык перевода по умолчанию",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Выберите языки перевода по умолчанию, которые будут использоваться в действиях перевода ИИ.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Язык суммирования",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Сформировать резюме с помощью ИИ",
"Composer_AiSummarizeDescription": "Извлечь ключевые моменты, задачи и принятые решения из этого письма.",
"Composer_AiTranslate": "Перевести с помощью ИИ",
"Composer_AiActions": "Действия ИИ",
"Composer_AiRewrite": "Переписать с помощью ИИ",
"AiActions_CheckingStatus": "Проверяем доступ к ИИ...",
"AiActions_SignedOutTitle": "Разблокировать пакет Wino AI",
"AiActions_SignedOutDescription": "Перевод, переработка и резюмирование писем с помощью искусственного интеллекта после входа в учетную запись Wino и активации дополнения AI Pack.",
"AiActions_NoPackTitle": "Требуется пакет AI",
"AiActions_NoPackDescription": "Вы вошли в систему, но пакет AI не активен. Приобретите его, чтобы использовать инструменты перевода, переработки и резюмирования Wino с помощью ИИ.",
"AiActions_UsageSummary": "{0} из {1} кредитов потрачено в этом месяце.",
"Composer_AiRewritePolite": "Сделать вежливым",
"Composer_AiRewritePoliteDescription": "Смягчает формулировку, сохраняя тот же смысл.",
"Composer_AiRewriteAngry": "Сделать агрессивным",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / мес",
"WinoAccount_Management_AiPackPromoRequests": "1 000 кредитов",
"WinoAccount_Management_AiPackGetButton": "Получить AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "AI-powered tools for translate, rewrite, and summarize actions in Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, translate, rewrite, summarize, productivity",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Unlimited Accounts",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Remove the account limit and add as many mail accounts as you need.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "accounts, unlimited, premium, add-on",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Skryť tlačidlo profilu v titulnom riadku, ktoré otvára vysúvací panel účtu Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Oznámenia o aktualizáciách obchodu",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Zobraziť upozornenia a akcie na päte stránky, keď je k dispozícii aktualizácia z obchodu Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Skryť panel akcií AI",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Skryť akcie AI v tvorbe a čítaní e-mailov.",
"SettingsAppPreferences_AiActions_Title": "AI akcie",
"SettingsAppPreferences_AiActions_Description": "Vyberte predvolené jazyky AI a miesto, kam sa majú ukladať súhrny.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Predvolený jazyk pre preklad",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Vyberte predvolený cieľový jazyk používaný akciami prekladu AI.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Jazyk zhrnutia",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Zhrnúť pomocou AI",
"Composer_AiSummarizeDescription": "Získajte kľúčové body, akčné úlohy a rozhodnutia z tohto e-mailu.",
"Composer_AiTranslate": "Preložiť pomocou AI",
"Composer_AiActions": "AI akcie",
"Composer_AiRewrite": "Prepísať pomocou AI",
"AiActions_CheckingStatus": "Kontrolujem prístup k AI...",
"AiActions_SignedOutTitle": "Odomknúť Wino AI balík",
"AiActions_SignedOutDescription": "Prekladať, prepisovať a zhrňovať e-maily pomocou AI po prihlásení do svojho účtu Wino a aktivovaní doplnku AI Pack.",
"AiActions_NoPackTitle": "AI balík vyžadovaný",
"AiActions_NoPackDescription": "Ste prihlásený, ale AI balík ešte nie je aktívny. Kúpte si ho, aby ste mohli používať nástroje Wino AI pre preklad, prepísanie a zhrnutie e-mailov.",
"AiActions_UsageSummary": "{0} z {1} kreditov použitých tento mesiac.",
"Composer_AiRewritePolite": "Urob to zdvorilé",
"Composer_AiRewritePoliteDescription": "Zjemní formuláciu pri zachovaní rovnakého zámeru.",
"Composer_AiRewriteAngry": "Urob to agresívne",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mesiac",
"WinoAccount_Management_AiPackPromoRequests": "1 000 kreditov",
"WinoAccount_Management_AiPackGetButton": "Získať AI balík",
"WinoAddOn_AI_PACK_Name": "Wino AI Balík",
"WinoAddOn_AI_PACK_Description": "Nástroje poháňané AI na preklad, prepisovanie a zhrnutie akcií v Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, preklad, prepisovanie, zhrnutie, produktivita",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Neobmedzené účty",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Odstráňte obmedzenie účtov a pridajte toľko e-mailových účtov, koľko potrebujete.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "účty, neobmedzené, prémiové, doplnok",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Wino hesap açılır menüsünü açan başlık çubuğu profil düğmesini gizleyin.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Mağaza güncelleme bildirimleri",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Bir Microsoft Store güncellemesi mevcut olduğunda bildirimleri ve altbilgi işlemlerini gösterin.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Yapay Zeka eylemleri panelini gizle",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Posta yazımında ve okumada Yapay Zeka eylemlerini gizle.",
"SettingsAppPreferences_AiActions_Title": "Yapay Zeka işlemleri",
"SettingsAppPreferences_AiActions_Description": "Yapay zeka işlemleri için varsayılan dilleri ve özetlerin nerede kaydedileceğini seçin.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Varsayılan çeviri dili",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Yapay zeka çeviri işlemlerinde kullanılacak varsayılan hedef dili seçin.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Özetleme dili",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Yapay zeka ile özetle",
"Composer_AiSummarizeDescription": "Bu e-postadan ana noktaları, eylem adımlarını ve kararları çıkarın.",
"Composer_AiTranslate": "Yapay zeka ile çevir",
"Composer_AiActions": "Yapay Zeka Eylemleri",
"Composer_AiRewrite": "Yapay zeka ile yeniden yaz",
"AiActions_CheckingStatus": "Yapay zeka erişimi kontrol ediliyor...",
"AiActions_SignedOutTitle": "Wino AI Paketi Kilidi Aç",
"AiActions_SignedOutDescription": "Wino Hesabınıza giriş yapıp AI Paket eklentisini etkinleştirdikten sonra e-postaları AI ile çevirin, yeniden yazın ve özetleyin.",
"AiActions_NoPackTitle": "AI Paketi gerekli",
"AiActions_NoPackDescription": "Giriş yaptınız, ancak AI Paketi henüz etkin değil. Wino'nun AI çeviri, yeniden yazma ve özetleme araçlarını kullanmak için satın alın.",
"AiActions_UsageSummary": "Bu ay kullanılan kredi: {0} / {1} kredi.",
"Composer_AiRewritePolite": "Daha nazik hale getir",
"Composer_AiRewritePoliteDescription": "Aynı amacı koruyarak ifadeyi yumuşatır.",
"Composer_AiRewriteAngry": "Kızgın hale getir",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / mo",
"WinoAccount_Management_AiPackPromoRequests": "1.000 kredi",
"WinoAccount_Management_AiPackGetButton": "AI Paketi Al",
"WinoAddOn_AI_PACK_Name": "Wino AI Paketi",
"WinoAddOn_AI_PACK_Description": "Wino Mail için çevirmek, yeniden yazmak ve özetlemek işlemlerinde AI destekli araçlar.",
"WinoAddOn_AI_PACK_Keywords": "AI, çeviri, yeniden yazma, özetleme, verimlilik",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Sınırsız Hesaplar",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "İhtiyacınız olan kadar e-posta hesabı ekleyin ve hesap sınırını kaldırın.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "hesaplar, sınırsız, premium, eklenti",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "Приховати кнопку профіля на панелі заголовка, яка відкриває випадаюче меню облікового запису Wino.",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "Сповіщення про оновлення магазину",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "Показувати сповіщення та дії внизу, коли доступне оновлення Microsoft Store.",
"SettingsAppPreferences_HideAiActionsPanel_Title": "Приховати панель дій ШІ",
"SettingsAppPreferences_HideAiActionsPanel_Description": "Приховати дії ШІ у формуванні та читанні листів.",
"SettingsAppPreferences_AiActions_Title": "Дії ШІ",
"SettingsAppPreferences_AiActions_Description": "Виберіть мови ШІ за замовчуванням та де зберігати підсумки.",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "Мова перекладу за замовчуванням",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "Виберіть мову перекладу за замовчуванням, яку використають дії перекладу ШІ.",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "Мова підсумовування",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "Підсумуйте за допомогою ШІ",
"Composer_AiSummarizeDescription": "Виділити основні пункти, завдання та рішення з цього електронного листа.",
"Composer_AiTranslate": "Перекласти за допомогою ШІ",
"Composer_AiActions": "Дії ШІ",
"Composer_AiRewrite": "Переписати за допомогою ШІ",
"AiActions_CheckingStatus": "Перевіряю доступ до ШІ...",
"AiActions_SignedOutTitle": "Розблокувати пакет Wino AI",
"AiActions_SignedOutDescription": "Перекладайте, переписуйте та підсумовуйте електронні листи за допомогою ШІ після входу в обліковий запис Wino та активації надбудови AI Pack.",
"AiActions_NoPackTitle": "Потрібен пакет AI",
"AiActions_NoPackDescription": "Ви увійшли, але пакет AI ще не активний. Придбайте його, щоб користуватися інструментами перекладу, переписування та підсумовування від Wino за допомогою ШІ.",
"AiActions_UsageSummary": "{0} з {1} кредитів використано цього місяця.",
"Composer_AiRewritePolite": "Зробити ввічливішим",
"Composer_AiRewritePoliteDescription": "Пом'якшує формулювання, зберігаючи той же зміст.",
"Composer_AiRewriteAngry": "Зробити більш різким",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / міс.",
"WinoAccount_Management_AiPackPromoRequests": "1 000 кредитів",
"WinoAccount_Management_AiPackGetButton": "Отримати AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "Інструменти на базі штучного інтелекту для перекладу, переформулювання та стислих підсумків дій у Wino Mail.",
"WinoAddOn_AI_PACK_Keywords": "AI, переклад, переформулювати, підсумовувати, продуктивність",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "Необмежені облікові записи",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "Видалити обмеження на облікові записи та додати стільки поштових облікових записів, скільки потрібно.",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "облікові записи, необмежені, преміум, надбудова",

View File

@@ -783,10 +783,6 @@
"SettingsAppPreferences_HideWinoAccountButton_Description": "隐藏在标题栏中用于打开 Wino 账户弹出菜单的个人资料按钮。",
"SettingsAppPreferences_StoreUpdateNotifications_Title": "商店更新通知",
"SettingsAppPreferences_StoreUpdateNotifications_Description": "在 Microsoft Store 有更新时显示通知和页脚操作。",
"SettingsAppPreferences_HideAiActionsPanel_Title": "隐藏 AI 操作面板",
"SettingsAppPreferences_HideAiActionsPanel_Description": "在邮件撰写和阅读器中隐藏 AI 操作。",
"SettingsAppPreferences_AiActions_Title": "AI 操作",
"SettingsAppPreferences_AiActions_Description": "选择默认 AI 语言及摘要应保存的位置。",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Title": "默认翻译语言",
"SettingsAppPreferences_AiDefaultTranslationLanguage_Description": "选择 AI 翻译操作使用的默认目标语言。",
"SettingsAppPreferences_AiSummarizeLanguage_Title": "摘要语言",
@@ -1208,14 +1204,7 @@
"Composer_AiSummarize": "使用 AI 总结",
"Composer_AiSummarizeDescription": "提取此电子邮件中的要点、行动项和决议。",
"Composer_AiTranslate": "使用 AI 翻译",
"Composer_AiActions": "AI 操作",
"Composer_AiRewrite": "使用 AI 重写",
"AiActions_CheckingStatus": "正在检查 AI 访问权限…",
"AiActions_SignedOutTitle": "解锁 Wino AI 套件",
"AiActions_SignedOutDescription": "在登录您的 Wino 帐户并激活 AI 套件插件后,使用 AI 翻译、重写和摘要电子邮件。",
"AiActions_NoPackTitle": "需要 AI 套件",
"AiActions_NoPackDescription": "您已登录,但 AI 套件尚未激活。购买后即可使用 Wino 的 AI 翻译、重写和摘要工具。",
"AiActions_UsageSummary": "{0} / {1} 积分本月已使用。",
"Composer_AiRewritePolite": "使其更有礼貌",
"Composer_AiRewritePoliteDescription": "在保持相同意图的前提下软化措辞。",
"Composer_AiRewriteAngry": "让措辞更愤怒",
@@ -1396,9 +1385,6 @@
"WinoAccount_Management_AiPackPromoPrice": "$4.99 / 月",
"WinoAccount_Management_AiPackPromoRequests": "1,000 积分",
"WinoAccount_Management_AiPackGetButton": "获取 AI Pack",
"WinoAddOn_AI_PACK_Name": "Wino AI Pack",
"WinoAddOn_AI_PACK_Description": "用于在 Wino Mail 中进行翻译、改写和摘要操作的 AI 驱动工具。",
"WinoAddOn_AI_PACK_Keywords": "AI、翻译、改写、摘要、生产力",
"WinoAddOn_UNLIMITED_ACCOUNTS_Name": "无限账户",
"WinoAddOn_UNLIMITED_ACCOUNTS_Description": "移除账户数量限制,您可以添加任意数量的邮箱账户。",
"WinoAddOn_UNLIMITED_ACCOUNTS_Keywords": "账户、无限、高级、插件",

View File

@@ -7,7 +7,6 @@ using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Services;
@@ -222,36 +221,6 @@ public class WinoAccountProfileServiceTests : IAsyncLifetime
_apiClient.Verify(x => x.GetCurrentUserAsync(default), Times.AtLeastOnce);
}
[Fact]
public async Task SummarizeAsync_ShouldReturnQuotaBackedResponse()
{
var authResult = CreateAuthResult("first@example.com");
_apiClient
.Setup(x => x.LoginAsync("first@example.com", "pw", default))
.ReturnsAsync(WinoAccountApiResult<AuthResultDto>.Success(authResult));
_apiClient
.Setup(x => x.SummarizeAsync("<p>Hello</p>", "en", default))
.ReturnsAsync(ApiEnvelope<AiTextResultDto>.Success(
new AiTextResultDto("<p>Summary</p>"),
new QuotaInfoDto(
"Active",
DateTimeOffset.UtcNow.AddDays(-1),
DateTimeOffset.UtcNow.AddDays(29),
1000,
4,
996,
new AiPackProductInfoDto("AI_PACK", 1000, 4.99m, "USD", "month"))));
await _service.LoginAsync("first@example.com", "pw");
var response = await _service.SummarizeAsync("<p>Hello</p>", "en");
response.IsSuccess.Should().BeTrue();
response.Result?.Html.Should().Be("<p>Summary</p>");
}
private static AuthResultDto CreateAuthResult(string email)
{
return new AuthResultDto(

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
@@ -12,7 +12,6 @@ namespace Wino.Core.ViewModels;
public partial class AboutPageViewModel : CoreBaseViewModel
{
private readonly IStoreRatingService _storeRatingService;
private readonly IMailDialogService _dialogService;
private readonly INativeAppService _nativeAppService;
private readonly IApplicationConfiguration _appInitializerService;
@@ -23,14 +22,11 @@ public partial class AboutPageViewModel : CoreBaseViewModel
public string VersionName => _nativeAppService.GetFullAppVersion();
public string WebsiteUrl => AppUrls.Website;
public string DiscordChannelUrl => AppUrls.Discord;
public string GitHubUrl => AppUrls.GitHub;
public string PrivacyPolicyUrl => AppUrls.PrivacyPolicy;
public string PaypalUrl => AppUrls.Paypal;
public IPreferencesService PreferencesService { get; }
public AboutPageViewModel(IStoreRatingService storeRatingService,
IMailDialogService dialogService,
public AboutPageViewModel(IMailDialogService dialogService,
INativeAppService nativeAppService,
IPreferencesService preferencesService,
IApplicationConfiguration appInitializerService,
@@ -38,7 +34,6 @@ public partial class AboutPageViewModel : CoreBaseViewModel
IFileService fileService,
IWinoLogger logInitializer)
{
_storeRatingService = storeRatingService;
_dialogService = dialogService;
_nativeAppService = nativeAppService;
_logInitializer = logInitializer;
@@ -111,22 +106,16 @@ public partial class AboutPageViewModel : CoreBaseViewModel
[RelayCommand]
private async Task Navigate(object url)
{
if (url is string stringUrl)
if (url is not string stringUrl)
return;
if (stringUrl == DiscordChannelUrl)
{
if (stringUrl == "Store")
await ShowRateDialogAsync();
else
{
// Discord disclaimer message about server.
if (stringUrl == DiscordChannelUrl)
await _dialogService.ShowMessageAsync(Translator.DiscordChannelDisclaimerMessage,
Translator.DiscordChannelDisclaimerTitle,
WinoCustomMessageDialogIcon.Warning);
await _nativeAppService.LaunchUriAsync(new Uri(stringUrl));
}
await _dialogService.ShowMessageAsync(Translator.DiscordChannelDisclaimerMessage,
Translator.DiscordChannelDisclaimerTitle,
WinoCustomMessageDialogIcon.Warning);
}
}
private Task ShowRateDialogAsync() => _storeRatingService.LaunchStorePageForReviewAsync();
}
await _nativeAppService.LaunchUriAsync(new Uri(stringUrl));
}
}

View File

@@ -1,13 +1,11 @@
using System.Collections.ObjectModel;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using Wino.Core.Domain;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.ViewModels.Data;
@@ -21,31 +19,16 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM
public ObservableCollection<IAccountProviderDetailViewModel> Accounts { get; set; } = [];
public IEnumerable<IAccountProviderDetailViewModel> StartupAccounts => Accounts.Where(IsStartupEligible);
public bool IsPurchasePanelVisible => !HasUnlimitedAccountProduct;
public bool IsAccountCreationAlmostOnLimit => Accounts != null && Accounts.Count == FREE_ACCOUNT_COUNT - 1;
public bool HasAccountsDefined => Accounts != null && Accounts.Any();
public bool CanReorderAccounts => Accounts?.Sum(a => a.HoldingAccountCount) > 1;
public string UsedAccountsString => string.Format(Translator.WinoUpgradeRemainingAccountsMessage, Accounts.Count, FREE_ACCOUNT_COUNT);
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IsPurchasePanelVisible))]
public partial bool HasUnlimitedAccountProduct { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IsAccountCreationAlmostOnLimit))]
[NotifyPropertyChangedFor(nameof(IsPurchasePanelVisible))]
public partial bool IsAccountCreationBlocked { get; set; }
[ObservableProperty]
public partial IAccountProviderDetailViewModel StartupAccount { get; set; }
public int FREE_ACCOUNT_COUNT { get; } = 3;
protected IDialogServiceBase DialogService { get; }
protected INavigationService NavigationService { get; }
protected IAccountService AccountService { get; }
protected IProviderService ProviderService { get; }
protected IStoreManagementService StoreManagementService { get; }
protected IWinoAccountProfileService WinoAccountProfileService { get; }
protected IAuthenticationProvider AuthenticationProvider { get; }
protected IPreferencesService PreferencesService { get; }
@@ -54,7 +37,6 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM
INavigationService navigationService,
IAccountService accountService,
IProviderService providerService,
IStoreManagementService storeManagementService,
IWinoAccountProfileService winoAccountProfileService,
IAuthenticationProvider authenticationProvider,
IPreferencesService preferencesService)
@@ -63,49 +45,11 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM
NavigationService = navigationService;
AccountService = accountService;
ProviderService = providerService;
StoreManagementService = storeManagementService;
WinoAccountProfileService = winoAccountProfileService;
AuthenticationProvider = authenticationProvider;
PreferencesService = preferencesService;
}
[RelayCommand]
private void NavigateAccountDetails(AccountProviderDetailViewModel accountDetails)
{
Messenger.Send(new BreadcrumbNavigationRequested(GetAccountDetailsTitle(accountDetails.Account),
WinoPage.AccountDetailsPage,
accountDetails.Account.Id));
}
[RelayCommand]
public async Task PurchaseUnlimitedAccountAsync()
{
var purchaseResult = await StoreManagementService.PurchaseAsync(WinoAddOnProductType.UNLIMITED_ACCOUNTS);
if (purchaseResult == StorePurchaseResult.Succeeded)
DialogService.InfoBarMessage(Translator.Info_PurchaseThankYouTitle, Translator.Info_PurchaseThankYouMessage, InfoBarMessageType.Success);
else if (purchaseResult == StorePurchaseResult.AlreadyPurchased)
DialogService.InfoBarMessage(Translator.Info_PurchaseExistsTitle, Translator.Info_PurchaseExistsMessage, InfoBarMessageType.Warning);
bool shouldRefreshPurchasePanel = purchaseResult == StorePurchaseResult.Succeeded || purchaseResult == StorePurchaseResult.AlreadyPurchased;
if (shouldRefreshPurchasePanel)
{
await ManageStorePurchasesAsync();
}
}
public async Task ManageStorePurchasesAsync()
{
var hasUnlimitedAccountProduct = await StoreManagementService.HasProductAsync(WinoAddOnProductType.UNLIMITED_ACCOUNTS).ConfigureAwait(false);
await ExecuteUIThread(() =>
{
HasUnlimitedAccountProduct = hasUnlimitedAccountProduct;
IsAccountCreationBlocked = !hasUnlimitedAccountProduct && Accounts.Count >= FREE_ACCOUNT_COUNT;
});
}
public AccountProviderDetailViewModel GetAccountProviderDetails(MailAccount account)
{
var provider = ProviderService.GetProviderDetail(account.ProviderType);
@@ -150,4 +94,4 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM
_ => true
};
}
}
}

View File

@@ -15,14 +15,12 @@ public partial class WinoAddOnItemViewModel : ObservableObject
public string IconGlyph => ProductType switch
{
WinoAddOnProductType.AI_PACK => "\uE945",
WinoAddOnProductType.UNLIMITED_ACCOUNTS => "\uE716",
_ => "\uE10F"
};
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowPurchaseState))]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial bool IsPurchased { get; set; }
public ICommand? PurchaseCommand { get; set; }
@@ -30,7 +28,6 @@ public partial class WinoAddOnItemViewModel : ObservableObject
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowLoadingState))]
[NotifyPropertyChangedFor(nameof(ShowPurchaseState))]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
[NotifyPropertyChangedFor(nameof(ShowErrorState))]
public partial bool IsLoading { get; set; }
@@ -39,43 +36,31 @@ public partial class WinoAddOnItemViewModel : ObservableObject
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowErrorState))]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial bool HasUsageData { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowErrorState))]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial string ErrorText { get; set; } = string.Empty;
[ObservableProperty]
public partial int UsageCount { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial int UsageLimit { get; set; } = 1;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial double UsagePercentage { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial string RenewalText { get; set; } = string.Empty;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowUsageSummary))]
public partial string UsageResetText { get; set; } = string.Empty;
public bool ShowLoadingState => IsLoading;
public bool ShowPurchaseState => !IsLoading && string.IsNullOrWhiteSpace(ErrorText);
public bool ShowUsageSummary => ProductType == WinoAddOnProductType.AI_PACK &&
IsPurchased &&
!IsLoading &&
string.IsNullOrWhiteSpace(ErrorText) &&
HasUsageData;
public bool ShowErrorState => !IsLoading && !string.IsNullOrWhiteSpace(ErrorText);
public WinoAddOnItemViewModel(WinoAddOnProductType productType)

View File

@@ -26,7 +26,6 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
private readonly INativeAppService _nativeAppService;
private readonly IAccountService _accountService;
private readonly IMimeStorageService _mimeStorageService;
private readonly IStoreRatingService _storeRatingService;
private readonly ITranslationService _translationService;
private readonly INewThemeService _newThemeService;
private readonly IPreferencesService _preferencesService;
@@ -34,8 +33,6 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
private bool _isInitializingSettings;
private bool _isAppearanceSelectionPaused;
public string GitHubUrl => AppUrls.GitHub;
public string PaypalUrl => AppUrls.Paypal;
public string WebsiteUrl => AppUrls.Website;
public string PrivacyPolicyUrl => AppUrls.PrivacyPolicy;
@@ -85,16 +82,14 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
public SettingOptionsPageViewModel(INativeAppService nativeAppService,
IAccountService accountService,
IMimeStorageService mimeStorageService,
IStoreRatingService storeRatingService,
ITranslationService translationService,
INewThemeService newThemeService,
IPreferencesService preferencesService,
IProviderService providerService)
ITranslationService translationService,
INewThemeService newThemeService,
IPreferencesService preferencesService,
IProviderService providerService)
{
_nativeAppService = nativeAppService;
_accountService = accountService;
_mimeStorageService = mimeStorageService;
_storeRatingService = storeRatingService;
_translationService = translationService;
_newThemeService = newThemeService;
_preferencesService = preferencesService;
@@ -218,6 +213,19 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
_isInitializingSettings = false;
}
private void InitializeColors()
{
Colors.Clear();
foreach (var color in AccentColorProvider.GetAvailableColors())
{
Colors.Add(new AppColorViewModel(color));
}
UseAccentColor = _preferencesService.IsCustomAccentColorEnabled;
SelectedAppColor = Colors.FirstOrDefault(color => color.Hex == _preferencesService.CustomAccentColorHex) ?? Colors.FirstOrDefault();
}
private void InitializeLanguageOptions()
{
AvailableLanguages = _translationService.GetAvailableLanguages();
@@ -225,181 +233,77 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
?? AvailableLanguages.FirstOrDefault();
}
private void InitializeColors()
{
Colors.Clear();
foreach (var color in _newThemeService.GetAvailableAccountColors().Distinct(StringComparer.OrdinalIgnoreCase))
{
Colors.Add(new AppColorViewModel(color));
}
var systemAccentColor = _newThemeService.GetSystemAccentColorHex();
if (Colors.All(color => !string.Equals(color.Hex, systemAccentColor, StringComparison.OrdinalIgnoreCase)))
{
Colors.Add(new AppColorViewModel(systemAccentColor, true));
}
else
{
var matchingAccentColor = Colors.First(color => string.Equals(color.Hex, systemAccentColor, StringComparison.OrdinalIgnoreCase));
Colors.Remove(matchingAccentColor);
Colors.Add(new AppColorViewModel(systemAccentColor, true));
}
}
private void InitializeAppearanceOptions()
{
_isAppearanceSelectionPaused = true;
var currentAccentColor = _newThemeService.AccentColor;
if (!string.IsNullOrWhiteSpace(currentAccentColor) &&
Colors.All(color => !string.Equals(color.Hex, currentAccentColor, StringComparison.OrdinalIgnoreCase)))
{
Colors.Insert(0, new AppColorViewModel(currentAccentColor));
}
SelectedElementTheme = ElementThemes.FirstOrDefault(theme => theme.NativeTheme == _newThemeService.RootTheme)
?? ElementThemes.FirstOrDefault();
if (string.IsNullOrWhiteSpace(currentAccentColor))
{
SelectedAppColor = Colors.LastOrDefault(color => color.IsAccentColor) ?? Colors.LastOrDefault();
UseAccentColor = true;
}
else
{
SelectedAppColor = Colors.FirstOrDefault(color => string.Equals(color.Hex, currentAccentColor, StringComparison.OrdinalIgnoreCase))
?? Colors.FirstOrDefault();
UseAccentColor = SelectedAppColor?.IsAccentColor == true;
}
_isAppearanceSelectionPaused = false;
}
private List<IAccountProviderDetailViewModel> CreateAccountItems(List<MailAccount> accounts)
{
var groupedAccounts = accounts
.OrderBy(account => account.MergedInboxId == null ? 1 : 0)
.ThenBy(account => account.Order)
.ThenBy(account => account.Name)
.GroupBy(account => account.MergedInboxId);
var accountItems = new List<IAccountProviderDetailViewModel>();
foreach (var accountGroup in groupedAccounts)
{
if (accountGroup.Key == null)
{
accountItems.AddRange(accountGroup.Select(CreateAccountProviderDetails));
continue;
}
var mergedInbox = accountGroup.First().MergedInbox;
var holdingAccounts = accountGroup
.Select(CreateAccountProviderDetails)
.ToList();
var mergedAccount = new MergedAccountProviderDetailViewModel(mergedInbox, holdingAccounts)
{
ProviderDetail = holdingAccounts.FirstOrDefault()?.ProviderDetail
};
accountItems.Add(mergedAccount);
}
return accountItems;
}
private AccountProviderDetailViewModel CreateAccountProviderDetails(MailAccount account)
{
var provider = _providerService.GetProviderDetail(account.ProviderType);
return new AccountProviderDetailViewModel(provider, account);
SelectedElementTheme = ElementThemes.FirstOrDefault(theme => theme.Theme == _preferencesService.ApplicationTheme)
?? ElementThemes[0];
}
partial void OnSelectedLanguageChanged(AppLanguageModel value)
{
if (_isInitializingSettings || value == null)
{
return;
}
_ = ApplyLanguageAsync(value);
_ = _translationService.InitializeLanguageAsync(value.Language);
}
partial void OnSelectedElementThemeChanged(ElementThemeContainer value)
{
if (_isInitializingSettings || value == null)
{
return;
}
_newThemeService.RootTheme = value.NativeTheme;
_preferencesService.ApplicationTheme = value.Theme;
}
partial void OnSelectedAppColorChanged(AppColorViewModel value)
{
if (_isInitializingSettings || _isAppearanceSelectionPaused || value == null)
{
return;
_preferencesService.CustomAccentColorHex = value.Hex;
if (UseAccentColor)
{
_newThemeService.ApplyCustomAccentColor(value.Color);
}
_isAppearanceSelectionPaused = true;
UseAccentColor = value.IsAccentColor;
_isAppearanceSelectionPaused = false;
_newThemeService.AccentColor = value.Hex;
}
partial void OnUseAccentColorChanged(bool value)
{
if (_isInitializingSettings || _isAppearanceSelectionPaused || Colors.Count == 0)
{
if (_isInitializingSettings)
return;
}
var accentColor = Colors.LastOrDefault(color => color.IsAccentColor);
var fallbackColor = Colors.FirstOrDefault(color => !color.IsAccentColor) ?? Colors.FirstOrDefault();
var targetColor = value ? accentColor : SelectedAppColor?.IsAccentColor == true ? fallbackColor : SelectedAppColor;
if (targetColor == null || ReferenceEquals(targetColor, SelectedAppColor))
{
return;
}
_preferencesService.IsCustomAccentColorEnabled = value;
_isAppearanceSelectionPaused = true;
SelectedAppColor = targetColor;
_isAppearanceSelectionPaused = false;
_newThemeService.AccentColor = targetColor.Hex;
}
private async Task ApplyLanguageAsync(AppLanguageModel language)
{
await _translationService.InitializeLanguageAsync(language.Language);
}
[RelayCommand]
public void NavigateSubDetail(object type)
{
if (type is WinoPage pageType)
try
{
var pageInfo = SettingsNavigationInfoProvider.GetInfo(pageType, AccountSummaryText);
Messenger.Send(new BreadcrumbNavigationRequested(pageInfo.Title, pageType));
if (value && SelectedAppColor != null)
{
_newThemeService.ApplyCustomAccentColor(SelectedAppColor.Color);
}
else
{
_newThemeService.ResetAccentColor();
}
}
finally
{
_isAppearanceSelectionPaused = false;
}
}
[RelayCommand]
private async Task NavigateExternalAsync(object target)
private Task NavigateExternalAsync(string url)
{
if (target is not string stringTarget || string.IsNullOrWhiteSpace(stringTarget))
return;
if (string.IsNullOrWhiteSpace(url))
return Task.CompletedTask;
if (stringTarget == "Store")
{
await _storeRatingService.LaunchStorePageForReviewAsync();
return;
}
await _nativeAppService.LaunchUriAsync(new Uri(stringTarget));
return _nativeAppService.LaunchUriAsync(new Uri(url));
}
}
private static List<IAccountProviderDetailViewModel> CreateAccountItems(List<MailAccount> accounts)
{
return AccountProviderDetailViewModelFactory.CreateAccountItems(accounts);
}
}

View File

@@ -45,14 +45,13 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
INavigationService navigationService,
IAccountService accountService,
IProviderService providerService,
IStoreManagementService storeManagementService,
IWinoAccountProfileService winoAccountProfileService,
IWinoAccountDataSyncService syncService,
IWinoLogger winoLogger,
ISpecialImapProviderConfigResolver specialImapProviderConfigResolver,
ICalDavClient calDavClient,
IAuthenticationProvider authenticationProvider,
IPreferencesService preferencesService) : base(dialogService, navigationService, accountService, providerService, storeManagementService, winoAccountProfileService, authenticationProvider, preferencesService)
IPreferencesService preferencesService) : base(dialogService, navigationService, accountService, providerService, winoAccountProfileService, authenticationProvider, preferencesService)
{
MailDialogService = dialogService;
_syncService = syncService;
@@ -90,23 +89,14 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
[RelayCommand]
private async Task AddNewAccountAsync()
private Task AddNewAccountAsync()
{
if (IsAccountCreationBlocked)
{
var isPurchaseClicked = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_AccountLimitMessage, Translator.DialogMessage_AccountLimitTitle, Translator.Buttons_Purchase);
if (!isPurchaseClicked) return;
await PurchaseUnlimitedAccountAsync();
return;
}
Messenger.Send(new BreadcrumbNavigationRequested(
Translator.WelcomeWizard_Step2Title,
WinoPage.ProviderSelectionPage,
ProviderSelectionNavigationContext.CreateForSettingsAddAccount()));
return Task.CompletedTask;
}
public Task StartAddNewAccountAsync() => AddNewAccountAsync();
@@ -400,7 +390,6 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
});
await ManageStorePurchasesAsync().ConfigureAwait(false);
}
private static string BuildExportSuccessMessage(Wino.Core.Domain.Models.Accounts.WinoAccountSyncExportResult result)

View File

@@ -1,12 +1,10 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Ai;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.Domain.Models.Translations;
@@ -18,14 +16,12 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
IMailDialogService dialogService,
IPreferencesService preferencesService,
IStartupBehaviorService startupBehaviorService,
ITranslationService translationService,
IAiActionOptionsService aiActionOptionsService)
ITranslationService translationService)
{
_dialogService = dialogService;
PreferencesService = preferencesService;
_startupBehaviorService = startupBehaviorService;
_translationService = translationService;
_aiActionOptionsService = aiActionOptionsService;
SearchModes =
[
@@ -44,7 +40,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
SelectedDefaultSearchMode = SearchModes[(int)PreferencesService.DefaultSearchMode];
SelectedDefaultApplicationMode = ApplicationModes[(int)PreferencesService.DefaultApplicationMode];
EmailSyncIntervalMinutes = PreferencesService.EmailSyncIntervalMinutes;
SummarySavePath = PreferencesService.AiSummarySavePath;
}
public IPreferencesService PreferencesService { get; }
@@ -61,21 +56,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
[ObservableProperty]
public partial AppLanguageModel SelectedLanguage { get; set; }
[ObservableProperty]
public partial List<AiTranslateLanguageOption> AvailableAiLanguages { get; set; } = [];
[ObservableProperty]
public partial AiTranslateLanguageOption SelectedDefaultTranslationLanguage { get; set; }
[ObservableProperty]
public partial AiTranslateLanguageOption SelectedSummarizeLanguage { get; set; }
[ObservableProperty]
public partial string SummarySavePath { get; set; } = string.Empty;
[ObservableProperty]
public partial bool HasInvalidSummarySavePath { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IsStartupBehaviorDisabled))]
[NotifyPropertyChangedFor(nameof(IsStartupBehaviorEnabled))]
@@ -84,9 +64,7 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
private readonly IMailDialogService _dialogService;
private readonly IStartupBehaviorService _startupBehaviorService;
private readonly ITranslationService _translationService;
private readonly IAiActionOptionsService _aiActionOptionsService;
private bool _isLanguageInitialized;
private bool _isAiPreferencesInitialized;
private int _emailSyncIntervalMinutes;
private string _selectedDefaultSearchMode;
private string _selectedDefaultApplicationMode;
@@ -132,31 +110,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
_ = _translationService.InitializeLanguageAsync(value.Language);
}
partial void OnSelectedDefaultTranslationLanguageChanged(AiTranslateLanguageOption value)
{
if (!_isAiPreferencesInitialized || value == null)
return;
PreferencesService.AiDefaultTranslationLanguageCode = value.Code;
}
partial void OnSelectedSummarizeLanguageChanged(AiTranslateLanguageOption value)
{
if (!_isAiPreferencesInitialized || value == null)
return;
PreferencesService.AiSummarizeLanguageCode = value.Code;
}
partial void OnSummarySavePathChanged(string value)
{
if (!_isAiPreferencesInitialized)
return;
PreferencesService.AiSummarySavePath = value ?? string.Empty;
RefreshSummarySavePathState();
}
[RelayCommand]
private async Task ToggleStartupBehaviorAsync()
{
@@ -204,22 +157,11 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
}
}
[RelayCommand]
private async Task BrowseSummarySavePathAsync()
{
var pickedPath = await _dialogService.PickWindowsFolderAsync();
if (string.IsNullOrWhiteSpace(pickedPath))
return;
await ExecuteUIThread(() => SummarySavePath = pickedPath);
}
public override async void OnNavigatedTo(NavigationMode mode, object parameters)
{
base.OnNavigatedTo(mode, parameters);
var availableLanguages = _translationService.GetAvailableLanguages();
var availableAiLanguages = new List<AiTranslateLanguageOption>(_aiActionOptionsService.GetTranslateLanguageOptions());
var startupBehaviorResult = await _startupBehaviorService.GetCurrentStartupBehaviorAsync();
await ExecuteUIThread(() =>
@@ -228,32 +170,7 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
SelectedLanguage = AvailableLanguages.Find(language => language.Language == PreferencesService.CurrentLanguage)
?? (AvailableLanguages.Count > 0 ? AvailableLanguages[0] : null);
_isLanguageInitialized = true;
AvailableAiLanguages = availableAiLanguages;
SelectedDefaultTranslationLanguage = FindAiLanguageOption(PreferencesService.AiDefaultTranslationLanguageCode)
?? FindAiLanguageOption("en-US")
?? (AvailableAiLanguages.Count > 0 ? AvailableAiLanguages[0] : null);
SelectedSummarizeLanguage = FindAiLanguageOption(PreferencesService.AiSummarizeLanguageCode)
?? FindAiLanguageOption("en-US")
?? (AvailableAiLanguages.Count > 0 ? AvailableAiLanguages[0] : null);
SummarySavePath = PreferencesService.AiSummarySavePath;
RefreshSummarySavePathState();
_isAiPreferencesInitialized = true;
StartupBehaviorResult = startupBehaviorResult;
});
}
private AiTranslateLanguageOption FindAiLanguageOption(string languageCode)
{
if (string.IsNullOrWhiteSpace(languageCode))
return null;
return AvailableAiLanguages.Find(option => option.Code == languageCode);
}
private void RefreshSummarySavePathState()
{
HasInvalidSummarySavePath = !string.IsNullOrWhiteSpace(SummarySavePath) && !Directory.Exists(SummarySavePath);
}
}
}

View File

@@ -368,7 +368,6 @@ public partial class App : WinoApplication,
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<IMailDialogService, DialogService>();
services.AddSingleton<IAiActionOptionsService, AiActionOptionsService>();
services.AddSingleton<ReleaseLocalAccountDataCleanupService>();
services.AddTransient<IProviderService, ProviderService>();
services.AddSingleton<IAuthenticatorConfig, MailAuthenticatorConfiguration>();
@@ -2037,4 +2036,3 @@ public partial class App : WinoApplication,
}

View File

@@ -1,15 +0,0 @@
using System.Threading;
using System.Threading.Tasks;
namespace Wino.Mail.WinUI.Controls;
public interface IAiHtmlActionHost
{
Task<string?> GetCurrentHtmlAsync(CancellationToken cancellationToken);
Task ApplyHtmlResultAsync(string html, CancellationToken cancellationToken);
Task<string?> TryGetCachedTranslationHtmlAsync(string languageCode, CancellationToken cancellationToken);
Task SaveCachedTranslationHtmlAsync(string languageCode, string html, CancellationToken cancellationToken);
Task<string?> TryGetCachedSummaryTextAsync(CancellationToken cancellationToken);
Task SaveCachedSummaryTextAsync(string summary, CancellationToken cancellationToken);
string GetSuggestedSummaryFileName();
}

View File

@@ -8,7 +8,6 @@ using CommunityToolkit.WinUI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
@@ -22,7 +21,6 @@ public sealed partial class OperationCommandBar : CommandBar
{
private const string MailOperationTemplateKey = "OperationCommandBarMailOperationTemplate";
private const string FolderOperationTemplateKey = "OperationCommandBarFolderOperationTemplate";
private const string AIActionsTemplateKey = "OperationCommandBarAIActionsTemplate";
private const string PopOutTemplateKey = "OperationCommandBarThemeToggleTemplate";
private const string ThemeToggleTemplateKey = "OperationCommandBarThemeToggleTemplate";
private const string SeparatorTemplateKey = "OperationCommandBarSeparatorTemplate";
@@ -36,12 +34,6 @@ public sealed partial class OperationCommandBar : CommandBar
[GeneratedDependencyProperty]
public partial ICommand? ItemInvokedCommand { get; set; }
[GeneratedDependencyProperty]
public partial bool IsAIActionsEnabled { get; set; }
[GeneratedDependencyProperty]
public partial bool IsAIActionsPaneToggleVisible { get; set; }
[GeneratedDependencyProperty]
public partial bool IsEditorThemeDark { get; set; }
@@ -51,7 +43,6 @@ public sealed partial class OperationCommandBar : CommandBar
[GeneratedDependencyProperty]
public partial bool IsPopOutButtonVisible { get; set; }
public event EventHandler<bool>? AIActionsEnabledChanged;
public event EventHandler? PopOutClicked;
public OperationCommandBar()
@@ -84,16 +75,6 @@ public sealed partial class OperationCommandBar : CommandBar
RefreshCommands();
}
partial void OnIsAIActionsEnabledChanged(bool newValue)
{
AIActionsEnabledChanged?.Invoke(this, newValue);
}
partial void OnIsAIActionsPaneToggleVisibleChanged(bool newValue)
{
RefreshCommands();
}
partial void OnIsEditorThemeDarkChanged(bool newValue)
{
RefreshCommands();
@@ -215,11 +196,6 @@ public sealed partial class OperationCommandBar : CommandBar
{
ClearGeneratedCommands();
if (IsAIActionsPaneToggleVisible)
{
PrimaryCommands.Add(CreateAIActionsToggleButton());
}
if (IsPopOutButtonVisible)
{
PrimaryCommands.Add(CreatePopOutButton());
@@ -277,9 +253,6 @@ public sealed partial class OperationCommandBar : CommandBar
button.Click -= ThemeButton_Click;
button.Click -= PopOutButton_Click;
break;
case AppBarToggleButton toggleButton:
toggleButton.ClearValue(AppBarToggleButton.IsCheckedProperty);
break;
}
}
}
@@ -337,22 +310,6 @@ public sealed partial class OperationCommandBar : CommandBar
return null;
}
private AppBarToggleButton CreateAIActionsToggleButton()
{
var button = (AppBarToggleButton)LoadCommandBarElementTemplate(
AIActionsTemplateKey,
new OperationCommandBarAIActionsItemViewModel(Translator.Composer_AiActions, "\uE945"));
button.SetBinding(AppBarToggleButton.IsCheckedProperty, new Binding
{
Mode = BindingMode.TwoWay,
Path = new PropertyPath(nameof(IsAIActionsEnabled)),
Source = this
});
return button;
}
private AppBarButton CreateThemeToggleButton()
{
var label = IsEditorThemeDark ? Translator.Composer_LightTheme : Translator.Composer_DarkTheme;
@@ -487,18 +444,6 @@ public sealed class OperationCommandBarMenuOperationItemViewModel
public CommandBarLabelPosition LabelPosition { get; }
}
public sealed class OperationCommandBarAIActionsItemViewModel
{
public OperationCommandBarAIActionsItemViewModel(string toolTip, string glyph)
{
ToolTip = toolTip;
Glyph = glyph;
}
public string ToolTip { get; }
public string Glyph { get; }
}
public sealed class OperationCommandBarThemeItemViewModel
{
public OperationCommandBarThemeItemViewModel(string toolTip, WinoIconGlyph icon)

View File

@@ -9,7 +9,6 @@ namespace Wino.Selectors;
public partial class WinoAddOnTemplateSelector : DataTemplateSelector
{
public DataTemplate? NotPurchasedTemplate { get; set; }
public DataTemplate? AiPackPurchasedTemplate { get; set; }
public DataTemplate? UnlimitedAccountsPurchasedTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
@@ -22,7 +21,6 @@ public partial class WinoAddOnTemplateSelector : DataTemplateSelector
return addOn.ProductType switch
{
WinoAddOnProductType.AI_PACK => AiPackPurchasedTemplate ?? throw new ArgumentException(nameof(AiPackPurchasedTemplate)),
WinoAddOnProductType.UNLIMITED_ACCOUNTS => UnlimitedAccountsPurchasedTemplate ?? throw new ArgumentException(nameof(UnlimitedAccountsPurchasedTemplate)),
_ => NotPurchasedTemplate ?? throw new ArgumentException(nameof(NotPurchasedTemplate))
};

View File

@@ -1,46 +0,0 @@
using System.Collections.Generic;
using Wino.Core.Domain;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Ai;
namespace Wino.Mail.WinUI.Services;
public sealed class AiActionOptionsService : IAiActionOptionsService
{
public IReadOnlyList<AiTranslateLanguageOption> GetTranslateLanguageOptions()
{
return
[
new("en-US", Translator.Composer_AiTranslateLanguageEnglish),
new("tr-TR", Translator.Composer_AiTranslateLanguageTurkish),
new("de-DE", Translator.Composer_AiTranslateLanguageGerman),
new("fr-FR", Translator.Composer_AiTranslateLanguageFrench),
new("es-ES", Translator.Composer_AiTranslateLanguageSpanish),
new("it-IT", Translator.Composer_AiTranslateLanguageItalian),
new("pt-BR", Translator.Composer_AiTranslateLanguagePortugueseBrazil),
new("nl-NL", Translator.Composer_AiTranslateLanguageDutch),
new("pl-PL", Translator.Composer_AiTranslateLanguagePolish),
new("ru-RU", Translator.Composer_AiTranslateLanguageRussian),
new("ja-JP", Translator.Composer_AiTranslateLanguageJapanese),
new("ko-KR", Translator.Composer_AiTranslateLanguageKorean),
new("zh-CN", Translator.Composer_AiTranslateLanguageChineseSimplified),
new("ar-SA", Translator.Composer_AiTranslateLanguageArabic),
new("hi-IN", Translator.Composer_AiTranslateLanguageHindi),
];
}
public IReadOnlyList<AiRewriteModeOption> GetRewriteModeOptions()
{
return
[
new("polite", Translator.Composer_AiRewritePolite, Translator.Composer_AiRewritePoliteDescription),
new("angry", Translator.Composer_AiRewriteAngry, Translator.Composer_AiRewriteAngryDescription),
new("happy", Translator.Composer_AiRewriteHappy, Translator.Composer_AiRewriteHappyDescription),
new("formal", Translator.Composer_AiRewriteFormal, Translator.Composer_AiRewriteFormalDescription),
new("friendly", Translator.Composer_AiRewriteFriendly, Translator.Composer_AiRewriteFriendlyDescription),
new("shorter", Translator.Composer_AiRewriteShorter, Translator.Composer_AiRewriteShorterDescription),
new("clearer", Translator.Composer_AiRewriteClearer, Translator.Composer_AiRewriteClearerDescription),
new(string.Empty, Translator.Composer_AiRewriteCustom, Translator.Composer_AiRewriteCustomDescription, true),
];
}
}

View File

@@ -16,12 +16,10 @@ public class StoreManagementService : IStoreManagementService
private readonly Dictionary<WinoAddOnProductType, string> productIds = new Dictionary<WinoAddOnProductType, string>()
{
{ WinoAddOnProductType.UNLIMITED_ACCOUNTS, "UnlimitedAccounts" },
{ WinoAddOnProductType.AI_PACK, "AI_PACK" },
};
private readonly Dictionary<WinoAddOnProductType, string> skuIds = new Dictionary<WinoAddOnProductType, string>()
{
{ WinoAddOnProductType.AI_PACK, "9N2FH734RBVS" },
{ WinoAddOnProductType.UNLIMITED_ACCOUNTS, "9P02MXZ42GSM" }
};

View File

@@ -1,57 +0,0 @@
using Wino.Core.Domain;
using Wino.Mail.Api.Contracts.Common;
namespace Wino.Mail.WinUI.Services;
public static class WinoAccountAiErrorTranslator
{
public static string Translate(string? errorCode)
{
if (string.IsNullOrWhiteSpace(errorCode))
{
return Translator.GeneralTitle_Error;
}
return errorCode switch
{
ApiErrorCodes.AiPackRequired => Translator.WinoAccount_Error_AiPackRequired,
ApiErrorCodes.AiQuotaExceeded => Translator.WinoAccount_Error_AiQuotaExceeded,
ApiErrorCodes.AiHtmlEmpty => Translator.WinoAccount_Error_AiHtmlEmpty,
ApiErrorCodes.AiHtmlTooLarge => Translator.WinoAccount_Error_AiHtmlTooLarge,
ApiErrorCodes.AiUnsupportedLanguage => Translator.WinoAccount_Error_AiUnsupportedLanguage,
ApiErrorCodes.Forbidden => Translator.WinoAccount_Error_Forbidden,
ApiErrorCodes.ValidationFailed => Translator.WinoAccount_Error_ValidationFailed,
_ => errorCode
};
}
public static string Format(string? errorCode, string? errorMessage)
{
var translatedCode = Translate(errorCode);
var hasCode = !string.IsNullOrWhiteSpace(errorCode);
var hasMessage = !string.IsNullOrWhiteSpace(errorMessage);
if (!hasCode && !hasMessage)
{
return Translator.GeneralTitle_Error;
}
var formattedCode = translatedCode;
if (hasCode && !string.Equals(translatedCode, errorCode, System.StringComparison.Ordinal))
{
formattedCode = $"{translatedCode} ({errorCode})";
}
if (!hasMessage || string.Equals(errorMessage, translatedCode, System.StringComparison.OrdinalIgnoreCase) || string.Equals(errorMessage, errorCode, System.StringComparison.OrdinalIgnoreCase))
{
return formattedCode;
}
if (string.IsNullOrWhiteSpace(formattedCode))
{
return errorMessage!;
}
return $"{formattedCode}{System.Environment.NewLine}{errorMessage}";
}
}

View File

@@ -37,17 +37,6 @@
</AppBarButton>
</DataTemplate>
<DataTemplate x:Key="OperationCommandBarAIActionsTemplate" x:DataType="controls:OperationCommandBarAIActionsItemViewModel">
<AppBarToggleButton
MinWidth="40"
LabelPosition="Collapsed"
ToolTipService.ToolTip="{x:Bind ToolTip}">
<AppBarToggleButton.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="{x:Bind Glyph}" />
</AppBarToggleButton.Icon>
</AppBarToggleButton>
</DataTemplate>
<DataTemplate x:Key="OperationCommandBarThemeToggleTemplate" x:DataType="controls:OperationCommandBarThemeItemViewModel">
<AppBarButton
MinWidth="40"

File diff suppressed because one or more lines are too long

View File

@@ -32,7 +32,6 @@ using Wino.Views.Abstract;
namespace Wino.Views.Mail;
public sealed partial class ComposePage : ComposePageAbstract,
IAiHtmlActionHost,
IPopoutClient,
IRecipient<ApplicationThemeChanged>
{
@@ -502,47 +501,6 @@ public sealed partial class ComposePage : ComposePageAbstract,
DisposeDisposables();
}
public async Task<string?> GetCurrentHtmlAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
var html = await WebViewEditor.GetHtmlBodyAsync();
cancellationToken.ThrowIfCancellationRequested();
return html;
}
public async Task ApplyHtmlResultAsync(string html, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
await WebViewEditor.RenderHtmlAsync(html);
cancellationToken.ThrowIfCancellationRequested();
}
public Task<string?> TryGetCachedTranslationHtmlAsync(string languageCode, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Task.FromResult<string?>(null);
}
public Task SaveCachedTranslationHtmlAsync(string languageCode, string html, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Task.CompletedTask;
}
public Task<string?> TryGetCachedSummaryTextAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Task.FromResult<string?>(null);
}
public Task SaveCachedSummaryTextAsync(string summary, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Task.CompletedTask;
}
public string GetSuggestedSummaryFileName() => "email-summary.txt";
private void OpenAttachment_Click(object sender, RoutedEventArgs e)
{
if (sender is MenuFlyoutItem item && item.CommandParameter is MailAttachmentViewModel attachment)

View File

@@ -13,7 +13,6 @@ using Microsoft.UI.Xaml.Navigation;
using Microsoft.Web.WebView2.Core;
using Windows.System;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Printing;
using Wino.Mail.ViewModels.Data;
@@ -30,14 +29,11 @@ using Wino.Views.Abstract;
namespace Wino.Views.Mail;
public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
IAiHtmlActionHost,
IPopoutClient,
IRecipient<ApplicationThemeChanged>
{
private readonly IPreferencesService _preferencesService = App.Current.Services.GetService<IPreferencesService>()!;
private readonly IMailDialogService _dialogService = App.Current.Services.GetService<IMailDialogService>()!;
private readonly IMimeFileService _mimeFileService = App.Current.Services.GetRequiredService<IMimeFileService>();
private bool isRenderingInProgress = false;
private bool? _lastAppliedDarkTheme;
private TaskCompletionSource<bool> DOMLoadedTask = new TaskCompletionSource<bool>();
@@ -173,107 +169,16 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
ViewModel.RenderHtmlAsyncFunc = null;
ViewModel.ClearRenderedHtmlAsyncFunc = null;
_currentRenderedHtml = string.Empty;
RendererCommandBar.AIActionsEnabledChanged -= RendererCommandBar_AIActionsEnabledChanged;
RendererCommandBar.PopOutClicked -= RendererCommandBar_PopOutClicked;
RendererCommandBar.IsAIActionsEnabled = false;
DisposeWebView2();
}
public Task<string?> GetCurrentHtmlAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Task.FromResult<string?>(_currentRenderedHtml);
}
public async Task ApplyHtmlResultAsync(string html, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
await RenderInternalAsync(html);
cancellationToken.ThrowIfCancellationRequested();
}
public Task RefreshMailItemAsync(MailItemViewModel mailItemViewModel)
{
return ViewModel.RefreshMailItemAsync(mailItemViewModel);
}
private async void RendererCommandBar_AIActionsEnabledChanged(object? sender, bool isEnabled)
{
if (isEnabled)
{
}
}
public async Task<string?> TryGetCachedTranslationHtmlAsync(string languageCode, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue || string.IsNullOrWhiteSpace(languageCode))
{
return null;
}
return await _mimeFileService.GetTranslatedHtmlAsync(
ViewModel.CurrentMailAccountId.Value,
ViewModel.CurrentMailFileId.Value,
languageCode,
cancellationToken).ConfigureAwait(false);
}
public async Task SaveCachedTranslationHtmlAsync(string languageCode, string html, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue || string.IsNullOrWhiteSpace(languageCode))
{
return;
}
await _mimeFileService.SaveTranslatedHtmlAsync(
ViewModel.CurrentMailAccountId.Value,
ViewModel.CurrentMailFileId.Value,
languageCode,
html,
cancellationToken).ConfigureAwait(false);
}
public async Task<string?> TryGetCachedSummaryTextAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue)
{
return null;
}
return await _mimeFileService.GetSummaryTextAsync(
ViewModel.CurrentMailAccountId.Value,
ViewModel.CurrentMailFileId.Value,
cancellationToken).ConfigureAwait(false);
}
public async Task SaveCachedSummaryTextAsync(string summary, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue)
{
return;
}
await _mimeFileService.SaveSummaryTextAsync(
ViewModel.CurrentMailAccountId.Value,
ViewModel.CurrentMailFileId.Value,
summary,
cancellationToken).ConfigureAwait(false);
}
public string GetSuggestedSummaryFileName()
{
var subject = string.IsNullOrWhiteSpace(ViewModel.Subject) ? "email-summary" : ViewModel.Subject;
return $"{SanitizeFileNamePart(subject)}.txt";
}
private void DisposeWebView2()
{
@@ -297,11 +202,8 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
DOMLoadedTask = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
ViewModel.RenderHtmlAsyncFunc = RenderInternalAsync;
ViewModel.ClearRenderedHtmlAsyncFunc = ClearRenderedContentAsync;
RendererCommandBar.AIActionsEnabledChanged -= RendererCommandBar_AIActionsEnabledChanged;
RendererCommandBar.AIActionsEnabledChanged += RendererCommandBar_AIActionsEnabledChanged;
RendererCommandBar.PopOutClicked -= RendererCommandBar_PopOutClicked;
RendererCommandBar.PopOutClicked += RendererCommandBar_PopOutClicked;
RendererCommandBar.IsAIActionsEnabled = false;
Chromium.CoreWebView2Initialized -= CoreWebViewInitialized;
Chromium.CoreWebView2Initialized += CoreWebViewInitialized;
_ = EnsureChromiumInitializedAsync();

View File

@@ -120,50 +120,6 @@
</StackPanel>
</StackPanel>
<StackPanel
Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="12">
<Button
Command="{x:Bind ViewModel.NavigateExternalCommand}"
CommandParameter="{x:Bind ViewModel.PaypalUrl, Mode=OneWay}"
Style="{StaticResource DefaultButtonStyle}"
ToolTipService.ToolTip="{x:Bind domain:Translator.SettingsPaypal_Title}">
<Viewbox Width="18" Height="18">
<Path
Data="M385.52,51.09C363.84,26.52,324.71,16,274.63,16H129.25a20.75,20.75,0,0,0-20.54,17.48l-60.55,382a12.43,12.43,0,0,0,10.39,14.22,12.58,12.58,0,0,0,1.94.15h89.76l22.54-142.29-.7,4.46a20.67,20.67,0,0,1,20.47-17.46h42.65c83.77,0,149.36-33.86,168.54-131.8.57-2.9,1.05-5.72,1.49-8.48h0C410.94,98.06,405.19,73.41,385.52,51.09Z"
Fill="{ThemeResource TextFillColorPrimaryBrush}"
Stretch="Uniform" />
</Viewbox>
</Button>
<Button
Command="{x:Bind ViewModel.NavigateExternalCommand}"
CommandParameter="{x:Bind ViewModel.GitHubUrl, Mode=OneWay}"
Style="{StaticResource DefaultButtonStyle}"
ToolTipService.ToolTip="{x:Bind domain:Translator.SettingsAboutGithub_Title}">
<Viewbox Width="18" Height="18">
<Path
Data="m 12.2135 0 c -6.7538 0 -12.2135 5.5 -12.2135 12.3042 c 0 5.439 3.4983 10.043 8.3513 11.6725 c 0.6067 0.1225 0.829 -0.2647 0.829 -0.5905 c 0 -0.2853 -0.02 -1.263 -0.02 -2.2817 c -3.3975 0.7335 -4.105 -1.4668 -4.105 -1.4668 c -0.546 -1.426 -1.355 -1.7925 -1.355 -1.7925 c -1.112 -0.7538 0.081 -0.7538 0.081 -0.7538 c 1.2335 0.0815 1.8807 1.263 1.8807 1.263 c 1.0918 1.874 2.851 1.3445 3.5587 1.0185 c 0.101 -0.7945 0.4247 -1.3445 0.7685 -1.65 c -2.7097 -0.2853 -5.5607 -1.3445 -5.5607 -6.0708 c 0 -1.3445 0.485 -2.4445 1.2535 -3.3 c -0.1212 -0.3055 -0.546 -1.5687 0.1215 -3.2595 c 0 0 1.0313 -0.326 3.3565 1.263 a 11.7425 11.7425 90 0 1 3.0535 -0.4075 c 1.0313 0 2.0825 0.1428 3.0533 0.4075 c 2.3255 -1.589 3.3567 -1.263 3.3567 -1.263 c 0.6675 1.6908 0.2425 2.954 0.1212 3.2595 c 0.7888 0.8555 1.2538 1.9555 1.2538 3.3 c 0 4.7263 -2.851 5.765 -5.581 6.0708 c 0.445 0.387 0.829 1.1202 0.829 2.2815 c 0 1.65 -0.02 2.9743 -0.02 3.3815 c 0 0.326 0.2225 0.7132 0.829 0.591 c 4.853 -1.63 8.3513 -6.2338 8.3513 -11.6728 c 0.02 -6.8043 -5.4598 -12.3043 -12.1933 -12.3043 z"
Fill="{ThemeResource TextFillColorPrimaryBrush}"
Stretch="Uniform" />
</Viewbox>
</Button>
<Button
Command="{x:Bind ViewModel.NavigateExternalCommand}"
CommandParameter="Store"
ToolTipService.ToolTip="{x:Bind domain:Translator.SettingsStore_Title}">
<Viewbox Width="18" Height="18">
<Path
Data="F1 M 19.003906 3.251953 L 19.003906 15.947266 C 19.003906 16.357422 18.920898 16.748047 18.754883 17.119141 C 18.588867 17.490234 18.367512 17.814127 18.09082 18.09082 C 17.814127 18.367514 17.490234 18.588867 17.119141 18.754883 C 16.748047 18.920898 16.357422 19.003906 15.947266 19.003906 L 3.056641 19.003906 C 2.646484 19.003906 2.255859 18.920898 1.884766 18.754883 C 1.513672 18.588867 1.189779 18.367514 0.913086 18.09082 C 0.636393 17.814127 0.415039 17.490234 0.249023 17.119141 C 0.083008 16.748047 0 16.357422 0 15.947266 L 0 3.251953 C 0 3.076172 0.032552 2.913412 0.097656 2.763672 C 0.16276 2.613934 0.252279 2.482098 0.366211 2.368164 C 0.480143 2.254232 0.611979 2.164715 0.761719 2.099609 C 0.911458 2.034506 1.074219 2.001953 1.25 2.001953 L 4.003906 2.001953 L 4.003906 0.996094 C 4.003906 0.859375 4.029948 0.730795 4.082031 0.610352 C 4.134114 0.48991 4.205729 0.384115 4.296875 0.292969 C 4.388021 0.201824 4.493815 0.130209 4.614258 0.078125 C 4.7347 0.026043 4.863281 0 5 0 L 14.003906 0 C 14.140624 0 14.269205 0.026043 14.389648 0.078125 C 14.510091 0.130209 14.615885 0.201824 14.707031 0.292969 C 14.798177 0.384115 14.869791 0.48991 14.921875 0.610352 C 14.973957 0.730795 14.999999 0.859375 15 0.996094 L 15 2.001953 L 17.753906 2.001953 C 17.923176 2.001953 18.084309 2.034506 18.237305 2.099609 C 18.390299 2.164715 18.523762 2.254232 18.637695 2.368164 C 18.751627 2.482098 18.841145 2.615561 18.90625 2.768555 C 18.971354 2.921551 19.003906 3.082684 19.003906 3.251953 Z M 14.003906 0.996094 L 5 0.996094 L 5 2.001953 L 14.003906 2.001953 Z M 5 10 L 9.003906 10 L 9.003906 5.996094 L 5 5.996094 Z M 10 10 L 14.003906 10 L 14.003906 5.996094 L 10 5.996094 Z M 5 15 L 9.003906 15 L 9.003906 10.996094 L 5 10.996094 Z M 10 15 L 14.003906 15 L 14.003906 10.996094 L 10 10.996094 Z "
Fill="{ThemeResource TextFillColorPrimaryBrush}"
Stretch="Uniform" />
</Viewbox>
</Button>
</StackPanel>
</Grid>
</Border>

View File

@@ -55,26 +55,6 @@
</controls:SettingsCard.ActionIcon>
</controls:SettingsCard>
<controls:SettingsCard
Command="{x:Bind ViewModel.NavigateCommand}"
CommandParameter="{x:Bind ViewModel.GitHubUrl}"
Description="{x:Bind domain:Translator.SettingsAboutGithub_Description}"
Header="{x:Bind domain:Translator.SettingsAboutGithub_Title}"
IsClickEnabled="True">
<controls:SettingsCard.HeaderIcon>
<PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="m 12.2135 0 c -6.7538 0 -12.2135 5.5 -12.2135 12.3042 c 0 5.439 3.4983 10.043 8.3513 11.6725 c 0.6067 0.1225 0.829 -0.2647 0.829 -0.5905 c 0 -0.2853 -0.02 -1.263 -0.02 -2.2817 c -3.3975 0.7335 -4.105 -1.4668 -4.105 -1.4668 c -0.546 -1.426 -1.355 -1.7925 -1.355 -1.7925 c -1.112 -0.7538 0.081 -0.7538 0.081 -0.7538 c 1.2335 0.0815 1.8807 1.263 1.8807 1.263 c 1.0918 1.874 2.851 1.3445 3.5587 1.0185 c 0.101 -0.7945 0.4247 -1.3445 0.7685 -1.65 c -2.7097 -0.2853 -5.5607 -1.3445 -5.5607 -6.0708 c 0 -1.3445 0.485 -2.4445 1.2535 -3.3 c -0.1212 -0.3055 -0.546 -1.5687 0.1215 -3.2595 c 0 0 1.0313 -0.326 3.3565 1.263 a 11.7425 11.7425 90 0 1 3.0535 -0.4075 c 1.0313 0 2.0825 0.1428 3.0533 0.4075 c 2.3255 -1.589 3.3567 -1.263 3.3567 -1.263 c 0.6675 1.6908 0.2425 2.954 0.1212 3.2595 c 0.7888 0.8555 1.2538 1.9555 1.2538 3.3 c 0 4.7263 -2.851 5.765 -5.581 6.0708 c 0.445 0.387 0.829 1.1202 0.829 2.2815 c 0 1.65 -0.02 2.9743 -0.02 3.3815 c 0 0.326 0.2225 0.7132 0.829 0.591 c 4.853 -1.63 8.3513 -6.2338 8.3513 -11.6728 c 0.02 -6.8043 -5.4598 -12.3043 -12.1933 -12.3043 z" />
</controls:SettingsCard.HeaderIcon>
<controls:SettingsCard.ActionIcon>
<PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="{StaticResource OpenInNewWindowPathIcon}" />
</controls:SettingsCard.ActionIcon>
</controls:SettingsCard>
<controls:SettingsCard
Command="{x:Bind ViewModel.NavigateCommand}"
CommandParameter="{x:Bind ViewModel.DiscordChannelUrl}"
@@ -95,43 +75,6 @@
</controls:SettingsCard.ActionIcon>
</controls:SettingsCard>
<controls:SettingsCard
Command="{x:Bind ViewModel.NavigateCommand}"
CommandParameter="Store"
Description="{x:Bind domain:Translator.SettingsStore_Description}"
Header="{x:Bind domain:Translator.SettingsStore_Title}"
IsClickEnabled="True">
<controls:SettingsCard.HeaderIcon>
<PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="F1 M 19.003906 3.251953 L 19.003906 15.947266 C 19.003906 16.357422 18.920898 16.748047 18.754883 17.119141 C 18.588867 17.490234 18.367512 17.814127 18.09082 18.09082 C 17.814127 18.367514 17.490234 18.588867 17.119141 18.754883 C 16.748047 18.920898 16.357422 19.003906 15.947266 19.003906 L 3.056641 19.003906 C 2.646484 19.003906 2.255859 18.920898 1.884766 18.754883 C 1.513672 18.588867 1.189779 18.367514 0.913086 18.09082 C 0.636393 17.814127 0.415039 17.490234 0.249023 17.119141 C 0.083008 16.748047 0 16.357422 0 15.947266 L 0 3.251953 C 0 3.076172 0.032552 2.913412 0.097656 2.763672 C 0.16276 2.613934 0.252279 2.482098 0.366211 2.368164 C 0.480143 2.254232 0.611979 2.164715 0.761719 2.099609 C 0.911458 2.034506 1.074219 2.001953 1.25 2.001953 L 4.003906 2.001953 L 4.003906 0.996094 C 4.003906 0.859375 4.029948 0.730795 4.082031 0.610352 C 4.134114 0.48991 4.205729 0.384115 4.296875 0.292969 C 4.388021 0.201824 4.493815 0.130209 4.614258 0.078125 C 4.7347 0.026043 4.863281 0 5 0 L 14.003906 0 C 14.140624 0 14.269205 0.026043 14.389648 0.078125 C 14.510091 0.130209 14.615885 0.201824 14.707031 0.292969 C 14.798177 0.384115 14.869791 0.48991 14.921875 0.610352 C 14.973957 0.730795 14.999999 0.859375 15 0.996094 L 15 2.001953 L 17.753906 2.001953 C 17.923176 2.001953 18.084309 2.034506 18.237305 2.099609 C 18.390299 2.164715 18.523762 2.254232 18.637695 2.368164 C 18.751627 2.482098 18.841145 2.615561 18.90625 2.768555 C 18.971354 2.921551 19.003906 3.082684 19.003906 3.251953 Z M 14.003906 0.996094 L 5 0.996094 L 5 2.001953 L 14.003906 2.001953 Z M 5 10 L 9.003906 10 L 9.003906 5.996094 L 5 5.996094 Z M 10 10 L 14.003906 10 L 14.003906 5.996094 L 10 5.996094 Z M 5 15 L 9.003906 15 L 9.003906 10.996094 L 5 10.996094 Z M 10 15 L 14.003906 15 L 14.003906 10.996094 L 10 10.996094 Z " />
</controls:SettingsCard.HeaderIcon>
<controls:SettingsCard.ActionIcon>
<PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="{StaticResource OpenInNewWindowPathIcon}" />
</controls:SettingsCard.ActionIcon>
</controls:SettingsCard>
<controls:SettingsCard
Command="{x:Bind ViewModel.NavigateCommand}"
CommandParameter="{x:Bind ViewModel.PaypalUrl}"
Description="{x:Bind domain:Translator.SettingsPaypal_Description}"
Header="{x:Bind domain:Translator.SettingsPaypal_Title}"
IsClickEnabled="True">
<controls:SettingsCard.HeaderIcon>
<PathIcon Data="M385.52,51.09C363.84,26.52,324.71,16,274.63,16H129.25a20.75,20.75,0,0,0-20.54,17.48l-60.55,382a12.43,12.43,0,0,0,10.39,14.22,12.58,12.58,0,0,0,1.94.15h89.76l22.54-142.29-.7,4.46a20.67,20.67,0,0,1,20.47-17.46h42.65c83.77,0,149.36-33.86,168.54-131.8.57-2.9,1.05-5.72,1.49-8.48h0C410.94,98.06,405.19,73.41,385.52,51.09Z" />
</controls:SettingsCard.HeaderIcon>
<controls:SettingsCard.ActionIcon>
<PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="{StaticResource OpenInNewWindowPathIcon}" />
</controls:SettingsCard.ActionIcon>
</controls:SettingsCard>
<controls:SettingsCard
Command="{x:Bind ViewModel.NavigateCommand}"
CommandParameter="{x:Bind ViewModel.PrivacyPolicyUrl}"

View File

@@ -7,7 +7,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:domain="using:Wino.Core.Domain"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:Wino.Core.Domain.Models.Ai"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
xmlns:translations="using:Wino.Core.Domain.Models.Translations"
mc:Ignorable="d">
@@ -78,67 +77,6 @@
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsExpander
Description="{x:Bind domain:Translator.SettingsAppPreferences_AiActions_Description}"
Header="{x:Bind domain:Translator.SettingsAppPreferences_AiActions_Title}"
IsExpanded="True">
<controls:SettingsExpander.HeaderIcon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xE734;" />
</controls:SettingsExpander.HeaderIcon>
<controls:SettingsExpander.Items>
<controls:SettingsCard Description="{x:Bind domain:Translator.SettingsAppPreferences_AiDefaultTranslationLanguage_Description}" Header="{x:Bind domain:Translator.SettingsAppPreferences_AiDefaultTranslationLanguage_Title}">
<ComboBox ItemsSource="{x:Bind ViewModel.AvailableAiLanguages, Mode=OneWay}" SelectedItem="{x:Bind ViewModel.SelectedDefaultTranslationLanguage, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="models:AiTranslateLanguageOption">
<TextBlock Text="{x:Bind Label}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard Description="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarizeLanguage_Description}" Header="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarizeLanguage_Title}">
<ComboBox ItemsSource="{x:Bind ViewModel.AvailableAiLanguages, Mode=OneWay}" SelectedItem="{x:Bind ViewModel.SelectedSummarizeLanguage, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="models:AiTranslateLanguageOption">
<TextBlock Text="{x:Bind Label}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
ContentAlignment="Vertical"
Description="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarySavePath_Description}"
Header="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarySavePath_Title}">
<StackPanel Spacing="8">
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox
Grid.Column="0"
IsReadOnly="True"
PlaceholderText="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarySavePath_Placeholder}"
Text="{x:Bind ViewModel.SummarySavePath, Mode=OneWay}" />
<Button
Grid.Column="1"
Command="{x:Bind ViewModel.BrowseSummarySavePathCommand}"
Content="{x:Bind domain:Translator.Buttons_Browse}" />
</Grid>
<TextBlock
Foreground="{ThemeResource SystemFillColorCautionBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsAppPreferences_AiSummarySavePath_InvalidHint}"
TextWrapping="WrapWholeWords"
Visibility="{x:Bind ViewModel.HasInvalidSummarySavePath, Mode=OneWay}" />
</StackPanel>
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
</StackPanel>
<VisualStateManager.VisualStateGroups>

View File

@@ -7,7 +7,6 @@ using System.Threading.Tasks;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Mail.Api.Contracts.Users;
@@ -33,10 +32,6 @@ public sealed class LocalOnlyWinoAccountApiClient : IWinoAccountApiClient
public Task<ApiEnvelope<JsonElement>> ForgotPasswordAsync(string email, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<JsonElement>());
public Task<ApiEnvelope<JsonElement>> LogoutAsync(string refreshToken, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<JsonElement>());
public Task<ApiEnvelope<AuthUserDto>> GetCurrentUserAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AuthUserDto>());
public Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiStatusResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<WinoStoreCollectionsIdTicketInfo>> CreateCollectionsIdTicketAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<WinoStoreCollectionsIdTicketInfo>());
public Task<ApiEnvelope<WinoStoreCollectionsIdTicketInfo>> CreatePurchaseIdTicketAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<WinoStoreCollectionsIdTicketInfo>());
public Task<ApiEnvelope<JsonElement>> SyncStoreEntitlementsAsync(string? storeIdKey, string? purchaseIdKey, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<JsonElement>());
@@ -61,10 +56,6 @@ public sealed class LocalOnlyWinoAccountProfileService : IWinoAccountProfileServ
public Task<WinoAccount?> GetAuthenticatedAccountAsync(CancellationToken cancellationToken = default) => Task.FromResult<WinoAccount?>(null);
public Task<bool> HasActiveAccountAsync() => Task.FromResult(false);
public Task<ApiEnvelope<AuthUserDto>> GetCurrentUserAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AuthUserDto>());
public Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiStatusResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default) => Task.FromResult(Disabled<AiTextResultDto>());
public Task<ApiEnvelope<JsonElement>> SyncStoreEntitlementsAsync(CancellationToken cancellationToken = default) => Task.FromResult(Disabled<JsonElement>());
public Task<string?> GetSettingsAsync(CancellationToken cancellationToken = default) => Task.FromResult<string?>(null);
public Task SaveSettingsAsync(string settingsJson, CancellationToken cancellationToken = default) => Task.CompletedTask;

View File

@@ -14,7 +14,6 @@ using System.Threading.Tasks;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Mail.Api.Contracts.Users;
@@ -107,36 +106,6 @@ public sealed class WinoAccountApiClient : IWinoAccountApiClient, IDisposable
public Task<ApiEnvelope<AuthUserDto>> GetCurrentUserAsync(CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync("api/v1/auth/me", WinoAccountApiJsonContext.Default.ApiEnvelopeAuthUserDto, cancellationToken);
public Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync("api/v1/ai/status", WinoAccountApiJsonContext.Default.ApiEnvelopeAiStatusResultDto, cancellationToken);
public Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync(
HttpMethod.Post,
"api/v1/ai/summarize",
new SummarizeRequest(html, targetLanguage),
WinoAccountApiJsonContext.Default.SummarizeRequest,
WinoAccountApiJsonContext.Default.ApiEnvelopeAiTextResultDto,
cancellationToken);
public Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync(
HttpMethod.Post,
"api/v1/ai/translate",
new TranslateRequest(html, targetLanguage),
WinoAccountApiJsonContext.Default.TranslateRequest,
WinoAccountApiJsonContext.Default.ApiEnvelopeAiTextResultDto,
cancellationToken);
public Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync(
HttpMethod.Post,
"api/v1/ai/rewrite",
new RewriteRequest(html, mode),
WinoAccountApiJsonContext.Default.RewriteRequest,
WinoAccountApiJsonContext.Default.ApiEnvelopeAiTextResultDto,
cancellationToken);
public Task<ApiEnvelope<WinoStoreCollectionsIdTicketInfo>> CreateCollectionsIdTicketAsync(CancellationToken cancellationToken = default)
=> SendAuthorizedRequestAsync(
HttpMethod.Post,
@@ -588,15 +557,10 @@ public sealed class WinoAccountApiClient : IWinoAccountApiClient, IDisposable
[JsonSerializable(typeof(LogoutRequest))]
[JsonSerializable(typeof(ResendEmailConfirmationRequest))]
[JsonSerializable(typeof(ForgotPasswordRequest))]
[JsonSerializable(typeof(SummarizeRequest))]
[JsonSerializable(typeof(TranslateRequest))]
[JsonSerializable(typeof(RewriteRequest))]
[JsonSerializable(typeof(SyncStoreEntitlementsRequest))]
[JsonSerializable(typeof(ApiEnvelope<AuthResultDto>))]
[JsonSerializable(typeof(ApiEnvelope<EmailConfirmationResendResultDto>))]
[JsonSerializable(typeof(ApiEnvelope<AuthUserDto>))]
[JsonSerializable(typeof(ApiEnvelope<AiStatusResultDto>))]
[JsonSerializable(typeof(ApiEnvelope<AiTextResultDto>))]
[JsonSerializable(typeof(ApiEnvelope<WinoStoreCollectionsIdTicketInfo>))]
[JsonSerializable(typeof(ApiEnvelope<UserMailboxSyncListDto>))]
[JsonSerializable(typeof(ApiEnvelope<JsonElement>))]

View File

@@ -8,7 +8,6 @@ using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts;
using Wino.Mail.Api.Contracts.Ai;
using Wino.Mail.Api.Contracts.Auth;
using Wino.Mail.Api.Contracts.Common;
using Wino.Mail.Api.Contracts.Users;
@@ -196,33 +195,6 @@ public sealed class WinoAccountProfileService : BaseDatabaseService, IWinoAccoun
return response;
}
public async Task<ApiEnvelope<AiStatusResultDto>> GetAiStatusAsync(CancellationToken cancellationToken = default)
{
var account = await GetAuthenticatedAccountAsync(cancellationToken).ConfigureAwait(false);
if (account == null)
{
return ApiEnvelope<AiStatusResultDto>.Failure("MissingAccessToken");
}
var response = await _apiClient.GetAiStatusAsync(cancellationToken).ConfigureAwait(false);
if (!response.IsSuccess)
{
_logger.Warning("Failed to load AI status for Wino account {Email}. Error code: {ErrorCode}", account.Email, response.ErrorCode);
return response;
}
return response;
}
public async Task<ApiEnvelope<AiTextResultDto>> SummarizeAsync(string html, string targetLanguage, CancellationToken cancellationToken = default)
=> await ExecuteAiOperationAsync(account => _apiClient.SummarizeAsync(html, targetLanguage, cancellationToken), "summarize", cancellationToken).ConfigureAwait(false);
public async Task<ApiEnvelope<AiTextResultDto>> TranslateAsync(string html, string targetLanguage, CancellationToken cancellationToken = default)
=> await ExecuteAiOperationAsync(account => _apiClient.TranslateAsync(html, targetLanguage, cancellationToken), "translate", cancellationToken).ConfigureAwait(false);
public async Task<ApiEnvelope<AiTextResultDto>> RewriteAsync(string html, string mode, CancellationToken cancellationToken = default)
=> await ExecuteAiOperationAsync(account => _apiClient.RewriteAsync(html, mode, cancellationToken), "rewrite", cancellationToken).ConfigureAwait(false);
public async Task<ApiEnvelope<JsonElement>> SyncStoreEntitlementsAsync(CancellationToken cancellationToken = default)
{
var account = await GetActiveAccountAsync().ConfigureAwait(false);
@@ -281,7 +253,6 @@ public sealed class WinoAccountProfileService : BaseDatabaseService, IWinoAccoun
}
await RefreshProfileAsync(cancellationToken).ConfigureAwait(false);
await GetAiStatusAsync(cancellationToken).ConfigureAwait(false);
return response;
}
@@ -426,25 +397,6 @@ public sealed class WinoAccountProfileService : BaseDatabaseService, IWinoAccoun
private void PublishProfileUpdated(WinoAccount account)
=> ReportUIChange(new WinoAccountProfileUpdatedMessage(account));
private async Task<ApiEnvelope<AiTextResultDto>> ExecuteAiOperationAsync(Func<WinoAccount, Task<ApiEnvelope<AiTextResultDto>>> executeAsync,
string operationName,
CancellationToken cancellationToken)
{
var account = await GetAuthenticatedAccountAsync(cancellationToken).ConfigureAwait(false);
if (account == null)
{
return ApiEnvelope<AiTextResultDto>.Failure("MissingAccessToken");
}
var response = await executeAsync(account).ConfigureAwait(false);
if (!response.IsSuccess)
{
_logger.Warning("Failed to {Operation} HTML with AI for Wino account {Email}. Error code: {ErrorCode}", operationName, account.Email, response.ErrorCode);
}
return response;
}
private static bool AreEquivalentProfiles(WinoAccount left, WinoAccount right)
=> left.Id == right.Id &&
string.Equals(left.Email, right.Email, StringComparison.Ordinal) &&
@@ -479,7 +431,6 @@ public sealed class WinoAccountProfileService : BaseDatabaseService, IWinoAccoun
return productCode.Trim().ToUpperInvariant() switch
{
"AI_PACK" => WinoAddOnProductType.AI_PACK,
"UNLIMITED_ACCOUNTS" => WinoAddOnProductType.UNLIMITED_ACCOUNTS,
_ => null
};