@neko-os/rc-subscription 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +142 -0
  2. package/dist/config.js +5 -0
  3. package/dist/containers/SubscriptionHandler.js +75 -0
  4. package/dist/containers/SubscriptionRequired.js +11 -0
  5. package/dist/containers/SubscriptionRequiredCTA.js +37 -0
  6. package/dist/containers/paywall/Paywall.js +130 -0
  7. package/dist/containers/paywall/PaywallFeatures.js +42 -0
  8. package/dist/containers/paywall/PaywallFooter.js +16 -0
  9. package/dist/containers/paywall/PaywallHero.js +33 -0
  10. package/dist/containers/paywall/PaywallPlanCard.js +71 -0
  11. package/dist/containers/paywall/PaywallReturnIcon.js +8 -0
  12. package/dist/containers/paywall/_request/usePaywallActions.js +39 -0
  13. package/dist/index.js +6 -0
  14. package/dist/locales/cs.js +30 -0
  15. package/dist/locales/da.js +30 -0
  16. package/dist/locales/de.js +30 -0
  17. package/dist/locales/el.js +30 -0
  18. package/dist/locales/en.js +30 -0
  19. package/dist/locales/es.js +30 -0
  20. package/dist/locales/fi.js +30 -0
  21. package/dist/locales/fr.js +30 -0
  22. package/dist/locales/hi.js +30 -0
  23. package/dist/locales/hu.js +30 -0
  24. package/dist/locales/id.js +30 -0
  25. package/dist/locales/index.js +63 -0
  26. package/dist/locales/it.js +30 -0
  27. package/dist/locales/ja.js +30 -0
  28. package/dist/locales/ko.js +30 -0
  29. package/dist/locales/nl.js +30 -0
  30. package/dist/locales/no.js +30 -0
  31. package/dist/locales/pl.js +30 -0
  32. package/dist/locales/pt.js +30 -0
  33. package/dist/locales/ro.js +30 -0
  34. package/dist/locales/ru.js +30 -0
  35. package/dist/locales/sv.js +30 -0
  36. package/dist/locales/th.js +30 -0
  37. package/dist/locales/tr.js +30 -0
  38. package/dist/locales/uk.js +30 -0
  39. package/dist/locales/vi.js +30 -0
  40. package/dist/locales/zh.js +30 -0
  41. package/dist/views/active/ActiveSubscriptionView.js +51 -0
  42. package/package.json +53 -0
  43. package/src/config.js +5 -0
  44. package/src/containers/SubscriptionHandler.js +75 -0
  45. package/src/containers/SubscriptionRequired.js +11 -0
  46. package/src/containers/SubscriptionRequiredCTA.js +37 -0
  47. package/src/containers/paywall/Paywall.js +130 -0
  48. package/src/containers/paywall/PaywallFeatures.js +42 -0
  49. package/src/containers/paywall/PaywallFooter.js +16 -0
  50. package/src/containers/paywall/PaywallHero.js +33 -0
  51. package/src/containers/paywall/PaywallPlanCard.js +71 -0
  52. package/src/containers/paywall/PaywallReturnIcon.js +8 -0
  53. package/src/containers/paywall/_request/usePaywallActions.js +39 -0
  54. package/src/index.js +6 -0
  55. package/src/locales/cs.js +30 -0
  56. package/src/locales/da.js +30 -0
  57. package/src/locales/de.js +30 -0
  58. package/src/locales/el.js +30 -0
  59. package/src/locales/en.js +30 -0
  60. package/src/locales/es.js +30 -0
  61. package/src/locales/fi.js +30 -0
  62. package/src/locales/fr.js +30 -0
  63. package/src/locales/hi.js +30 -0
  64. package/src/locales/hu.js +30 -0
  65. package/src/locales/id.js +30 -0
  66. package/src/locales/index.js +63 -0
  67. package/src/locales/it.js +30 -0
  68. package/src/locales/ja.js +30 -0
  69. package/src/locales/ko.js +30 -0
  70. package/src/locales/nl.js +30 -0
  71. package/src/locales/no.js +30 -0
  72. package/src/locales/pl.js +30 -0
  73. package/src/locales/pt.js +30 -0
  74. package/src/locales/ro.js +30 -0
  75. package/src/locales/ru.js +30 -0
  76. package/src/locales/sv.js +30 -0
  77. package/src/locales/th.js +30 -0
  78. package/src/locales/tr.js +30 -0
  79. package/src/locales/uk.js +30 -0
  80. package/src/locales/vi.js +30 -0
  81. package/src/locales/zh.js +30 -0
  82. package/src/views/active/ActiveSubscriptionView.js +51 -0
