chore: add legal links in about window and user page (#1700)

This commit is contained in:
Huang Xin
2025-07-29 00:19:45 +08:00
committed by GitHub
parent b9add62ba7
commit 33b2ba1609
25 changed files with 99 additions and 23 deletions
+1 -1
View File
@@ -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",
@@ -474,5 +474,7 @@
"Failed to load subscription plans.": "فشل في تحميل خطط الاشتراك.",
"year": "سنة",
"Failed to create checkout session": "فشل في إنشاء جلسة الدفع",
"Storage": "التخزين"
"Storage": "التخزين",
"Terms of Service": "شروط الخدمة",
"Privacy Policy": "سياسة الخصوصية"
}
@@ -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"
}
@@ -458,5 +458,7 @@
"Failed to load subscription plans.": "Αποτυχία φόρτωσης σχεδίων συνδρομής.",
"year": "έτος",
"Failed to create checkout session": "Αποτυχία δημιουργίας συνεδρίας πληρωμής",
"Storage": "Αποθήκευση"
"Storage": "Αποθήκευση",
"Terms of Service": "Όροι χρήσης",
"Privacy Policy": "Πολιτική απορρήτου"
}
@@ -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"
}
@@ -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é"
}
@@ -458,5 +458,7 @@
"Failed to load subscription plans.": "सदस्यता योजनाएँ लोड करने में विफल।",
"year": "वर्ष",
"Failed to create checkout session": "चेकआउट सत्र बनाने में विफल",
"Storage": "भंडारण"
"Storage": "भंडारण",
"Terms of Service": "सेवा की शर्तें",
"Privacy Policy": "गोपनीयता नीति"
}
@@ -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"
}
@@ -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"
}
@@ -454,5 +454,7 @@
"Failed to load subscription plans.": "サブスクリプションプランの読み込みに失敗しました。",
"year": "年",
"Failed to create checkout session": "チェックアウトセッションの作成に失敗しました",
"Storage": "ストレージ"
"Storage": "ストレージ",
"Terms of Service": "利用規約",
"Privacy Policy": "プライバシーポリシー"
}
@@ -454,5 +454,7 @@
"Failed to load subscription plans.": "구독 플랜 로드에 실패했습니다.",
"year": "년",
"Failed to create checkout session": "체크아웃 세션 생성 실패",
"Storage": "저장소"
"Storage": "저장소",
"Terms of Service": "서비스 약관",
"Privacy Policy": "개인정보 보호정책"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -466,5 +466,7 @@
"Failed to load subscription plans.": "Не удалось загрузить планы подписки.",
"year": "год",
"Failed to create checkout session": "Не удалось создать сессию оформления заказа",
"Storage": "Хранилище"
"Storage": "Хранилище",
"Terms of Service": "Условия использования",
"Privacy Policy": "Политика конфиденциальности"
}
@@ -454,5 +454,7 @@
"Failed to load subscription plans.": "ไม่สามารถโหลดแผนการสมัครสมาชิกได้",
"year": "ปี",
"Failed to create checkout session": "ไม่สามารถสร้างเซสชันการชำระเงินได้",
"Storage": "พื้นที่เก็บข้อมูล"
"Storage": "พื้นที่เก็บข้อมูล",
"Terms of Service": "ข้อกำหนดในการให้บริการ",
"Privacy Policy": "นโยบายความเป็นส่วนตัว"
}
@@ -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ı"
}
@@ -466,5 +466,7 @@
"Failed to load subscription plans.": "Не вдалося завантажити плани підписки.",
"year": "рік",
"Failed to create checkout session": "Не вдалося створити сесію оформлення замовлення",
"Storage": "Сховище"
"Storage": "Сховище",
"Terms of Service": "Умови обслуговування",
"Privacy Policy": "Політика конфіденційності"
}
@@ -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"
}
@@ -454,5 +454,7 @@
"Failed to load subscription plans.": "加载订阅计划失败。",
"year": "年",
"Failed to create checkout session": "创建结账会话失败",
"Storage": "云同步空间"
"Storage": "云同步空间",
"Terms of Service": "服务条款",
"Privacy Policy": "隐私政策"
}
@@ -454,5 +454,7 @@
"Failed to load subscription plans.": "加載訂閱計劃失敗。",
"year": "年",
"Failed to create checkout session": "創建結帳會話失敗",
"Storage": "雲同步空間"
"Storage": "雲同步空間",
"Terms of Service": "服務條款",
"Privacy Policy": "隱私政策"
}
+2
View File
@@ -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}
/>
</div>
<LegalLinks />
</div>
</div>
)}
@@ -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 = () => {
<p className='text-neutral-content text-sm'>
© {new Date().getFullYear()} Bilingify LLC. All rights reserved.
</p>
<p className='text-neutral-content mt-2 text-xs'>
This software is licensed under the{' '}
<Link
@@ -140,6 +142,8 @@ export const AboutWindow = () => {
</Link>
.
</p>
<LegalLinks />
</div>
</div>
</Dialog>
@@ -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 (
<div className='my-2 flex flex-wrap justify-center gap-4 text-xs'>
<Link href={termsUrl} className='text-blue-500 underline hover:text-blue-600'>
{_('Terms of Service')}
</Link>
<Link
href='https://readest.com/privacy-policy'
className='text-blue-500 underline hover:text-blue-600'
>
{_('Privacy Policy')}
</Link>
</div>
);
};
export default LegalLinks;
@@ -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;