From c4a0256f6ec92579ecedf708f48cc5146281819b Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 4 Apr 2026 20:12:24 +0500 Subject: [PATCH] feat: /subscribe pricing page + Pro nav link + fix checkout token scope - Add /subscribe route with hero, benefits list, and pricing cards (annual featured with Save 33% badge, monthly secondary) - Add 'Pro' link in nav for non-Pro users - Add 'See plans' link in profile subscription section - i18n keys across en/fr/id/pt/ru for all subscribe strings Note: checkout still requires POLAR_API_TOKEN with checkouts:write scope. Regenerate the token at polar.sh to fix the 502 error on subscribe buttons. --- ui/messages/en.json | 20 +++ ui/messages/fr.json | 20 +++ ui/messages/id.json | 20 +++ ui/messages/pt.json | 20 +++ ui/messages/ru.json | 20 +++ ui/src/lib/paraglide/messages.js | 4 +- ui/src/lib/paraglide/messages/_index.js | 20 +++ .../messages/subscribe_already_pro.js | 44 +++++ .../messages/subscribe_annual_label.js | 44 +++++ .../messages/subscribe_annual_period.js | 44 +++++ .../messages/subscribe_annual_price.js | 44 +++++ .../messages/subscribe_annual_save.js | 44 +++++ .../messages/subscribe_benefit_audio.js | 44 +++++ .../messages/subscribe_benefit_downloads.js | 44 +++++ .../messages/subscribe_benefit_translation.js | 44 +++++ .../messages/subscribe_benefit_voices.js | 44 +++++ .../messages/subscribe_cta_annual.js | 44 +++++ .../messages/subscribe_cta_monthly.js | 44 +++++ .../paraglide/messages/subscribe_heading.js | 44 +++++ .../paraglide/messages/subscribe_login_cta.js | 44 +++++ .../messages/subscribe_login_prompt.js | 44 +++++ .../paraglide/messages/subscribe_manage.js | 44 +++++ .../messages/subscribe_monthly_label.js | 44 +++++ .../messages/subscribe_monthly_period.js | 44 +++++ .../messages/subscribe_monthly_price.js | 44 +++++ .../messages/subscribe_page_title.js | 44 +++++ .../messages/subscribe_subheading.js | 44 +++++ ui/src/routes/+layout.svelte | 9 + ui/src/routes/profile/+page.svelte | 2 +- ui/src/routes/subscribe/+page.server.ts | 5 + ui/src/routes/subscribe/+page.svelte | 162 ++++++++++++++++++ 31 files changed, 1180 insertions(+), 2 deletions(-) create mode 100644 ui/src/lib/paraglide/messages/subscribe_already_pro.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_annual_label.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_annual_period.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_annual_price.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_annual_save.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_benefit_audio.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_benefit_downloads.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_benefit_translation.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_benefit_voices.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_cta_annual.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_cta_monthly.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_heading.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_login_cta.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_login_prompt.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_manage.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_monthly_label.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_monthly_period.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_monthly_price.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_page_title.js create mode 100644 ui/src/lib/paraglide/messages/subscribe_subheading.js create mode 100644 ui/src/routes/subscribe/+page.server.ts create mode 100644 ui/src/routes/subscribe/+page.svelte diff --git a/ui/messages/en.json b/ui/messages/en.json index 114056b..62e21ea 100644 --- a/ui/messages/en.json +++ b/ui/messages/en.json @@ -366,6 +366,26 @@ "profile_upgrade_monthly": "Monthly \u2014 $6 / mo", "profile_upgrade_annual": "Annual \u2014 $48 / yr", "profile_free_limits": "Free plan: 3 audio chapters per day, English reading only.", + "subscribe_page_title": "Go Pro \u2014 libnovel", + "subscribe_heading": "Read more. Listen more.", + "subscribe_subheading": "Upgrade to Pro and unlock the full libnovel experience.", + "subscribe_monthly_label": "Monthly", + "subscribe_monthly_price": "$6", + "subscribe_monthly_period": "per month", + "subscribe_annual_label": "Annual", + "subscribe_annual_price": "$48", + "subscribe_annual_period": "per year", + "subscribe_annual_save": "Save 33%", + "subscribe_cta_monthly": "Start monthly plan", + "subscribe_cta_annual": "Start annual plan", + "subscribe_already_pro": "You already have a Pro subscription.", + "subscribe_manage": "Manage subscription", + "subscribe_benefit_audio": "Unlimited audio chapters per day", + "subscribe_benefit_voices": "Voice selection across all TTS engines", + "subscribe_benefit_translation": "Read in French, Indonesian, Portuguese, and Russian", + "subscribe_benefit_downloads": "Download chapters for offline listening", + "subscribe_login_prompt": "Sign in to subscribe", + "subscribe_login_cta": "Sign in", "user_currently_reading": "Currently Reading", "user_library_count": "Library ({n})", diff --git a/ui/messages/fr.json b/ui/messages/fr.json index a21acb8..0daf8f5 100644 --- a/ui/messages/fr.json +++ b/ui/messages/fr.json @@ -366,6 +366,26 @@ "profile_upgrade_monthly": "Mensuel — 6 $ / mois", "profile_upgrade_annual": "Annuel — 48 $ / an", "profile_free_limits": "Plan gratuit : 3 chapitres audio par jour, lecture en anglais uniquement.", + "subscribe_page_title": "Passer Pro \u2014 libnovel", + "subscribe_heading": "Lisez plus. Écoutez plus.", + "subscribe_subheading": "Passez Pro et débloquez l'expérience libnovel complète.", + "subscribe_monthly_label": "Mensuel", + "subscribe_monthly_price": "6 $", + "subscribe_monthly_period": "par mois", + "subscribe_annual_label": "Annuel", + "subscribe_annual_price": "48 $", + "subscribe_annual_period": "par an", + "subscribe_annual_save": "Économisez 33 %", + "subscribe_cta_monthly": "Commencer le plan mensuel", + "subscribe_cta_annual": "Commencer le plan annuel", + "subscribe_already_pro": "Vous avez déjà un abonnement Pro.", + "subscribe_manage": "Gérer l'abonnement", + "subscribe_benefit_audio": "Chapitres audio illimités par jour", + "subscribe_benefit_voices": "Sélection de voix pour tous les moteurs TTS", + "subscribe_benefit_translation": "Lire en français, indonésien, portugais et russe", + "subscribe_benefit_downloads": "Télécharger des chapitres pour une écoute hors ligne", + "subscribe_login_prompt": "Connectez-vous pour vous abonner", + "subscribe_login_cta": "Se connecter", "user_currently_reading": "En cours de lecture", "user_library_count": "Bibliothèque ({n})", diff --git a/ui/messages/id.json b/ui/messages/id.json index ef9b659..8daae79 100644 --- a/ui/messages/id.json +++ b/ui/messages/id.json @@ -366,6 +366,26 @@ "profile_upgrade_monthly": "Bulanan — $6 / bln", "profile_upgrade_annual": "Tahunan — $48 / thn", "profile_free_limits": "Paket gratis: 3 bab audio per hari, hanya bahasa Inggris.", + "subscribe_page_title": "Jadi Pro \u2014 libnovel", + "subscribe_heading": "Baca lebih. Dengarkan lebih.", + "subscribe_subheading": "Tingkatkan ke Pro dan buka pengalaman libnovel sepenuhnya.", + "subscribe_monthly_label": "Bulanan", + "subscribe_monthly_price": "$6", + "subscribe_monthly_period": "per bulan", + "subscribe_annual_label": "Tahunan", + "subscribe_annual_price": "$48", + "subscribe_annual_period": "per tahun", + "subscribe_annual_save": "Hemat 33%", + "subscribe_cta_monthly": "Mulai paket bulanan", + "subscribe_cta_annual": "Mulai paket tahunan", + "subscribe_already_pro": "Anda sudah berlangganan Pro.", + "subscribe_manage": "Kelola langganan", + "subscribe_benefit_audio": "Bab audio tak terbatas per hari", + "subscribe_benefit_voices": "Pilihan suara untuk semua mesin TTS", + "subscribe_benefit_translation": "Baca dalam bahasa Prancis, Indonesia, Portugis, dan Rusia", + "subscribe_benefit_downloads": "Unduh bab untuk didengarkan secara offline", + "subscribe_login_prompt": "Masuk untuk berlangganan", + "subscribe_login_cta": "Masuk", "user_currently_reading": "Sedang Dibaca", "user_library_count": "Perpustakaan ({n})", diff --git a/ui/messages/pt.json b/ui/messages/pt.json index 6775699..f484cdb 100644 --- a/ui/messages/pt.json +++ b/ui/messages/pt.json @@ -366,6 +366,26 @@ "profile_upgrade_monthly": "Mensal — $6 / mês", "profile_upgrade_annual": "Anual — $48 / ano", "profile_free_limits": "Plano gratuito: 3 capítulos de áudio por dia, somente inglês.", + "subscribe_page_title": "Seja Pro \u2014 libnovel", + "subscribe_heading": "Leia mais. Ouça mais.", + "subscribe_subheading": "Torne-se Pro e desbloqueie a experiência completa do libnovel.", + "subscribe_monthly_label": "Mensal", + "subscribe_monthly_price": "$6", + "subscribe_monthly_period": "por mês", + "subscribe_annual_label": "Anual", + "subscribe_annual_price": "$48", + "subscribe_annual_period": "por ano", + "subscribe_annual_save": "Economize 33%", + "subscribe_cta_monthly": "Começar plano mensal", + "subscribe_cta_annual": "Começar plano anual", + "subscribe_already_pro": "Você já tem uma assinatura Pro.", + "subscribe_manage": "Gerenciar assinatura", + "subscribe_benefit_audio": "Capítulos de áudio ilimitados por dia", + "subscribe_benefit_voices": "Seleção de voz para todos os mecanismos TTS", + "subscribe_benefit_translation": "Leia em francês, indonésio, português e russo", + "subscribe_benefit_downloads": "Baixe capítulos para ouvir offline", + "subscribe_login_prompt": "Entre para assinar", + "subscribe_login_cta": "Entrar", "user_currently_reading": "Lendo Agora", "user_library_count": "Biblioteca ({n})", diff --git a/ui/messages/ru.json b/ui/messages/ru.json index 1fcb8ba..b055eef 100644 --- a/ui/messages/ru.json +++ b/ui/messages/ru.json @@ -366,6 +366,26 @@ "profile_upgrade_monthly": "Ежемесячно — $6 / мес", "profile_upgrade_annual": "Ежегодно — $48 / год", "profile_free_limits": "Бесплатный план: 3 аудиоглавы в день, только английский.", + "subscribe_page_title": "Перейти на Pro \u2014 libnovel", + "subscribe_heading": "Читайте больше. Слушайте больше.", + "subscribe_subheading": "Перейдите на Pro и откройте полный опыт libnovel.", + "subscribe_monthly_label": "Ежемесячно", + "subscribe_monthly_price": "$6", + "subscribe_monthly_period": "в месяц", + "subscribe_annual_label": "Ежегодно", + "subscribe_annual_price": "$48", + "subscribe_annual_period": "в год", + "subscribe_annual_save": "Сэкономьте 33%", + "subscribe_cta_monthly": "Начать месячный план", + "subscribe_cta_annual": "Начать годовой план", + "subscribe_already_pro": "У вас уже есть подписка Pro.", + "subscribe_manage": "Управление подпиской", + "subscribe_benefit_audio": "Неограниченные аудиоглавы в день", + "subscribe_benefit_voices": "Выбор голоса для всех TTS-движков", + "subscribe_benefit_translation": "Читайте на французском, индонезийском, португальском и русском", + "subscribe_benefit_downloads": "Скачивайте главы для прослушивания офлайн", + "subscribe_login_prompt": "Войдите, чтобы оформить подписку", + "subscribe_login_cta": "Войти", "user_currently_reading": "Сейчас читает", "user_library_count": "Библиотека ({n})", diff --git a/ui/src/lib/paraglide/messages.js b/ui/src/lib/paraglide/messages.js index 83a0d9d..608d20d 100644 --- a/ui/src/lib/paraglide/messages.js +++ b/ui/src/lib/paraglide/messages.js @@ -1,2 +1,4 @@ /* eslint-disable */ -export * from './messages/_index.js' \ No newline at end of file +export * from './messages/_index.js' +// enabling auto-import by exposing all messages as m +export * as m from './messages/_index.js' \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/_index.js b/ui/src/lib/paraglide/messages/_index.js index 0ac1c9c..58c90b1 100644 --- a/ui/src/lib/paraglide/messages/_index.js +++ b/ui/src/lib/paraglide/messages/_index.js @@ -339,6 +339,26 @@ export * from './profile_upgrade_desc.js' export * from './profile_upgrade_monthly.js' export * from './profile_upgrade_annual.js' export * from './profile_free_limits.js' +export * from './subscribe_page_title.js' +export * from './subscribe_heading.js' +export * from './subscribe_subheading.js' +export * from './subscribe_monthly_label.js' +export * from './subscribe_monthly_price.js' +export * from './subscribe_monthly_period.js' +export * from './subscribe_annual_label.js' +export * from './subscribe_annual_price.js' +export * from './subscribe_annual_period.js' +export * from './subscribe_annual_save.js' +export * from './subscribe_cta_monthly.js' +export * from './subscribe_cta_annual.js' +export * from './subscribe_already_pro.js' +export * from './subscribe_manage.js' +export * from './subscribe_benefit_audio.js' +export * from './subscribe_benefit_voices.js' +export * from './subscribe_benefit_translation.js' +export * from './subscribe_benefit_downloads.js' +export * from './subscribe_login_prompt.js' +export * from './subscribe_login_cta.js' export * from './user_currently_reading.js' export * from './user_library_count.js' export * from './user_joined.js' diff --git a/ui/src/lib/paraglide/messages/subscribe_already_pro.js b/ui/src/lib/paraglide/messages/subscribe_already_pro.js new file mode 100644 index 0000000..748aee3 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_already_pro.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Already_ProInputs */ + +const en_subscribe_already_pro = /** @type {(inputs: Subscribe_Already_ProInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`You already have a Pro subscription.`) +}; + +const ru_subscribe_already_pro = /** @type {(inputs: Subscribe_Already_ProInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`У вас уже есть подписка Pro.`) +}; + +const id_subscribe_already_pro = /** @type {(inputs: Subscribe_Already_ProInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Anda sudah berlangganan Pro.`) +}; + +const pt_subscribe_already_pro = /** @type {(inputs: Subscribe_Already_ProInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Você já tem uma assinatura Pro.`) +}; + +const fr_subscribe_already_pro = /** @type {(inputs: Subscribe_Already_ProInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Vous avez déjà un abonnement Pro.`) +}; + +/** +* | output | +* | --- | +* | "You already have a Pro subscription." | +* +* @param {Subscribe_Already_ProInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_already_pro = /** @type {((inputs?: Subscribe_Already_ProInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_already_pro(inputs) + if (locale === "ru") return ru_subscribe_already_pro(inputs) + if (locale === "id") return id_subscribe_already_pro(inputs) + if (locale === "pt") return pt_subscribe_already_pro(inputs) + return fr_subscribe_already_pro(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_annual_label.js b/ui/src/lib/paraglide/messages/subscribe_annual_label.js new file mode 100644 index 0000000..b2f2f52 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_annual_label.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Annual_LabelInputs */ + +const en_subscribe_annual_label = /** @type {(inputs: Subscribe_Annual_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Annual`) +}; + +const ru_subscribe_annual_label = /** @type {(inputs: Subscribe_Annual_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Ежегодно`) +}; + +const id_subscribe_annual_label = /** @type {(inputs: Subscribe_Annual_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Tahunan`) +}; + +const pt_subscribe_annual_label = /** @type {(inputs: Subscribe_Annual_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Anual`) +}; + +const fr_subscribe_annual_label = /** @type {(inputs: Subscribe_Annual_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Annuel`) +}; + +/** +* | output | +* | --- | +* | "Annual" | +* +* @param {Subscribe_Annual_LabelInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_annual_label = /** @type {((inputs?: Subscribe_Annual_LabelInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_annual_label(inputs) + if (locale === "ru") return ru_subscribe_annual_label(inputs) + if (locale === "id") return id_subscribe_annual_label(inputs) + if (locale === "pt") return pt_subscribe_annual_label(inputs) + return fr_subscribe_annual_label(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_annual_period.js b/ui/src/lib/paraglide/messages/subscribe_annual_period.js new file mode 100644 index 0000000..98294af --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_annual_period.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Annual_PeriodInputs */ + +const en_subscribe_annual_period = /** @type {(inputs: Subscribe_Annual_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`per year`) +}; + +const ru_subscribe_annual_period = /** @type {(inputs: Subscribe_Annual_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`в год`) +}; + +const id_subscribe_annual_period = /** @type {(inputs: Subscribe_Annual_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`per tahun`) +}; + +const pt_subscribe_annual_period = /** @type {(inputs: Subscribe_Annual_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`por ano`) +}; + +const fr_subscribe_annual_period = /** @type {(inputs: Subscribe_Annual_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`par an`) +}; + +/** +* | output | +* | --- | +* | "per year" | +* +* @param {Subscribe_Annual_PeriodInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_annual_period = /** @type {((inputs?: Subscribe_Annual_PeriodInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_annual_period(inputs) + if (locale === "ru") return ru_subscribe_annual_period(inputs) + if (locale === "id") return id_subscribe_annual_period(inputs) + if (locale === "pt") return pt_subscribe_annual_period(inputs) + return fr_subscribe_annual_period(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_annual_price.js b/ui/src/lib/paraglide/messages/subscribe_annual_price.js new file mode 100644 index 0000000..0dfd814 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_annual_price.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Annual_PriceInputs */ + +const en_subscribe_annual_price = /** @type {(inputs: Subscribe_Annual_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$48`) +}; + +const ru_subscribe_annual_price = /** @type {(inputs: Subscribe_Annual_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$48`) +}; + +const id_subscribe_annual_price = /** @type {(inputs: Subscribe_Annual_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$48`) +}; + +const pt_subscribe_annual_price = /** @type {(inputs: Subscribe_Annual_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$48`) +}; + +const fr_subscribe_annual_price = /** @type {(inputs: Subscribe_Annual_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`48 $`) +}; + +/** +* | output | +* | --- | +* | "$48" | +* +* @param {Subscribe_Annual_PriceInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_annual_price = /** @type {((inputs?: Subscribe_Annual_PriceInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_annual_price(inputs) + if (locale === "ru") return ru_subscribe_annual_price(inputs) + if (locale === "id") return id_subscribe_annual_price(inputs) + if (locale === "pt") return pt_subscribe_annual_price(inputs) + return fr_subscribe_annual_price(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_annual_save.js b/ui/src/lib/paraglide/messages/subscribe_annual_save.js new file mode 100644 index 0000000..9731386 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_annual_save.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Annual_SaveInputs */ + +const en_subscribe_annual_save = /** @type {(inputs: Subscribe_Annual_SaveInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Save 33%`) +}; + +const ru_subscribe_annual_save = /** @type {(inputs: Subscribe_Annual_SaveInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Сэкономьте 33%`) +}; + +const id_subscribe_annual_save = /** @type {(inputs: Subscribe_Annual_SaveInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Hemat 33%`) +}; + +const pt_subscribe_annual_save = /** @type {(inputs: Subscribe_Annual_SaveInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Economize 33%`) +}; + +const fr_subscribe_annual_save = /** @type {(inputs: Subscribe_Annual_SaveInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Économisez 33 %`) +}; + +/** +* | output | +* | --- | +* | "Save 33%" | +* +* @param {Subscribe_Annual_SaveInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_annual_save = /** @type {((inputs?: Subscribe_Annual_SaveInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_annual_save(inputs) + if (locale === "ru") return ru_subscribe_annual_save(inputs) + if (locale === "id") return id_subscribe_annual_save(inputs) + if (locale === "pt") return pt_subscribe_annual_save(inputs) + return fr_subscribe_annual_save(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_benefit_audio.js b/ui/src/lib/paraglide/messages/subscribe_benefit_audio.js new file mode 100644 index 0000000..706c97b --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_benefit_audio.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Benefit_AudioInputs */ + +const en_subscribe_benefit_audio = /** @type {(inputs: Subscribe_Benefit_AudioInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Unlimited audio chapters per day`) +}; + +const ru_subscribe_benefit_audio = /** @type {(inputs: Subscribe_Benefit_AudioInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Неограниченные аудиоглавы в день`) +}; + +const id_subscribe_benefit_audio = /** @type {(inputs: Subscribe_Benefit_AudioInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Bab audio tak terbatas per hari`) +}; + +const pt_subscribe_benefit_audio = /** @type {(inputs: Subscribe_Benefit_AudioInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Capítulos de áudio ilimitados por dia`) +}; + +const fr_subscribe_benefit_audio = /** @type {(inputs: Subscribe_Benefit_AudioInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Chapitres audio illimités par jour`) +}; + +/** +* | output | +* | --- | +* | "Unlimited audio chapters per day" | +* +* @param {Subscribe_Benefit_AudioInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_benefit_audio = /** @type {((inputs?: Subscribe_Benefit_AudioInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_benefit_audio(inputs) + if (locale === "ru") return ru_subscribe_benefit_audio(inputs) + if (locale === "id") return id_subscribe_benefit_audio(inputs) + if (locale === "pt") return pt_subscribe_benefit_audio(inputs) + return fr_subscribe_benefit_audio(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_benefit_downloads.js b/ui/src/lib/paraglide/messages/subscribe_benefit_downloads.js new file mode 100644 index 0000000..e5f0a02 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_benefit_downloads.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Benefit_DownloadsInputs */ + +const en_subscribe_benefit_downloads = /** @type {(inputs: Subscribe_Benefit_DownloadsInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Download chapters for offline listening`) +}; + +const ru_subscribe_benefit_downloads = /** @type {(inputs: Subscribe_Benefit_DownloadsInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Скачивайте главы для прослушивания офлайн`) +}; + +const id_subscribe_benefit_downloads = /** @type {(inputs: Subscribe_Benefit_DownloadsInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Unduh bab untuk didengarkan secara offline`) +}; + +const pt_subscribe_benefit_downloads = /** @type {(inputs: Subscribe_Benefit_DownloadsInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Baixe capítulos para ouvir offline`) +}; + +const fr_subscribe_benefit_downloads = /** @type {(inputs: Subscribe_Benefit_DownloadsInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Télécharger des chapitres pour une écoute hors ligne`) +}; + +/** +* | output | +* | --- | +* | "Download chapters for offline listening" | +* +* @param {Subscribe_Benefit_DownloadsInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_benefit_downloads = /** @type {((inputs?: Subscribe_Benefit_DownloadsInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_benefit_downloads(inputs) + if (locale === "ru") return ru_subscribe_benefit_downloads(inputs) + if (locale === "id") return id_subscribe_benefit_downloads(inputs) + if (locale === "pt") return pt_subscribe_benefit_downloads(inputs) + return fr_subscribe_benefit_downloads(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_benefit_translation.js b/ui/src/lib/paraglide/messages/subscribe_benefit_translation.js new file mode 100644 index 0000000..cfc8a74 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_benefit_translation.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Benefit_TranslationInputs */ + +const en_subscribe_benefit_translation = /** @type {(inputs: Subscribe_Benefit_TranslationInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Read in French, Indonesian, Portuguese, and Russian`) +}; + +const ru_subscribe_benefit_translation = /** @type {(inputs: Subscribe_Benefit_TranslationInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Читайте на французском, индонезийском, португальском и русском`) +}; + +const id_subscribe_benefit_translation = /** @type {(inputs: Subscribe_Benefit_TranslationInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Baca dalam bahasa Prancis, Indonesia, Portugis, dan Rusia`) +}; + +const pt_subscribe_benefit_translation = /** @type {(inputs: Subscribe_Benefit_TranslationInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Leia em francês, indonésio, português e russo`) +}; + +const fr_subscribe_benefit_translation = /** @type {(inputs: Subscribe_Benefit_TranslationInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Lire en français, indonésien, portugais et russe`) +}; + +/** +* | output | +* | --- | +* | "Read in French, Indonesian, Portuguese, and Russian" | +* +* @param {Subscribe_Benefit_TranslationInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_benefit_translation = /** @type {((inputs?: Subscribe_Benefit_TranslationInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_benefit_translation(inputs) + if (locale === "ru") return ru_subscribe_benefit_translation(inputs) + if (locale === "id") return id_subscribe_benefit_translation(inputs) + if (locale === "pt") return pt_subscribe_benefit_translation(inputs) + return fr_subscribe_benefit_translation(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_benefit_voices.js b/ui/src/lib/paraglide/messages/subscribe_benefit_voices.js new file mode 100644 index 0000000..61e136f --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_benefit_voices.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Benefit_VoicesInputs */ + +const en_subscribe_benefit_voices = /** @type {(inputs: Subscribe_Benefit_VoicesInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Voice selection across all TTS engines`) +}; + +const ru_subscribe_benefit_voices = /** @type {(inputs: Subscribe_Benefit_VoicesInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Выбор голоса для всех TTS-движков`) +}; + +const id_subscribe_benefit_voices = /** @type {(inputs: Subscribe_Benefit_VoicesInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Pilihan suara untuk semua mesin TTS`) +}; + +const pt_subscribe_benefit_voices = /** @type {(inputs: Subscribe_Benefit_VoicesInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Seleção de voz para todos os mecanismos TTS`) +}; + +const fr_subscribe_benefit_voices = /** @type {(inputs: Subscribe_Benefit_VoicesInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Sélection de voix pour tous les moteurs TTS`) +}; + +/** +* | output | +* | --- | +* | "Voice selection across all TTS engines" | +* +* @param {Subscribe_Benefit_VoicesInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_benefit_voices = /** @type {((inputs?: Subscribe_Benefit_VoicesInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_benefit_voices(inputs) + if (locale === "ru") return ru_subscribe_benefit_voices(inputs) + if (locale === "id") return id_subscribe_benefit_voices(inputs) + if (locale === "pt") return pt_subscribe_benefit_voices(inputs) + return fr_subscribe_benefit_voices(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_cta_annual.js b/ui/src/lib/paraglide/messages/subscribe_cta_annual.js new file mode 100644 index 0000000..c55cf0c --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_cta_annual.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Cta_AnnualInputs */ + +const en_subscribe_cta_annual = /** @type {(inputs: Subscribe_Cta_AnnualInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Start annual plan`) +}; + +const ru_subscribe_cta_annual = /** @type {(inputs: Subscribe_Cta_AnnualInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Начать годовой план`) +}; + +const id_subscribe_cta_annual = /** @type {(inputs: Subscribe_Cta_AnnualInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Mulai paket tahunan`) +}; + +const pt_subscribe_cta_annual = /** @type {(inputs: Subscribe_Cta_AnnualInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Começar plano anual`) +}; + +const fr_subscribe_cta_annual = /** @type {(inputs: Subscribe_Cta_AnnualInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Commencer le plan annuel`) +}; + +/** +* | output | +* | --- | +* | "Start annual plan" | +* +* @param {Subscribe_Cta_AnnualInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_cta_annual = /** @type {((inputs?: Subscribe_Cta_AnnualInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_cta_annual(inputs) + if (locale === "ru") return ru_subscribe_cta_annual(inputs) + if (locale === "id") return id_subscribe_cta_annual(inputs) + if (locale === "pt") return pt_subscribe_cta_annual(inputs) + return fr_subscribe_cta_annual(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_cta_monthly.js b/ui/src/lib/paraglide/messages/subscribe_cta_monthly.js new file mode 100644 index 0000000..c0d4374 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_cta_monthly.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Cta_MonthlyInputs */ + +const en_subscribe_cta_monthly = /** @type {(inputs: Subscribe_Cta_MonthlyInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Start monthly plan`) +}; + +const ru_subscribe_cta_monthly = /** @type {(inputs: Subscribe_Cta_MonthlyInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Начать месячный план`) +}; + +const id_subscribe_cta_monthly = /** @type {(inputs: Subscribe_Cta_MonthlyInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Mulai paket bulanan`) +}; + +const pt_subscribe_cta_monthly = /** @type {(inputs: Subscribe_Cta_MonthlyInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Começar plano mensal`) +}; + +const fr_subscribe_cta_monthly = /** @type {(inputs: Subscribe_Cta_MonthlyInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Commencer le plan mensuel`) +}; + +/** +* | output | +* | --- | +* | "Start monthly plan" | +* +* @param {Subscribe_Cta_MonthlyInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_cta_monthly = /** @type {((inputs?: Subscribe_Cta_MonthlyInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_cta_monthly(inputs) + if (locale === "ru") return ru_subscribe_cta_monthly(inputs) + if (locale === "id") return id_subscribe_cta_monthly(inputs) + if (locale === "pt") return pt_subscribe_cta_monthly(inputs) + return fr_subscribe_cta_monthly(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_heading.js b/ui/src/lib/paraglide/messages/subscribe_heading.js new file mode 100644 index 0000000..7b42a57 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_heading.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_HeadingInputs */ + +const en_subscribe_heading = /** @type {(inputs: Subscribe_HeadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Read more. Listen more.`) +}; + +const ru_subscribe_heading = /** @type {(inputs: Subscribe_HeadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Читайте больше. Слушайте больше.`) +}; + +const id_subscribe_heading = /** @type {(inputs: Subscribe_HeadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Baca lebih. Dengarkan lebih.`) +}; + +const pt_subscribe_heading = /** @type {(inputs: Subscribe_HeadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Leia mais. Ouça mais.`) +}; + +const fr_subscribe_heading = /** @type {(inputs: Subscribe_HeadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Lisez plus. Écoutez plus.`) +}; + +/** +* | output | +* | --- | +* | "Read more. Listen more." | +* +* @param {Subscribe_HeadingInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_heading = /** @type {((inputs?: Subscribe_HeadingInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_heading(inputs) + if (locale === "ru") return ru_subscribe_heading(inputs) + if (locale === "id") return id_subscribe_heading(inputs) + if (locale === "pt") return pt_subscribe_heading(inputs) + return fr_subscribe_heading(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_login_cta.js b/ui/src/lib/paraglide/messages/subscribe_login_cta.js new file mode 100644 index 0000000..599e688 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_login_cta.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Login_CtaInputs */ + +const en_subscribe_login_cta = /** @type {(inputs: Subscribe_Login_CtaInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Sign in`) +}; + +const ru_subscribe_login_cta = /** @type {(inputs: Subscribe_Login_CtaInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Войти`) +}; + +const id_subscribe_login_cta = /** @type {(inputs: Subscribe_Login_CtaInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Masuk`) +}; + +const pt_subscribe_login_cta = /** @type {(inputs: Subscribe_Login_CtaInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Entrar`) +}; + +const fr_subscribe_login_cta = /** @type {(inputs: Subscribe_Login_CtaInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Se connecter`) +}; + +/** +* | output | +* | --- | +* | "Sign in" | +* +* @param {Subscribe_Login_CtaInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_login_cta = /** @type {((inputs?: Subscribe_Login_CtaInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_login_cta(inputs) + if (locale === "ru") return ru_subscribe_login_cta(inputs) + if (locale === "id") return id_subscribe_login_cta(inputs) + if (locale === "pt") return pt_subscribe_login_cta(inputs) + return fr_subscribe_login_cta(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_login_prompt.js b/ui/src/lib/paraglide/messages/subscribe_login_prompt.js new file mode 100644 index 0000000..f16e2d4 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_login_prompt.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Login_PromptInputs */ + +const en_subscribe_login_prompt = /** @type {(inputs: Subscribe_Login_PromptInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Sign in to subscribe`) +}; + +const ru_subscribe_login_prompt = /** @type {(inputs: Subscribe_Login_PromptInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Войдите, чтобы оформить подписку`) +}; + +const id_subscribe_login_prompt = /** @type {(inputs: Subscribe_Login_PromptInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Masuk untuk berlangganan`) +}; + +const pt_subscribe_login_prompt = /** @type {(inputs: Subscribe_Login_PromptInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Entre para assinar`) +}; + +const fr_subscribe_login_prompt = /** @type {(inputs: Subscribe_Login_PromptInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Connectez-vous pour vous abonner`) +}; + +/** +* | output | +* | --- | +* | "Sign in to subscribe" | +* +* @param {Subscribe_Login_PromptInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_login_prompt = /** @type {((inputs?: Subscribe_Login_PromptInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_login_prompt(inputs) + if (locale === "ru") return ru_subscribe_login_prompt(inputs) + if (locale === "id") return id_subscribe_login_prompt(inputs) + if (locale === "pt") return pt_subscribe_login_prompt(inputs) + return fr_subscribe_login_prompt(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_manage.js b/ui/src/lib/paraglide/messages/subscribe_manage.js new file mode 100644 index 0000000..84fab7a --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_manage.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_ManageInputs */ + +const en_subscribe_manage = /** @type {(inputs: Subscribe_ManageInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Manage subscription`) +}; + +const ru_subscribe_manage = /** @type {(inputs: Subscribe_ManageInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Управление подпиской`) +}; + +const id_subscribe_manage = /** @type {(inputs: Subscribe_ManageInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Kelola langganan`) +}; + +const pt_subscribe_manage = /** @type {(inputs: Subscribe_ManageInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Gerenciar assinatura`) +}; + +const fr_subscribe_manage = /** @type {(inputs: Subscribe_ManageInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Gérer l'abonnement`) +}; + +/** +* | output | +* | --- | +* | "Manage subscription" | +* +* @param {Subscribe_ManageInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_manage = /** @type {((inputs?: Subscribe_ManageInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_manage(inputs) + if (locale === "ru") return ru_subscribe_manage(inputs) + if (locale === "id") return id_subscribe_manage(inputs) + if (locale === "pt") return pt_subscribe_manage(inputs) + return fr_subscribe_manage(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_monthly_label.js b/ui/src/lib/paraglide/messages/subscribe_monthly_label.js new file mode 100644 index 0000000..9108e7e --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_monthly_label.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Monthly_LabelInputs */ + +const en_subscribe_monthly_label = /** @type {(inputs: Subscribe_Monthly_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Monthly`) +}; + +const ru_subscribe_monthly_label = /** @type {(inputs: Subscribe_Monthly_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Ежемесячно`) +}; + +const id_subscribe_monthly_label = /** @type {(inputs: Subscribe_Monthly_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Bulanan`) +}; + +const pt_subscribe_monthly_label = /** @type {(inputs: Subscribe_Monthly_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Mensal`) +}; + +const fr_subscribe_monthly_label = /** @type {(inputs: Subscribe_Monthly_LabelInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Mensuel`) +}; + +/** +* | output | +* | --- | +* | "Monthly" | +* +* @param {Subscribe_Monthly_LabelInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_monthly_label = /** @type {((inputs?: Subscribe_Monthly_LabelInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_monthly_label(inputs) + if (locale === "ru") return ru_subscribe_monthly_label(inputs) + if (locale === "id") return id_subscribe_monthly_label(inputs) + if (locale === "pt") return pt_subscribe_monthly_label(inputs) + return fr_subscribe_monthly_label(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_monthly_period.js b/ui/src/lib/paraglide/messages/subscribe_monthly_period.js new file mode 100644 index 0000000..870bf46 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_monthly_period.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Monthly_PeriodInputs */ + +const en_subscribe_monthly_period = /** @type {(inputs: Subscribe_Monthly_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`per month`) +}; + +const ru_subscribe_monthly_period = /** @type {(inputs: Subscribe_Monthly_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`в месяц`) +}; + +const id_subscribe_monthly_period = /** @type {(inputs: Subscribe_Monthly_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`per bulan`) +}; + +const pt_subscribe_monthly_period = /** @type {(inputs: Subscribe_Monthly_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`por mês`) +}; + +const fr_subscribe_monthly_period = /** @type {(inputs: Subscribe_Monthly_PeriodInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`par mois`) +}; + +/** +* | output | +* | --- | +* | "per month" | +* +* @param {Subscribe_Monthly_PeriodInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_monthly_period = /** @type {((inputs?: Subscribe_Monthly_PeriodInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_monthly_period(inputs) + if (locale === "ru") return ru_subscribe_monthly_period(inputs) + if (locale === "id") return id_subscribe_monthly_period(inputs) + if (locale === "pt") return pt_subscribe_monthly_period(inputs) + return fr_subscribe_monthly_period(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_monthly_price.js b/ui/src/lib/paraglide/messages/subscribe_monthly_price.js new file mode 100644 index 0000000..63f8a33 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_monthly_price.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Monthly_PriceInputs */ + +const en_subscribe_monthly_price = /** @type {(inputs: Subscribe_Monthly_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$6`) +}; + +const ru_subscribe_monthly_price = /** @type {(inputs: Subscribe_Monthly_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$6`) +}; + +const id_subscribe_monthly_price = /** @type {(inputs: Subscribe_Monthly_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$6`) +}; + +const pt_subscribe_monthly_price = /** @type {(inputs: Subscribe_Monthly_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`$6`) +}; + +const fr_subscribe_monthly_price = /** @type {(inputs: Subscribe_Monthly_PriceInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`6 $`) +}; + +/** +* | output | +* | --- | +* | "$6" | +* +* @param {Subscribe_Monthly_PriceInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_monthly_price = /** @type {((inputs?: Subscribe_Monthly_PriceInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_monthly_price(inputs) + if (locale === "ru") return ru_subscribe_monthly_price(inputs) + if (locale === "id") return id_subscribe_monthly_price(inputs) + if (locale === "pt") return pt_subscribe_monthly_price(inputs) + return fr_subscribe_monthly_price(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_page_title.js b/ui/src/lib/paraglide/messages/subscribe_page_title.js new file mode 100644 index 0000000..2b131bd --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_page_title.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_Page_TitleInputs */ + +const en_subscribe_page_title = /** @type {(inputs: Subscribe_Page_TitleInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Go Pro — libnovel`) +}; + +const ru_subscribe_page_title = /** @type {(inputs: Subscribe_Page_TitleInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Перейти на Pro — libnovel`) +}; + +const id_subscribe_page_title = /** @type {(inputs: Subscribe_Page_TitleInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Jadi Pro — libnovel`) +}; + +const pt_subscribe_page_title = /** @type {(inputs: Subscribe_Page_TitleInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Seja Pro — libnovel`) +}; + +const fr_subscribe_page_title = /** @type {(inputs: Subscribe_Page_TitleInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Passer Pro — libnovel`) +}; + +/** +* | output | +* | --- | +* | "Go Pro — libnovel" | +* +* @param {Subscribe_Page_TitleInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_page_title = /** @type {((inputs?: Subscribe_Page_TitleInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_page_title(inputs) + if (locale === "ru") return ru_subscribe_page_title(inputs) + if (locale === "id") return id_subscribe_page_title(inputs) + if (locale === "pt") return pt_subscribe_page_title(inputs) + return fr_subscribe_page_title(inputs) +}); \ No newline at end of file diff --git a/ui/src/lib/paraglide/messages/subscribe_subheading.js b/ui/src/lib/paraglide/messages/subscribe_subheading.js new file mode 100644 index 0000000..ee5a8b1 --- /dev/null +++ b/ui/src/lib/paraglide/messages/subscribe_subheading.js @@ -0,0 +1,44 @@ +/* eslint-disable */ +import { getLocale, experimentalStaticLocale } from '../runtime.js'; + +/** @typedef {import('../runtime.js').LocalizedString} LocalizedString */ + +/** @typedef {{}} Subscribe_SubheadingInputs */ + +const en_subscribe_subheading = /** @type {(inputs: Subscribe_SubheadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Upgrade to Pro and unlock the full libnovel experience.`) +}; + +const ru_subscribe_subheading = /** @type {(inputs: Subscribe_SubheadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Перейдите на Pro и откройте полный опыт libnovel.`) +}; + +const id_subscribe_subheading = /** @type {(inputs: Subscribe_SubheadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Tingkatkan ke Pro dan buka pengalaman libnovel sepenuhnya.`) +}; + +const pt_subscribe_subheading = /** @type {(inputs: Subscribe_SubheadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Torne-se Pro e desbloqueie a experiência completa do libnovel.`) +}; + +const fr_subscribe_subheading = /** @type {(inputs: Subscribe_SubheadingInputs) => LocalizedString} */ () => { + return /** @type {LocalizedString} */ (`Passez Pro et débloquez l'expérience libnovel complète.`) +}; + +/** +* | output | +* | --- | +* | "Upgrade to Pro and unlock the full libnovel experience." | +* +* @param {Subscribe_SubheadingInputs} inputs +* @param {{ locale?: "en" | "ru" | "id" | "pt" | "fr" }} options +* @returns {LocalizedString} +*/ +export const subscribe_subheading = /** @type {((inputs?: Subscribe_SubheadingInputs, options?: { locale?: "en" | "ru" | "id" | "pt" | "fr" }) => LocalizedString) & import('../runtime.js').MessageMetadata} */ ((inputs = {}, options = {}) => { + const locale = experimentalStaticLocale ?? options.locale ?? getLocale() + if (locale === "en") return en_subscribe_subheading(inputs) + if (locale === "ru") return ru_subscribe_subheading(inputs) + if (locale === "id") return id_subscribe_subheading(inputs) + if (locale === "pt") return pt_subscribe_subheading(inputs) + return fr_subscribe_subheading(inputs) +}); \ No newline at end of file diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte index d2304f3..969bb12 100644 --- a/ui/src/routes/+layout.svelte +++ b/ui/src/routes/+layout.svelte @@ -407,6 +407,15 @@ > {m.nav_catalogue()} + {#if !data.isPro} + + {/if}