@@ -0,0 +1,71 @@
1
+ import { Card, Link, Radio, Tag, Text, View, useTranslation } from '@neko-os/ui'
2
+
3
+ const TYPE_LABELS = {
4
+ MONTHLY: 'monthly',
5
+ ANNUAL: 'yearly',
6
+ LIFETIME: 'lifetime',
7
+ }
8
+
9
+ function getTrialDays(introPrice) {
10
+ if (!introPrice || introPrice.price > 0) return null
11
+ const units = introPrice.periodNumberOfUnits || 0
12
+ const unit = introPrice.periodUnit?.toUpperCase()
13
+ if (unit === 'DAY') return units
14
+ if (unit === 'WEEK') return units * 7
15
+ if (unit === 'MONTH') return units * 30
16
+ return units
17
+ }
18
+
19
+ function getSavePercent(monthlyPrice, annualPrice) {
20
+ if (!monthlyPrice || !annualPrice) return null
21
+ const yearlyFromMonthly = monthlyPrice * 12
22
+ const percent = Math.round(((yearlyFromMonthly - annualPrice) / yearlyFromMonthly) * 100)
23
+ return percent > 0 ? percent : null
24
+ }
25
+
26
+ export default function PaywallPlanCard({ pkg, selected, onSelect, monthlyPrice }) {
27
+ const { t } = useTranslation('subscription')
28
+ const product = pkg.product
29
+ const typeKey = TYPE_LABELS[pkg.packageType] || pkg.packageType
30
+ const label = t('paywall.' + typeKey, { defaultValue: typeKey })
31
+
32
+ const trialDays = getTrialDays(product.introPrice)
33
+ const savePercent = pkg.packageType === 'ANNUAL' ? getSavePercent(monthlyPrice, product.price) : null
34
+
35
+ return (
36
+ <Link onPress={() => onSelect(pkg)}>
37
+ <Card
38
+ row
39
+ centerV
40
+ padding="md"
41
+ gap="md"
42
+ bg={selected ? 'primary_op10' : 'overlayBG'}
43
+ borderColor={selected ? 'primary' : 'divider'}
44
+ border
45
+ minH="xxl"
46
+ >
47
+ <Radio xs value={selected} />
48
+
49
+ <View flex gap="xxs">
50
+ <View row centerV gap="xs">
51
+ <Text strong>{label}</Text>
52
+ {savePercent && <Tag primary label={t('paywall.save', { percent: savePercent })} fill />}
53
+ {trialDays && <Tag green label={t('paywall.freeTrial', { count: trialDays })} />}
54
+ </View>
55
+ {pkg.packageType === 'ANNUAL' && product.pricePerMonthString && (
56
+ <Text xs text3>
57
+ {t('paywall.perMonth', { price: product.pricePerMonthString })}
58
+ </Text>
59
+ )}
60
+ {product.introPrice && product.introPrice.price > 0 && (
61
+ <Text xs text3>
62
+ {product.introPrice.priceString} intro
63
+ </Text>
64
+ )}
65
+ </View>
66
+
67
+ <Text strong>{product.priceString}</Text>
68
+ </Card>
69
+ </Link>
70
+ )
71
+ }
@@ -0,0 +1,8 @@
1
+ import { Button } from '@neko-os/ui'
2
+ import { useNavigation } from '@react-navigation/native'
3
+
4
+ export default function PaywallReturnIcon({ modal }) {
5
+ const { goBack } = useNavigation()
6
+
7
+ return <Button icon={modal ? 'close-line' : 'arrow-left-line'} ratio={1} xs color="mainBG" round onPress={goBack} />
8
+ }
@@ -0,0 +1,39 @@
1
+ import { Alert } from 'react-native'
2
+ import { useTranslation } from '@neko-os/ui'
3
+ import { useState } from 'react'
4
+ import Purchases from 'react-native-purchases'
5
+
6
+ import { useSubscription } from '../../SubscriptionHandler'
7
+
8
+ export default function usePaywallActions() {
9
+ const { t } = useTranslation('subscription')
10
+ const { refresh } = useSubscription()
11
+ const [loading, setLoading] = useState(false)
12
+
13
+ async function handlePurchase(pkg) {
14
+ if (!pkg || loading) return
15
+ setLoading(true)
16
+ try {
17
+ await Purchases.purchasePackage(pkg)
18
+ } catch (e) {
19
+ if (!e.userCancelled) Alert.alert(t('paywall.errorTitle', { defaultValue: 'Error' }), e.message)
20
+ } finally {
21
+ setLoading(false)
22
+ }
23
+ }
24
+
25
+ async function handleRestore() {
26
+ if (loading) return
27
+ setLoading(true)
28
+ try {
29
+ await Purchases.restorePurchases()
30
+ await refresh()
31
+ } catch (e) {
32
+ Alert.alert(t('paywall.errorTitle', { defaultValue: 'Error' }), e.message)
33
+ } finally {
34
+ setLoading(false)
35
+ }
36
+ }
37
+
38
+ return { handlePurchase, handleRestore, loading }
39
+ }
package/src/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { registerSubscriptionLocales } from './locales/index'
2
+ export { default as SubscriptionHandler, useIsSubscribed, useSubscription } from './containers/SubscriptionHandler'
3
+ export { default as SubscriptionRequired } from './containers/SubscriptionRequired'
4
+ export { default as SubscriptionRequiredCTA } from './containers/SubscriptionRequiredCTA'
5
+ export { default as Paywall } from './containers/paywall/Paywall'
6
+ export { default as ActiveSubscriptionView } from './views/active/ActiveSubscriptionView'
@@ -0,0 +1,30 @@
1
+ export const subscriptionCS = {
2
+ settings: {
3
+ linkLabel: 'Predplatne',
4
+ },
5
+ paywall: {
6
+ title: 'Prejdi na Premium',
7
+ subtitle: 'Odemkni vsechny funkce',
8
+ cta: 'Pokracovat',
9
+ ctaTrial: 'Zahajit zkusebni obdobi',
10
+ restore: 'Obnovit nakupy',
11
+ monthly: 'Mesicne',
12
+ yearly: 'Rocne',
13
+ lifetime: 'Dozivotne',
14
+ perMonth: '{{price}}/mes.',
15
+ save: 'Usetri {{percent}} %',
16
+ freeTrial: '{{count}} dni zdarma',
17
+ free: 'Zdarma',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Odemknout plny pristup',
22
+ },
23
+ active: {
24
+ title: 'Predplatne',
25
+ plan: 'Plan',
26
+ expires: 'Vyprsi',
27
+ lifetime: 'Dozivotni pristup',
28
+ manage: 'Spravovat predplatne',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionDA = {
2
+ settings: {
3
+ linkLabel: 'Abonnement',
4
+ },
5
+ paywall: {
6
+ title: 'Bliv Premium',
7
+ subtitle: 'Las alle funktioner op',
8
+ cta: 'Fortsaet',
9
+ ctaTrial: 'Start gratis proveperiode',
10
+ restore: 'Gendan kob',
11
+ monthly: 'Manedligt',
12
+ yearly: 'Arligt',
13
+ lifetime: 'Livstid',
14
+ perMonth: '{{price}}/md.',
15
+ save: 'Spar {{percent}} %',
16
+ freeTrial: '{{count}} dage gratis',
17
+ free: 'Gratis',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Las fuld adgang op',
22
+ },
23
+ active: {
24
+ title: 'Abonnement',
25
+ plan: 'Plan',
26
+ expires: 'Udlober',
27
+ lifetime: 'Livstidsadgang',
28
+ manage: 'Administrer abonnement',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionDE = {
2
+ settings: {
3
+ linkLabel: 'Abonnement',
4
+ },
5
+ paywall: {
6
+ title: 'Premium holen',
7
+ subtitle: 'Alle Funktionen freischalten',
8
+ cta: 'Weiter',
9
+ ctaTrial: 'Kostenlos testen',
10
+ restore: 'Kaeufe wiederherstellen',
11
+ monthly: 'Monatlich',
12
+ yearly: 'Jaehrlich',
13
+ lifetime: 'Lebenslang',
14
+ perMonth: '{{price}}/Monat',
15
+ save: '{{percent}} % sparen',
16
+ freeTrial: '{{count}} Tage kostenlos',
17
+ free: 'Kostenlos',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Vollen Zugang freischalten',
22
+ },
23
+ active: {
24
+ title: 'Abonnement',
25
+ plan: 'Tarif',
26
+ expires: 'Laeuft ab',
27
+ lifetime: 'Lebenslanger Zugang',
28
+ manage: 'Abonnement verwalten',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionEL = {
2
+ settings: {
3
+ linkLabel: 'Syndromi',
4
+ },
5
+ paywall: {
6
+ title: 'Apokti to Premium',
7
+ subtitle: 'Xekleidose oles tis dynatotites',
8
+ cta: 'Synecheia',
9
+ ctaTrial: 'Enarxi dorean dokimis',
10
+ restore: 'Epanafora agoron',
11
+ monthly: 'Miniaia',
12
+ yearly: 'Etisia',
13
+ lifetime: 'Dia viou',
14
+ perMonth: '{{price}}/mina',
15
+ save: 'Exoikonomisi {{percent}}%',
16
+ freeTrial: '{{count}} imeres dorean',
17
+ free: 'Dorean',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Xekleidoma plirous prosvasis',
22
+ },
23
+ active: {
24
+ title: 'Syndromi',
25
+ plan: 'Plano',
26
+ expires: 'Ligei',
27
+ lifetime: 'Dia viou prosvasi',
28
+ manage: 'Diacheirisi syndromis',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionEN = {
2
+ settings: {
3
+ linkLabel: 'Subscription',
4
+ },
5
+ paywall: {
6
+ title: 'Unlock Full Access',
7
+ subtitle: 'Track your habits without limits',
8
+ cta: 'Continue',
9
+ ctaTrial: 'Start free trial',
10
+ restore: 'Restore purchases',
11
+ monthly: 'Monthly',
12
+ yearly: 'Yearly',
13
+ lifetime: 'Lifetime',
14
+ perMonth: '{{price}}/mo',
15
+ save: 'Save {{percent}}%',
16
+ freeTrial: '{{count}} days free',
17
+ free: 'Free',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Unlock full access',
22
+ },
23
+ active: {
24
+ title: 'Subscription',
25
+ plan: 'Plan',
26
+ expires: 'Expires',
27
+ lifetime: 'Lifetime access',
28
+ manage: 'Manage subscription',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionES = {
2
+ settings: {
3
+ linkLabel: 'Suscripcion',
4
+ },
5
+ paywall: {
6
+ title: 'Hazte Premium',
7
+ subtitle: 'Desbloquea todas las funciones',
8
+ cta: 'Continuar',
9
+ ctaTrial: 'Iniciar prueba gratuita',
10
+ restore: 'Restaurar compras',
11
+ monthly: 'Mensual',
12
+ yearly: 'Anual',
13
+ lifetime: 'De por vida',
14
+ perMonth: '{{price}}/mes',
15
+ save: 'Ahorra {{percent}} %',
16
+ freeTrial: '{{count}} dias gratis',
17
+ free: 'Gratis',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Desbloquear acceso completo',
22
+ },
23
+ active: {
24
+ title: 'Suscripcion',
25
+ plan: 'Plan',
26
+ expires: 'Expira',
27
+ lifetime: 'Acceso de por vida',
28
+ manage: 'Gestionar suscripcion',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionFI = {
2
+ settings: {
3
+ linkLabel: 'Tilaus',
4
+ },
5
+ paywall: {
6
+ title: 'Hanki Premium',
7
+ subtitle: 'Avaa kaikki ominaisuudet',
8
+ cta: 'Jatka',
9
+ ctaTrial: 'Aloita ilmainen kokeilu',
10
+ restore: 'Palauta ostokset',
11
+ monthly: 'Kuukausittain',
12
+ yearly: 'Vuosittain',
13
+ lifetime: 'Elinaika',
14
+ perMonth: '{{price}}/kk',
15
+ save: 'Saaesta {{percent}} %',
16
+ freeTrial: '{{count}} paeivaea ilmaiseksi',
17
+ free: 'Ilmainen',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Avaa taeysi paeaesy',
22
+ },
23
+ active: {
24
+ title: 'Tilaus',
25
+ plan: 'Paketti',
26
+ expires: 'Paeattyy',
27
+ lifetime: 'Elinikaeinen paeaesy',
28
+ manage: 'Hallitse tilausta',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionFR = {
2
+ settings: {
3
+ linkLabel: 'Abonnement',
4
+ },
5
+ paywall: {
6
+ title: 'Passer Premium',
7
+ subtitle: 'Debloquer toutes les fonctionnalites',
8
+ cta: 'Continuer',
9
+ ctaTrial: 'Demarrer l\'essai gratuit',
10
+ restore: 'Restaurer les achats',
11
+ monthly: 'Mensuel',
12
+ yearly: 'Annuel',
13
+ lifetime: 'A vie',
14
+ perMonth: '{{price}}/mois',
15
+ save: 'Economisez {{percent}} %',
16
+ freeTrial: '{{count}} jours gratuits',
17
+ free: 'Gratuit',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Debloquer l\'acces complet',
22
+ },
23
+ active: {
24
+ title: 'Abonnement',
25
+ plan: 'Forfait',
26
+ expires: 'Expire',
27
+ lifetime: 'Acces a vie',
28
+ manage: 'Gerer l\'abonnement',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionHI = {
2
+ settings: {
3
+ linkLabel: 'Sadasayata',
4
+ },
5
+ paywall: {
6
+ title: 'Premium paaen',
7
+ subtitle: 'Sabhee suvidhaen kholeen',
8
+ cta: 'Jaree rakhen',
9
+ ctaTrial: 'Nishulk pareekshan shuru karen',
10
+ restore: 'Khareedaaree punastaapeet karen',
11
+ monthly: 'Maaseek',
12
+ yearly: 'Vaarshik',
13
+ lifetime: 'Aajeevon',
14
+ perMonth: '{{price}}/mahina',
15
+ save: '{{percent}}% bachaen',
16
+ freeTrial: '{{count}} din nishulk',
17
+ free: 'Nishulk',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Poorn pahunch kholeen',
22
+ },
23
+ active: {
24
+ title: 'Sadasayata',
25
+ plan: 'Yojana',
26
+ expires: 'Samaapt hota hai',
27
+ lifetime: 'Aajeevon pahunch',
28
+ manage: 'Sadasayata prabandheit karen',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionHU = {
2
+ settings: {
3
+ linkLabel: 'Elofizetes',
4
+ },
5
+ paywall: {
6
+ title: 'Valts Premiumra',
7
+ subtitle: 'Minden funkcio feloldasa',
8
+ cta: 'Folytatas',
9
+ ctaTrial: 'Ingyenes proba inditasa',
10
+ restore: 'Vasarlasok visszaallitasa',
11
+ monthly: 'Havi',
12
+ yearly: 'Eves',
13
+ lifetime: 'Elettartam',
14
+ perMonth: '{{price}}/ho',
15
+ save: '{{percent}}% megtakaritas',
16
+ freeTrial: '{{count}} nap ingyenes',
17
+ free: 'Ingyenes',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Teljes hozzaferes feloldasa',
22
+ },
23
+ active: {
24
+ title: 'Elofizetes',
25
+ plan: 'Csomag',
26
+ expires: 'Lejar',
27
+ lifetime: 'Elettartam hozzaferes',
28
+ manage: 'Elofizetes kezelese',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionID = {
2
+ settings: {
3
+ linkLabel: 'Langganan',
4
+ },
5
+ paywall: {
6
+ title: 'Jadi Premium',
7
+ subtitle: 'Buka semua fitur',
8
+ cta: 'Lanjutkan',
9
+ ctaTrial: 'Mulai uji coba gratis',
10
+ restore: 'Pulihkan pembelian',
11
+ monthly: 'Bulanan',
12
+ yearly: 'Tahunan',
13
+ lifetime: 'Seumur hidup',
14
+ perMonth: '{{price}}/bln',
15
+ save: 'Hemat {{percent}}%',
16
+ freeTrial: '{{count}} hari gratis',
17
+ free: 'Gratis',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Buka akses penuh',
22
+ },
23
+ active: {
24
+ title: 'Langganan',
25
+ plan: 'Paket',
26
+ expires: 'Berakhir',
27
+ lifetime: 'Akses seumur hidup',
28
+ manage: 'Kelola langganan',
29
+ },
30
+ }
@@ -0,0 +1,63 @@
1
+ import { subscriptionCS } from './cs'
2
+ import { subscriptionDA } from './da'
3
+ import { subscriptionDE } from './de'
4
+ import { subscriptionEL } from './el'
5
+ import { subscriptionEN } from './en'
6
+ import { subscriptionES } from './es'
7
+ import { subscriptionFI } from './fi'
8
+ import { subscriptionFR } from './fr'
9
+ import { subscriptionHI } from './hi'
10
+ import { subscriptionHU } from './hu'
11
+ import { subscriptionID } from './id'
12
+ import { subscriptionIT } from './it'
13
+ import { subscriptionJA } from './ja'
14
+ import { subscriptionKO } from './ko'
15
+ import { subscriptionNL } from './nl'
16
+ import { subscriptionNO } from './no'
17
+ import { subscriptionPL } from './pl'
18
+ import { subscriptionPT } from './pt'
19
+ import { subscriptionRO } from './ro'
20
+ import { subscriptionRU } from './ru'
21
+ import { subscriptionSV } from './sv'
22
+ import { subscriptionTH } from './th'
23
+ import { subscriptionTR } from './tr'
24
+ import { subscriptionUK } from './uk'
25
+ import { subscriptionVI } from './vi'
26
+ import { subscriptionZH } from './zh'
27
+
28
+ const locales = {
29
+ cs: subscriptionCS,
30
+ da: subscriptionDA,
31
+ de: subscriptionDE,
32
+ el: subscriptionEL,
33
+ en: subscriptionEN,
34
+ es: subscriptionES,
35
+ fi: subscriptionFI,
36
+ fr: subscriptionFR,
37
+ hi: subscriptionHI,
38
+ hu: subscriptionHU,
39
+ id: subscriptionID,
40
+ it: subscriptionIT,
41
+ ja: subscriptionJA,
42
+ ko: subscriptionKO,
43
+ nl: subscriptionNL,
44
+ no: subscriptionNO,
45
+ pl: subscriptionPL,
46
+ pt: subscriptionPT,
47
+ ro: subscriptionRO,
48
+ ru: subscriptionRU,
49
+ sv: subscriptionSV,
50
+ th: subscriptionTH,
51
+ tr: subscriptionTR,
52
+ uk: subscriptionUK,
53
+ vi: subscriptionVI,
54
+ zh: subscriptionZH,
55
+ }
56
+
57
+ export function registerSubscriptionLocales(i18n) {
58
+ Object.entries(locales).forEach(([lang, data]) => {
59
+ if (i18n.resources[lang]) {
60
+ i18n.addResources(lang, 'subscription', data)
61
+ }
62
+ })
63
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionIT = {
2
+ settings: {
3
+ linkLabel: 'Abbonamento',
4
+ },
5
+ paywall: {
6
+ title: 'Passa a Premium',
7
+ subtitle: 'Sblocca tutte le funzionalita',
8
+ cta: 'Continua',
9
+ ctaTrial: 'Inizia la prova gratuita',
10
+ restore: 'Ripristina acquisti',
11
+ monthly: 'Mensile',
12
+ yearly: 'Annuale',
13
+ lifetime: 'A vita',
14
+ perMonth: '{{price}}/mese',
15
+ save: 'Risparmia {{percent}}%',
16
+ freeTrial: '{{count}} giorni gratis',
17
+ free: 'Gratis',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Sblocca accesso completo',
22
+ },
23
+ active: {
24
+ title: 'Abbonamento',
25
+ plan: 'Piano',
26
+ expires: 'Scade',
27
+ lifetime: 'Accesso a vita',
28
+ manage: 'Gestisci abbonamento',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionJA = {
2
+ settings: {
3
+ linkLabel: 'サブスクリプション',
4
+ },
5
+ paywall: {
6
+ title: 'プレミアムにする',
7
+ subtitle: 'すべての機能を解放',
8
+ cta: '続ける',
9
+ ctaTrial: '無料トライアルを開始',
10
+ restore: '購入を復元',
11
+ monthly: '月額',
12
+ yearly: '年額',
13
+ lifetime: '買い切り',
14
+ perMonth: '{{price}}/月',
15
+ save: '{{percent}}%お得',
16
+ freeTrial: '{{count}}日間無料',
17
+ free: '無料',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'フルアクセスを解放',
22
+ },
23
+ active: {
24
+ title: 'サブスクリプション',
25
+ plan: 'プラン',
26
+ expires: '有効期限',
27
+ lifetime: '永久アクセス',
28
+ manage: 'サブスクリプションを管理',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionKO = {
2
+ settings: {
3
+ linkLabel: '구독',
4
+ },
5
+ paywall: {
6
+ title: '프리미엄으로 전환',
7
+ subtitle: '모든 기능 잠금 해제',
8
+ cta: '계속',
9
+ ctaTrial: '무료 체험 시작',
10
+ restore: '구매 복원',
11
+ monthly: '월간',
12
+ yearly: '연간',
13
+ lifetime: '평생',
14
+ perMonth: '{{price}}/월',
15
+ save: '{{percent}}% 절약',
16
+ freeTrial: '{{count}}일 무료',
17
+ free: '무료',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: '전체 액세스 잠금 해제',
22
+ },
23
+ active: {
24
+ title: '구독',
25
+ plan: '요금제',
26
+ expires: '만료',
27
+ lifetime: '평생 액세스',
28
+ manage: '구독 관리',
29
+ },
30
+ }
@@ -0,0 +1,30 @@
1
+ export const subscriptionNL = {
2
+ settings: {
3
+ linkLabel: 'Abonnement',
4
+ },
5
+ paywall: {
6
+ title: 'Ga Premium',
7
+ subtitle: 'Ontgrendel alle functies',
8
+ cta: 'Doorgaan',
9
+ ctaTrial: 'Start gratis proefperiode',
10
+ restore: 'Aankopen herstellen',
11
+ monthly: 'Maandelijks',
12
+ yearly: 'Jaarlijks',
13
+ lifetime: 'Levenslang',
14
+ perMonth: '{{price}}/mnd',
15
+ save: 'Bespaar {{percent}}%',
16
+ freeTrial: '{{count}} dagen gratis',
17
+ free: 'Gratis',
18
+ pro: 'Pro',
19
+ },
20
+ cta: {
21
+ unlock: 'Ontgrendel volledige toegang',
22
+ },
23
+ active: {
24
+ title: 'Abonnement',
25
+ plan: 'Plan',
26
+ expires: 'Verloopt',
27
+ lifetime: 'Levenslange toegang',
28
+ manage: 'Abonnement beheren',
29
+ },
30
+ }