From 33b2ba160933eecf73580a23c7c1d80ac5144ac0 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Tue, 29 Jul 2025 00:19:45 +0800 Subject: [PATCH] chore: add legal links in about window and user page (#1700) --- apps/readest-app/package.json | 2 +- .../public/locales/ar/translation.json | 4 ++- .../public/locales/de/translation.json | 4 ++- .../public/locales/el/translation.json | 4 ++- .../public/locales/es/translation.json | 4 ++- .../public/locales/fr/translation.json | 4 ++- .../public/locales/hi/translation.json | 4 ++- .../public/locales/id/translation.json | 6 ++-- .../public/locales/it/translation.json | 4 ++- .../public/locales/ja/translation.json | 4 ++- .../public/locales/ko/translation.json | 4 ++- .../public/locales/nl/translation.json | 4 ++- .../public/locales/pl/translation.json | 4 ++- .../public/locales/pt/translation.json | 4 ++- .../public/locales/ru/translation.json | 4 ++- .../public/locales/th/translation.json | 4 ++- .../public/locales/tr/translation.json | 4 ++- .../public/locales/uk/translation.json | 4 ++- .../public/locales/vi/translation.json | 4 ++- .../public/locales/zh-CN/translation.json | 4 ++- .../public/locales/zh-TW/translation.json | 4 ++- apps/readest-app/src/app/user/page.tsx | 2 ++ .../src/components/AboutWindow.tsx | 4 +++ .../readest-app/src/components/LegalLinks.tsx | 29 +++++++++++++++++++ .../src/libs/iap/apple/verifier.ts | 3 +- 25 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 apps/readest-app/src/components/LegalLinks.tsx diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index c6696040..f4eff27c 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -1,6 +1,6 @@ { "name": "@readest/readest-app", - "version": "0.9.67", + "version": "0.9.68", "private": true, "scripts": { "dev": "dotenv -e .env.tauri -- next dev", diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 622d56b7..bbaccf71 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -474,5 +474,7 @@ "Failed to load subscription plans.": "فشل في تحميل خطط الاشتراك.", "year": "سنة", "Failed to create checkout session": "فشل في إنشاء جلسة الدفع", - "Storage": "التخزين" + "Storage": "التخزين", + "Terms of Service": "شروط الخدمة", + "Privacy Policy": "سياسة الخصوصية" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index c66f9ee4..69fbf10a 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -458,5 +458,7 @@ "Failed to load subscription plans.": "Laden der Abonnementpläne fehlgeschlagen.", "year": "Jahr", "Failed to create checkout session": "Fehler beim Erstellen der Checkout-Sitzung", - "Storage": "Speicher" + "Storage": "Speicher", + "Terms of Service": "Allgemeine Geschäftsbedingungen", + "Privacy Policy": "Datenschutzbestimmungen" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 40599102..5a62f15b 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -458,5 +458,7 @@ "Failed to load subscription plans.": "Αποτυχία φόρτωσης σχεδίων συνδρομής.", "year": "έτος", "Failed to create checkout session": "Αποτυχία δημιουργίας συνεδρίας πληρωμής", - "Storage": "Αποθήκευση" + "Storage": "Αποθήκευση", + "Terms of Service": "Όροι χρήσης", + "Privacy Policy": "Πολιτική απορρήτου" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index e23303fa..fa9c2bdd 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -462,5 +462,7 @@ "Failed to load subscription plans.": "Error al cargar los planes de suscripción.", "year": "año", "Failed to create checkout session": "Error al crear la sesión de pago", - "Storage": "Almacenamiento" + "Storage": "Almacenamiento", + "Terms of Service": "Condiciones del servicio", + "Privacy Policy": "Política de privacidad" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index fc09ee15..cbf7e131 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -462,5 +462,7 @@ "Failed to load subscription plans.": "Échec du chargement des plans d'abonnement.", "year": "année", "Failed to create checkout session": "Échec de la création de la session de paiement", - "Storage": "Stockage" + "Storage": "Stockage", + "Terms of Service": "Conditions d'utilisation", + "Privacy Policy": "Politique de confidentialité" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index e5582625..a3c29f45 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -458,5 +458,7 @@ "Failed to load subscription plans.": "सदस्यता योजनाएँ लोड करने में विफल।", "year": "वर्ष", "Failed to create checkout session": "चेकआउट सत्र बनाने में विफल", - "Storage": "भंडारण" + "Storage": "भंडारण", + "Terms of Service": "सेवा की शर्तें", + "Privacy Policy": "गोपनीयता नीति" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 63f6d5b0..bf810e85 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -453,6 +453,8 @@ "Failed to manage subscription.": "Gagal mengelola langganan.", "Failed to load subscription plans.": "Gagal memuat rencana langganan.", "year": "tahun", - "Failed to create checkout session": "Failed to create checkout session", - "Storage": "Penyimpanan" + "Failed to create checkout session": "Gagal membuat sesi checkout", + "Storage": "Penyimpanan", + "Terms of Service": "Ketentuan Layanan", + "Privacy Policy": "Kebijakan Privasi" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 178e70fc..9fab0ba5 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -462,5 +462,7 @@ "Failed to load subscription plans.": "Impossibile caricare i piani di abbonamento.", "year": "anno", "Failed to create checkout session": "Impossibile creare la sessione di checkout", - "Storage": "Archiviazione" + "Storage": "Archiviazione", + "Terms of Service": "Termini di servizio", + "Privacy Policy": "Informativa sulla privacy" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 7a909c77..f1522c93 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "サブスクリプションプランの読み込みに失敗しました。", "year": "年", "Failed to create checkout session": "チェックアウトセッションの作成に失敗しました", - "Storage": "ストレージ" + "Storage": "ストレージ", + "Terms of Service": "利用規約", + "Privacy Policy": "プライバシーポリシー" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 8354a2f4..3330e320 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "구독 플랜 로드에 실패했습니다.", "year": "년", "Failed to create checkout session": "체크아웃 세션 생성 실패", - "Storage": "저장소" + "Storage": "저장소", + "Terms of Service": "서비스 약관", + "Privacy Policy": "개인정보 보호정책" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 2ed1874d..b6ad169b 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -458,5 +458,7 @@ "Failed to load subscription plans.": "Laden van abonnement plannen is mislukt.", "year": "jaar", "Failed to create checkout session": "Kon de afreken sessie niet aanmaken", - "Storage": "Opslag" + "Storage": "Opslag", + "Terms of Service": "Gebruiksvoorwaarden", + "Privacy Policy": "Privacybeleid" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 354d7098..7bb9703b 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -466,5 +466,7 @@ "Failed to load subscription plans.": "Nie udało się załadować planów subskrypcyjnych.", "year": "rok", "Failed to create checkout session": "Nie udało się utworzyć sesji zakupu", - "Storage": "Przechowywanie" + "Storage": "Przechowywanie", + "Terms of Service": "Warunki korzystania z usługi", + "Privacy Policy": "Polityka prywatności" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index b67d1afb..0130d0e6 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -462,5 +462,7 @@ "Failed to load subscription plans.": "Falha ao carregar planos de assinatura.", "year": "ano", "Failed to create checkout session": "Falha ao criar sessão de checkout", - "Storage": "Armazenamento" + "Storage": "Armazenamento", + "Terms of Service": "Termos de Serviço", + "Privacy Policy": "Política de Privacidade" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 958fbe2a..50d8025b 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -466,5 +466,7 @@ "Failed to load subscription plans.": "Не удалось загрузить планы подписки.", "year": "год", "Failed to create checkout session": "Не удалось создать сессию оформления заказа", - "Storage": "Хранилище" + "Storage": "Хранилище", + "Terms of Service": "Условия использования", + "Privacy Policy": "Политика конфиденциальности" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index 4d7331db..fdd88ffe 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "ไม่สามารถโหลดแผนการสมัครสมาชิกได้", "year": "ปี", "Failed to create checkout session": "ไม่สามารถสร้างเซสชันการชำระเงินได้", - "Storage": "พื้นที่เก็บข้อมูล" + "Storage": "พื้นที่เก็บข้อมูล", + "Terms of Service": "ข้อกำหนดในการให้บริการ", + "Privacy Policy": "นโยบายความเป็นส่วนตัว" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 728e8749..606a84d3 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -458,5 +458,7 @@ "Failed to load subscription plans.": "Abonelik planlarını yükleme başarısız oldu.", "year": "yıl", "Failed to create checkout session": "Ödeme oturumu oluşturma başarısız oldu", - "Storage": "Depolama" + "Storage": "Depolama", + "Terms of Service": "Hizmet Şartları", + "Privacy Policy": "Gizlilik Politikası" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 57989a05..3b6ec7f5 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -466,5 +466,7 @@ "Failed to load subscription plans.": "Не вдалося завантажити плани підписки.", "year": "рік", "Failed to create checkout session": "Не вдалося створити сесію оформлення замовлення", - "Storage": "Сховище" + "Storage": "Сховище", + "Terms of Service": "Умови обслуговування", + "Privacy Policy": "Політика конфіденційності" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 47b0c6f4..950a6edc 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "Tải kế hoạch đăng ký không thành công.", "year": "năm", "Failed to create checkout session": "Không thể tạo phiên làm việc thanh toán", - "Storage": "Lưu trữ" + "Storage": "Lưu trữ", + "Terms of Service": "Điều khoản dịch vụ", + "Privacy Policy": "Chính sách bảo mật" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 283b6155..773b5aa2 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "加载订阅计划失败。", "year": "年", "Failed to create checkout session": "创建结账会话失败", - "Storage": "云同步空间" + "Storage": "云同步空间", + "Terms of Service": "服务条款", + "Privacy Policy": "隐私政策" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index d0db82af..f3375715 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -454,5 +454,7 @@ "Failed to load subscription plans.": "加載訂閱計劃失敗。", "year": "年", "Failed to create checkout session": "創建結帳會話失敗", - "Storage": "雲同步空間" + "Storage": "雲同步空間", + "Terms of Service": "服務條款", + "Privacy Policy": "隱私政策" } diff --git a/apps/readest-app/src/app/user/page.tsx b/apps/readest-app/src/app/user/page.tsx index 18b9584a..8e79a0c7 100644 --- a/apps/readest-app/src/app/user/page.tsx +++ b/apps/readest-app/src/app/user/page.tsx @@ -22,6 +22,7 @@ import { getAccessToken } from '@/utils/access'; import { IAPService, IAPProduct } from '@/utils/iap'; import { getPlanDetails } from './utils/plan'; import { Toast } from '@/components/Toast'; +import LegalLinks from '@/components/LegalLinks'; import Spinner from '@/components/Spinner'; import ProfileHeader from './components/Header'; import UserInfo from './components/UserInfo'; @@ -392,6 +393,7 @@ const ProfilePage = () => { onManageSubscription={handleManageSubscription} /> + )} diff --git a/apps/readest-app/src/components/AboutWindow.tsx b/apps/readest-app/src/components/AboutWindow.tsx index fc573eb0..da328ca9 100644 --- a/apps/readest-app/src/components/AboutWindow.tsx +++ b/apps/readest-app/src/components/AboutWindow.tsx @@ -5,6 +5,7 @@ import { useTranslation } from '@/hooks/useTranslation'; import { checkForAppUpdates, checkAppReleaseNotes } from '@/helpers/updater'; import { parseWebViewVersion } from '@/utils/ua'; import { getAppVersion } from '@/utils/version'; +import LegalLinks from './LegalLinks'; import Dialog from './Dialog'; import Link from './Link'; @@ -122,6 +123,7 @@ export const AboutWindow = () => {

© {new Date().getFullYear()} Bilingify LLC. All rights reserved.

+

This software is licensed under the{' '} { .

+ + diff --git a/apps/readest-app/src/components/LegalLinks.tsx b/apps/readest-app/src/components/LegalLinks.tsx new file mode 100644 index 00000000..81e493c8 --- /dev/null +++ b/apps/readest-app/src/components/LegalLinks.tsx @@ -0,0 +1,29 @@ +import { useEnv } from '@/context/EnvContext'; +import { useTranslation } from '@/hooks/useTranslation'; +import Link from './Link'; + +const LegalLinks = () => { + const _ = useTranslation(); + const { appService } = useEnv(); + + const termsUrl = + appService?.isIOSApp || appService?.isMacOSApp + ? 'https://www.apple.com/legal/internet-services/itunes/dev/stdeula/' + : 'https://readest.com/terms-of-service'; + + return ( +
+ + {_('Terms of Service')} + + + {_('Privacy Policy')} + +
+ ); +}; + +export default LegalLinks; diff --git a/apps/readest-app/src/libs/iap/apple/verifier.ts b/apps/readest-app/src/libs/iap/apple/verifier.ts index b22b48d0..7a01a243 100644 --- a/apps/readest-app/src/libs/iap/apple/verifier.ts +++ b/apps/readest-app/src/libs/iap/apple/verifier.ts @@ -129,7 +129,8 @@ export const getAppleIAPVerifier = () => { process.env['APPLE_IAP_PRIVATE_KEY_BASE64']! || '', 'base64', ).toString('utf-8'), - environment: process.env.NODE_ENV === 'production' ? 'production' : 'sandbox', + environment: 'sandbox', + // environment: process.env.NODE_ENV === 'production' ? 'production' : 'sandbox', }); } return defaultIAPVerifier;