feat: responsive payment

This commit is contained in:
Nevo David 2025-12-26 19:43:55 +07:00
parent f98ae083ab
commit 6f889d42c8
22 changed files with 139 additions and 98 deletions

View File

@ -53,7 +53,7 @@ export const EmbeddedBilling: FC<{
}
return (
<div className="flex flex-col w-full pt-[24px] billing-form flex-1">
<div className="flex flex-col w-full pt-[48px] billing-form flex-1 tablet:pt-0">
<CheckoutProvider
stripe={stripe}
options={{
@ -124,20 +124,41 @@ const StripeInputs = () => {
return (
<>
<div>
<h4 className="mb-[8px] text-[24px]">
{checkout.type === 'loading' ? '' : t('billing_billing_address', 'Billing Address')}
<h4 className="mb-[32px] text-[24px] font-[700]">
{checkout.type === 'loading'
? ''
: t('billing_billing_address', 'Billing Address')}
</h4>
<BillingAddressElement />
</div>
<div>
<h4 className="mt-[20px] mb-[8px] text-[24px]">
<h4 className="mt-[40px] mb-[32px] text-[24px] font-[700]">
{checkout.type === 'loading' ? '' : t('billing_payment', 'Payment')}
</h4>
<PaymentElement id="payment-element" options={{ layout: 'tabs' }} />
{checkout.type === 'loading' ? null : (
<div className="mt-[24px] flex gap-[10px]">
<div>{t('billing_powered_by_stripe', 'Secure payments processed by Stripe')}</div>
<Image src="/stripe.svg" alt="Stripe" width={20} height={20} />
<div className="mt-[24px] text-[16px] font-[600] flex gap-[4px] items-center">
<div>
{t(
'billing_powered_by_stripe',
'Secure payments processed by'
)}
</div>
<svg
className="mt-[4px]"
xmlns="http://www.w3.org/2000/svg"
width="47"
height="20"
viewBox="0 0 47 20"
fill="none"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M45.9725 11.0075H39.7596C39.906 12.4952 40.9929 12.9731 42.2262 12.9731C43.4904 12.9731 44.5079 12.6879 45.3481 12.2408V14.8C44.2819 15.4135 43.0618 15.7078 41.8331 15.6479C38.7421 15.6479 36.5683 13.7208 36.5683 9.88208C36.5683 6.65229 38.4106 4.08542 41.4246 4.08542C44.4463 4.08542 46.0187 6.61375 46.0187 9.86667C46.0187 10.175 45.9879 10.8379 45.9725 11.0075ZM41.4092 6.67542C40.6152 6.67542 39.7365 7.23812 39.7365 8.66417H43.0125C43.0125 7.23812 42.1877 6.67542 41.4092 6.67542ZM31.5656 15.6479C30.4556 15.6479 29.7773 15.1854 29.3302 14.8462L29.3148 18.4152L26.139 19.0858V4.29354H29.0373L29.099 5.07979C29.7712 4.44215 30.6622 4.0863 31.5887 4.08542C33.8242 4.08542 35.9208 6.08958 35.9208 9.78958C35.9208 13.821 33.8396 15.6479 31.5656 15.6479ZM30.8333 6.89896C30.101 6.89896 29.6462 7.16104 29.3148 7.52333L29.3302 12.2408C29.6385 12.58 30.0856 12.8421 30.8333 12.8421C32.005 12.8421 32.7912 11.5702 32.7912 9.85896C32.7912 8.20167 31.9896 6.89896 30.8333 6.89896ZM21.7683 4.29354H24.9519V15.4244H21.7683V4.29354ZM21.7683 0.670625L24.9519 0V2.59L21.7683 3.26833V0.678333V0.670625ZM18.4383 7.87792V15.4244H15.2625V4.29354H18.1146L18.2071 5.23396C18.9779 3.86958 20.5735 4.14708 20.9975 4.29354V7.215C20.5967 7.08396 19.2323 6.88354 18.4383 7.87792ZM11.8477 11.5162C11.8477 13.3894 13.8519 12.8112 14.2527 12.6417V15.2317C13.8287 15.4629 13.0656 15.6479 12.025 15.6479C11.5913 15.6606 11.1595 15.5849 10.756 15.4254C10.3525 15.2659 9.98559 15.026 9.6777 14.7203C9.36981 14.4146 9.12733 14.0494 8.96502 13.647C8.8027 13.2446 8.72395 12.8134 8.73354 12.3796L8.74125 2.22771L11.84 1.56479V4.29354H14.2604V7.01458H11.8477V11.524V11.5162ZM8.06292 12.0558C8.06292 14.3452 6.28229 15.6479 3.64604 15.6479C2.46306 15.647 1.29288 15.403 0.208125 14.931V11.9017C1.27188 12.4798 2.59771 12.9115 3.64604 12.9115C4.35521 12.9115 4.82542 12.7265 4.82542 12.1406C4.82542 10.6144 0 11.1848 0 7.66979C0 5.42667 1.7575 4.08542 4.33208 4.08542C5.38042 4.08542 6.42875 4.23958 7.48479 4.66354V7.65438C6.50888 7.14076 5.42694 6.86103 4.32438 6.83729C3.66146 6.83729 3.21438 7.03 3.21438 7.53104C3.21438 8.95708 8.06292 8.27875 8.06292 12.0635V12.0558Z"
fill="#635BFF"
/>
</svg>
</div>
)}
</div>
@ -153,29 +174,38 @@ const SubmitBar: FC<{ loading: boolean }> = ({ loading }) => {
}
return (
<div className="animate-fadeIn h-[92px] fixed bottom-0 w-full px-[12px] pb-[12px] left-0 bg-newBgColor z-[100]">
<div className="w-full h-full border-t border-newColColor bg-newBgColorInner px-[80px] flex gap-[32px] justify-end items-center font-[400] text-[14px] text-[#A3A3A3]">
<div className="animate-fadeIn h-[92px] mobile:h-auto fixed bottom-0 w-full px-[12px] pb-[12px] left-0 bg-newBgColor z-[100]">
<div className="w-full h-full border-t border-newColColor bg-newBgColorInner px-[80px] tablet:px-[33px] mobile:!px-[16px] flex mobile:flex-col gap-[32px] mobile:gap-[16px] justify-end items-center font-[400] text-[14px] text-[#A3A3A3] mobile:py-[16px]">
{checkout.checkout.recurring?.trial?.trialEnd ? (
<div>
{t('billing_your_7_day_trial_is', 'Your 7-day trial is')}{' '}
<span className="text-textColor font-[600]">{t('billing_100_percent_free', '100% free')}</span> {t('billing_ending', 'ending')}{' '}
<span className="text-textColor font-[600]">
{t('billing_100_percent_free', '100% free')}
</span>{' '}
{t('billing_ending', 'ending')}{' '}
<br className="hidden mobile:block" />
<span className="text-textColor font-[600]">
{dayjs(
checkout.checkout.recurring?.trial?.trialEnd * 1000
).format('MMMM D, YYYY')}{' '}
{' '}
</span>
<span className="text-textColor font-[600]">{t('billing_cancel_anytime_short', 'Cancel anytime.')}</span>
<span className="text-textColor font-[600]">
{t('billing_cancel_anytime_short', 'Cancel anytime.')}
</span>
</div>
) : null}
<div>
<Button
className="h-[42px] rounded-[10px]"
className="h-[42px] rounded-[10px] mobile:w-full"
type="submit"
loading={loading}
>
{checkout.checkout.recurring?.trial?.trialEnd
? t('billing_pay_0_start_trial', 'Pay $0 Today - Start your free trial!')
? t(
'billing_pay_0_start_trial',
'Pay $0 Today - Start your free trial!'
)
: t('billing_pay_now', 'Pay Now')}
</Button>
</div>

View File

@ -134,7 +134,7 @@ export const FAQComponent: FC = () => {
const list = useFaqList();
return (
<div>
<h3 className="text-[24px] mt-[81px] mb-[40px]">
<h3 className="text-[24px] mt-[48px] mb-[40px] tablet:mt-[80px]">
{t('frequently_asked_questions', 'Frequently Asked Questions')}
</h3>
<div className="gap-[24px] flex-col flex select-none">

View File

@ -86,9 +86,57 @@ export const FirstBillingComponent = () => {
[]
);
const JoinOver = () => {
return (
<>
<div className="text-[46px] font-[600] leading-[110%] tablet:text-[36px] mobile:!text-[30px] whitespace-pre-line text-balance">
{t('billing_join_over', 'Join Over')}{' '}
<span className="text-[#FC69FF]">
{t('billing_entrepreneurs_count', '18,000+ Entrepreneurs')}
</span>{' '}
{t('billing_who_use', 'who use')}{' '}
{t(
'billing_postiz_grow_social',
'Postiz To Grow Their Social Presence'
)}
</div>
{!!user?.allowTrial && (
<div className="flex mt-[32px] mb-[10px] gap-[15px] tablet:mt-[32px] tablet:mb-[32px] text-[16px] font-[500] mobile:flex-col">
<div className="flex gap-[8px]">
<div>
<CheckIconComponent />
</div>
<div>{t('billing_no_risk_trial', '100% No-Risk Free Trial')}</div>
</div>
<div className="flex-1 flex gap-[8px] justify-center mobile:justify-start">
<div>
<CheckIconComponent />
</div>
<div>
{t(
'billing_pay_nothing_7_days',
'Pay NOTHING for the first 7-days'
)}
</div>
</div>
<div className="flex gap-[8px]">
<div>
<CheckIconComponent />
</div>
<div>
{t('billing_cancel_anytime', 'Cancel anytime, hassle-free')}
</div>
</div>
</div>
)}
</>
);
};
return (
<div className="blurMe flex flex-1 flex-col bg-newBgColorInner pb-[60px]">
<div className="h-[92px] px-[80px] py-[20px] flex border-b border-newColColor">
<div className="blurMe flex flex-1 flex-col bg-newBgColorInner pb-[60px] mobile:pb-[100px]">
<div className="h-[92px] px-[80px] tablet:px-[32px] mobile:!px-[16px] py-[20px] flex border-b border-newColColor">
<div className="flex-1 flex items-center text-textColor">
<LogoTextComponent />
</div>
@ -106,53 +154,9 @@ export const FirstBillingComponent = () => {
</div>
</div>
</div>
<div className="flex px-[80px] flex-1">
<div className="flex-1 py-[40px] flex flex-col pe-[40px]">
<div className="text-[36px] font-[600] leading-[110%] whitespace-pre-line">
{t('billing_join_over', 'Join Over')}{' '}
<span className="text-[#FC69FF]">
{t('billing_entrepreneurs_count', '18,000+ Entrepreneurs')}
</span>{' '}
{t('billing_who_use', 'who use')}
{'\n'}
{t(
'billing_postiz_grow_social',
'Postiz To Grow Their Social Presence'
)}
</div>
{!!user?.allowTrial && (
<div className="flex mt-[34px] mb-[10px]">
<div className="flex gap-[8px]">
<div>
<CheckIconComponent />
</div>
<div>
{t('billing_no_risk_trial', '100% No-Risk Free Trial')}
</div>
</div>
<div className="flex-1 flex gap-[8px] justify-center">
<div>
<CheckIconComponent />
</div>
<div>
{t(
'billing_pay_nothing_7_days',
'Pay NOTHING for the first 7-days'
)}
</div>
</div>
<div className="flex gap-[8px]">
<div>
<CheckIconComponent />
</div>
<div>
{t('billing_cancel_anytime', 'Cancel anytime, hassle-free')}
</div>
</div>
</div>
)}
<div className="flex px-[80px] tablet:px-[32px] mobile:!px-[16px] flex-1 flex-row tablet:flex-none tablet:flex-col-reverse">
<div className="flex-1 py-[40px] tablet:pt-[80px] flex flex-col pe-[40px] tablet:pe-0">
<div className="block tablet:hidden"><JoinOver /></div>
{!isLoading && data && stripe ? (
<>
<EmbeddedBilling stripe={stripe} secret={data.client_secret} />
@ -162,16 +166,17 @@ export const FirstBillingComponent = () => {
<LoadingComponent />
)}
</div>
<div className="flex flex-col ps-[40px] border-l border-newColColor py-[40px]">
<div className="flex flex-col ps-[40px] tablet:!ps-[0] border-l border-newColColor py-[40px] mobile:!pt-[24px] tablet:border-none tablet:pb-0">
<div className="top-[20px] sticky">
<div className="flex mb-[24px]">
<div className="hidden tablet:block"><JoinOver /></div>
<div className="flex mb-[24px] mobile:flex-col">
<div className="flex-1 text-[24px] font-[700]">
{t('billing_choose_plan', 'Choose a Plan')}
</div>
<div className="h-[44px] px-[6px] flex items-center justify-center gap-[12px] border border-newColColor rounded-[12px] select-none">
<div className="h-[44px] px-[6px] mobile:px-0 flex items-center justify-center mobile:justify-start gap-[12px] border border-newColColor rounded-[12px] select-none">
<div
className={clsx(
'h-[32px] rounded-[6px] text-[16px] px-[12px] flex justify-center items-center',
'h-[32px] mobile:flex-1 rounded-[6px] text-[16px] px-[12px] flex justify-center items-center',
period === 'MONTHLY'
? 'bg-boxFocused text-textItemFocused'
: 'cursor-pointer'
@ -182,7 +187,7 @@ export const FirstBillingComponent = () => {
</div>
<div
className={clsx(
'gap-[10px] h-[32px] rounded-[6px] text-[16px] px-[12px] flex justify-center items-center',
'gap-[10px] h-[32px] mobile:flex-1 rounded-[6px] text-[16px] px-[12px] flex justify-center items-center',
period === 'YEARLY'
? 'bg-boxFocused text-textItemFocused'
: 'cursor-pointer'
@ -190,30 +195,30 @@ export const FirstBillingComponent = () => {
onClick={() => setPeriod('YEARLY')}
>
<div>{t('billing_yearly', 'Yearly')}</div>
<div className="bg-[#AA0FA4] text-[white] px-[8px] rounded-[4px]">
<div className="bg-[#AA0FA4] text-[white] px-[8px] rounded-[4px] mobile:hidden">
{t('billing_20_percent_off', '20% Off')}
</div>
</div>
</div>
</div>
<div className="grid grid-cols-2 gap-[8px]">
<div className="grid grid-cols-2 gap-[8px] mobile:!grid-cols-2 tablet:grid-cols-4">
{price.map(
([key, value]) => (
<div
onClick={() => setTier(key)}
key={key}
className={clsx(
'cursor-pointer select-none w-[266px] h-[138px] p-[24px] rounded-[20px] flex flex-col',
'cursor-pointer select-none w-[266px] h-[138px] tablet:w-full tablet:h-[124px] p-[24px] tablet:p-[15px] rounded-[20px] flex flex-col',
key === tier
? 'bg-[linear-gradient(138deg,#4C27E1_9.56%,#2F007B_76.16%)] text-white'
: 'border border-newColColor'
? 'border-[1.5px] border-[#618DFF]'
: 'border-[1.5px] border-newColColor'
)}
>
<div className="text-[20px] font-[500]">
<div className="text-[20px] mobile:text-[18px] font-[500]">
{capitalize(key)}
</div>
<div className="text-[24px] font-[400]">
<span className="text-[44px] font-[600]">
<div className="text-[24px] mobile:text-[18px] font-[400]">
<span className="text-[44px] mobile:text-[30px] font-[600]">
$
{
value[
@ -230,7 +235,7 @@ export const FirstBillingComponent = () => {
[]
)}
</div>
<div className="flex flex-col mt-[54px] gap-[24px]">
<div className="flex flex-col mt-[54px] gap-[24px] tablet:mt-[40px]">
<div className="text-[24px] font-[700]">
{t('billing_features', 'Features')}
</div>
@ -321,7 +326,7 @@ export const BillingFeatures: FC<{ tier: string }> = ({ tier }) => {
};
return (
<div className="grid grid-cols-2 gap-y-[8px] gap-x-[32px]">
<div className="grid grid-cols-2 mobile:grid-cols-1 gap-y-[8px] gap-x-[32px]">
{features.map((feature) => (
<div key={feature.key} className="flex items-center gap-[8px]">
<div>
@ -334,7 +339,7 @@ export const BillingFeatures: FC<{ tier: string }> = ({ tier }) => {
>
<path
d="M11.825 0H4.84167C1.80833 0 0 1.80833 0 4.84167V11.8167C0 14.8583 1.80833 16.6667 4.84167 16.6667H11.8167C14.85 16.6667 16.6583 14.8583 16.6583 11.825V4.84167C16.6667 1.80833 14.8583 0 11.825 0ZM12.3167 6.41667L7.59167 11.1417C7.475 11.2583 7.31667 11.325 7.15 11.325C6.98333 11.325 6.825 11.2583 6.70833 11.1417L4.35 8.78333C4.10833 8.54167 4.10833 8.14167 4.35 7.9C4.59167 7.65833 4.99167 7.65833 5.23333 7.9L7.15 9.81667L11.4333 5.53333C11.675 5.29167 12.075 5.29167 12.3167 5.53333C12.5583 5.775 12.5583 6.16667 12.3167 6.41667Z"
fill="white"
fill="currentColor"
/>
</svg>
</div>

View File

@ -41,7 +41,7 @@ import { AttachToFeedbackIcon } from '@gitroom/frontend/components/new-layout/se
import { FirstBillingComponent } from '@gitroom/frontend/components/billing/first.billing.component';
const jakartaSans = Plus_Jakarta_Sans({
weight: ['600', '500'],
weight: ['600', '500', '700'],
style: ['normal', 'italic'],
subsets: ['latin'],
});

View File

@ -9,7 +9,7 @@ export const CheckIconComponent = () => {
>
<path
d="M13.2742 1.76687C5.72114 -3.89752 -3.90021 12.5553 2.93125 18.9592C4.68315 20.6017 6.79417 20.7975 9.0813 21.1959C10.475 21.4379 12.6902 21.8312 14.113 21.4755C25.5332 18.6198 20.3442 1.20854 10.339 1.20854"
stroke="#28ff12"
stroke="#00FF00"
strokeWidth="1.2"
strokeMiterlimit="10"
strokeLinecap="round"
@ -17,7 +17,7 @@ export const CheckIconComponent = () => {
/>
<path
d="M6.00586 11.2722C7.2516 12.5171 8.10319 14.104 9.22067 15.4652C9.75676 16.1175 10.0671 15.3361 10.1988 15.0462C11.4308 12.3359 14.0548 11.1902 16.0692 9.17578"
stroke="#28ff12"
stroke="#00FF00"
strokeWidth="1.2"
strokeMiterlimit="10"
strokeLinecap="round"

View File

@ -228,6 +228,12 @@ module.exports = {
},
}),
screens: {
mobile: {
raw: '(max-width: 1025px)',
},
tablet: {
raw: '(max-width: 1300px)',
},
iconBreak: {
raw: '(max-width: 1560px)',
},

View File

@ -532,7 +532,7 @@ checksums:
billing_ai_videos_per_month: c786199d8dc9bded54fab8f92c350b19
billing_billing_address: 48980a775bfc7292b0c4f9b74b4d352e
billing_payment: 95142d3fd8b6a6f551aba771842e9c11
billing_powered_by_stripe: c7c2723003ae04f17ae0c5bee195aeb6
billing_powered_by_stripe: f2767a22c2cd93d4e8fe5c5d6ee05ad1
billing_your_7_day_trial_is: 4b59fb559f5fd520668974e909e3479c
billing_100_percent_free: 6616fd6ee152264c06dd2537f6347e66
billing_ending: f66133a14aa7d86ea2453df97de12cd5

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "فيديوهات بالذكاء الاصطناعي شهريًا",
"billing_billing_address": "عنوان الفاتورة",
"billing_payment": "الدفع",
"billing_powered_by_stripe": "مدفوعات آمنة تتم معالجتها عبر سترايب",
"billing_powered_by_stripe": "مدفوعات آمنة تتم معالجتها بواسطة",
"billing_your_7_day_trial_is": "فترة التجربة المجانية لمدة 7 أيام الخاصة بك هي",
"billing_100_percent_free": "مجانية 100%",
"billing_ending": "تنتهي",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "প্রতি মাসে এআই ভিডিও",
"billing_billing_address": "বিলিং ঠিকানা",
"billing_payment": "পেমেন্ট",
"billing_powered_by_stripe": "নিরাপদ পেমেন্ট Stripe দ্বারা প্রক্রিয়াজাত করা হয়",
"billing_powered_by_stripe": "নিরাপদ পেমেন্ট প্রক্রিয়াকরণ করেছে",
"billing_your_7_day_trial_is": "আপনার দিনের ট্রায়াল",
"billing_100_percent_free": "১০০% ফ্রি",
"billing_ending": "শেষ হচ্ছে",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "KI-Videos pro Monat",
"billing_billing_address": "Rechnungsadresse",
"billing_payment": "Zahlung",
"billing_powered_by_stripe": "Sichere Zahlungen, abgewickelt von Stripe",
"billing_powered_by_stripe": "Sichere Zahlungen abgewickelt von",
"billing_your_7_day_trial_is": "Ihre 7-tägige Testphase ist",
"billing_100_percent_free": "100% kostenlos",
"billing_ending": "endet",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "AI Videos per month",
"billing_billing_address": "Billing Address",
"billing_payment": "Payment",
"billing_powered_by_stripe": "Secure payments processed by Stripe",
"billing_powered_by_stripe": "Secure payments processed by",
"billing_your_7_day_trial_is": "Your 7-day trial is",
"billing_100_percent_free": "100% free",
"billing_ending": "ending",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Videos de IA por mes",
"billing_billing_address": "Dirección de facturación",
"billing_payment": "Pago",
"billing_powered_by_stripe": "Pagos seguros procesados por Stripe",
"billing_powered_by_stripe": "Pagos seguros procesados por",
"billing_your_7_day_trial_is": "Tu prueba de 7 días es",
"billing_100_percent_free": "100% gratis",
"billing_ending": "finaliza",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Vidéos IA par mois",
"billing_billing_address": "Adresse de facturation",
"billing_payment": "Paiement",
"billing_powered_by_stripe": "Paiements sécurisés traités par Stripe",
"billing_powered_by_stripe": "Paiements sécurisés traités par",
"billing_your_7_day_trial_is": "Votre essai de 7 jours est",
"billing_100_percent_free": "100% gratuit",
"billing_ending": "se termine",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "סרטוני בינה מלאכותית בחודש",
"billing_billing_address": "כתובת לחיוב",
"billing_payment": "תשלום",
"billing_powered_by_stripe": "תשלומים מאובטחים מעובדים על ידי Stripe",
"billing_powered_by_stripe": "תשלומים מאובטחים מעובדים על ידי",
"billing_your_7_day_trial_is": "תקופת הניסיון שלך ל-7 ימים היא",
"billing_100_percent_free": "100% חינם",
"billing_ending": "מסתיימת",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Video AI al mese",
"billing_billing_address": "Indirizzo di fatturazione",
"billing_payment": "Pagamento",
"billing_powered_by_stripe": "Pagamenti sicuri elaborati da Stripe",
"billing_powered_by_stripe": "Pagamenti sicuri elaborati da",
"billing_your_7_day_trial_is": "La tua prova di 7 giorni è",
"billing_100_percent_free": "100% gratuita",
"billing_ending": "in scadenza",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "月あたりのAI動画数",
"billing_billing_address": "請求先住所",
"billing_payment": "支払い",
"billing_powered_by_stripe": "Stripeによって処理される安全な支払い",
"billing_powered_by_stripe": "安全な支払いはによって処理されています",
"billing_your_7_day_trial_is": "7日間の無料トライアルは",
"billing_100_percent_free": "完全に無料",
"billing_ending": "終了します",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "월별 AI 비디오",
"billing_billing_address": "청구 주소",
"billing_payment": "결제",
"billing_powered_by_stripe": "Stripe를 통한 안전한 결제가 처리됩니다",
"billing_powered_by_stripe": "안전한 결제는 Stripe에서 처리됩니다",
"billing_your_7_day_trial_is": "7일 무료 체험이",
"billing_100_percent_free": "100% 무료",
"billing_ending": "종료됩니다",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Vídeos de IA por mês",
"billing_billing_address": "Endereço de cobrança",
"billing_payment": "Pagamento",
"billing_powered_by_stripe": "Pagamentos seguros processados pela Stripe",
"billing_powered_by_stripe": "Pagamentos seguros processados por",
"billing_your_7_day_trial_is": "Seu teste de 7 dias é",
"billing_100_percent_free": "100% gratuito",
"billing_ending": "terminando",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "ИИ-видео в месяц",
"billing_billing_address": "Платёжный адрес",
"billing_payment": "Платёж",
"billing_powered_by_stripe": "Безопасные платежи обрабатываются через Stripe",
"billing_powered_by_stripe": "Безопасные платежи обрабатываются с помощью",
"billing_your_7_day_trial_is": "Ваш 7-дневный пробный период",
"billing_100_percent_free": "100% бесплатно",
"billing_ending": "заканчивается",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Aylık Yapay Zeka Videoları",
"billing_billing_address": "Fatura Adresi",
"billing_payment": "Ödeme",
"billing_powered_by_stripe": "Güvenli ödemeler Stripe tarafından işlenir",
"billing_powered_by_stripe": "Güvenli ödemeler tarafından işlenir",
"billing_your_7_day_trial_is": "7 günlük deneme süreniz",
"billing_100_percent_free": "%100 ücretsiz",
"billing_ending": "sona eriyor",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "Video AI mỗi tháng",
"billing_billing_address": "Địa chỉ thanh toán",
"billing_payment": "Thanh toán",
"billing_powered_by_stripe": "Thanh toán an toàn được xử lý bởi Stripe",
"billing_powered_by_stripe": "Thanh toán an toàn được xử lý bởi",
"billing_your_7_day_trial_is": "Dùng thử 7 ngày của bạn là",
"billing_100_percent_free": "Miễn phí 100%",
"billing_ending": "kết thúc",

View File

@ -528,7 +528,7 @@
"billing_ai_videos_per_month": "每月AI视频数",
"billing_billing_address": "账单地址",
"billing_payment": "付款",
"billing_powered_by_stripe": "安全支付由Stripe处理",
"billing_powered_by_stripe": "安全支付由 Stripe 处理",
"billing_your_7_day_trial_is": "您的7天试用期",
"billing_100_percent_free": "100%免费",
"billing_ending": "即将结束",