{m.profile_upgrade_heading()}

-

{m.profile_upgrade_desc()}

+

{m.profile_upgrade_desc()} See plans →

{#if checkoutError}

{checkoutError}

{/if} diff --git a/ui/src/routes/subscribe/+page.server.ts b/ui/src/routes/subscribe/+page.server.ts new file mode 100644 index 0000000..990bc03 --- /dev/null +++ b/ui/src/routes/subscribe/+page.server.ts @@ -0,0 +1,5 @@ +// Data is inherited from the root layout (user, isPro). +// This file exists only to ensure the route is treated as a page by SvelteKit. +export const load = async () => { + return {}; +}; diff --git a/ui/src/routes/subscribe/+page.svelte b/ui/src/routes/subscribe/+page.svelte new file mode 100644 index 0000000..f30059a --- /dev/null +++ b/ui/src/routes/subscribe/+page.svelte @@ -0,0 +1,162 @@ + + + + {m.subscribe_page_title()} + + +
+ +
+
+ + Pro +
+

+ {m.subscribe_heading()} +

+

+ {m.subscribe_subheading()} +

+
+ + +
    + {#each benefits as b} +
  • + + + + + + {b.label()} +
  • + {/each} +
+ + {#if data.isPro} + +
+

{m.subscribe_already_pro()}

+ + {m.subscribe_manage()} + + +
+ + {:else if !data.user} + +
+

{m.subscribe_login_prompt()}

+ + {m.subscribe_login_cta()} + +
+ + {:else} + + {#if checkoutError} +

{checkoutError}

+ {/if} +
+ + +
+
+ {m.subscribe_annual_save()} +
+
+ {m.subscribe_annual_label()} +
+ {m.subscribe_annual_price()} + {m.subscribe_annual_period()} +
+
+ +
+ + +
+
+ {m.subscribe_monthly_label()} +
+ {m.subscribe_monthly_price()} + {m.subscribe_monthly_period()} +
+
+ +
+ +
+ {/if} + +

+ Payments processed securely by Polar. Cancel anytime. +

+