chore: enchance copywriting in none education plan warning modal (#36201)

Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
This commit is contained in:
Joel 2026-05-15 13:08:06 +08:00 committed by GitHub
parent 3bc3386535
commit 28153df4d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 171 additions and 143 deletions

View File

@ -334,7 +334,7 @@ describe('CloudPlanItem', () => {
expect(screen.queryByText('education.planNotSupportEducationDiscount')).not.toBeInTheDocument()
})
it('should show education unsupported warning below the button without changing button text or blocking checkout', async () => {
it('should show education unsupported warning and switch checkout to professional annual', async () => {
mockUseProviderContext.mockReturnValue({
enableEducationPlan: true,
isEducationAccount: true,
@ -355,18 +355,18 @@ describe('CloudPlanItem', () => {
fireEvent.click(button)
expect(screen.getByText('education.educationPricingConfirm.title'))!.toBeInTheDocument()
expect(screen.getByText(/^education\.educationPricingConfirm\.description/))!.toBeInTheDocument()
expect(screen.queryByRole('button', { name: 'common.operation.close' }))!.not.toBeInTheDocument()
expect(screen.getByText('education.educationPricingConfirm.description'))!.toBeInTheDocument()
expect(screen.getByRole('button', { name: 'common.operation.close' }))!.toBeInTheDocument()
expect(screen.getByRole('button', { name: 'education.educationPricingConfirm.cancel' }))!.toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: 'education.educationPricingConfirm.continue' }))
await waitFor(() => {
expect(mockFetchSubscriptionUrls).toHaveBeenCalledWith(Plan.professional, 'month')
expect(mockFetchSubscriptionUrls).toHaveBeenCalledWith(Plan.professional, 'year')
expect(assignedHref).toBe('https://subscription.example')
})
})
it('should close the unsupported plan confirm without checkout when canceled', async () => {
it('should continue selected plan checkout when keeping current plan', async () => {
mockUseProviderContext.mockReturnValue({
enableEducationPlan: true,
isEducationAccount: true,
@ -384,6 +384,31 @@ describe('CloudPlanItem', () => {
fireEvent.click(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' }))
fireEvent.click(screen.getByRole('button', { name: 'education.educationPricingConfirm.cancel' }))
await waitFor(() => {
expect(screen.queryByText('education.educationPricingConfirm.title'))!.not.toBeInTheDocument()
expect(mockFetchSubscriptionUrls).toHaveBeenCalledWith(Plan.team, 'year')
expect(assignedHref).toBe('https://subscription.example')
})
})
it('should close the unsupported plan confirm without checkout when using the close button', async () => {
mockUseProviderContext.mockReturnValue({
enableEducationPlan: true,
isEducationAccount: true,
})
render(
<CloudPlanItem
plan={Plan.team}
currentPlan={Plan.sandbox}
planRange={PlanRange.yearly}
canPay
/>,
)
fireEvent.click(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' }))
fireEvent.click(screen.getByRole('button', { name: 'common.operation.close' }))
await waitFor(() => {
expect(screen.queryByText('education.educationPricingConfirm.title'))!.not.toBeInTheDocument()
})

View File

@ -1,15 +1,14 @@
'use client'
import type { FC } from 'react'
import type { BasicPlan } from '../../../type'
import { Button } from '@langgenius/dify-ui/button'
import {
AlertDialog,
AlertDialogActions,
AlertDialogCancelButton,
AlertDialogConfirmButton,
AlertDialogContent,
AlertDialogDescription,
AlertDialogTitle,
} from '@langgenius/dify-ui/alert-dialog'
Dialog,
DialogCloseButton,
DialogContent,
DialogDescription,
DialogTitle,
} from '@langgenius/dify-ui/dialog'
import { toast } from '@langgenius/dify-ui/toast'
import * as React from 'react'
import { useMemo } from 'react'
@ -24,7 +23,7 @@ import { useEducationDiscount } from '../../../hooks/use-education-discount'
import { Plan } from '../../../type'
import { Professional, Sandbox, Team } from '../../assets'
import { PlanRange } from '../../plan-switcher/plan-range-switcher'
import Button from './button'
import PlanButton from './button'
import List from './list'
const ICON_MAP = {
@ -33,10 +32,6 @@ const ICON_MAP = {
[Plan.team]: <Team />,
}
type ConfirmType = {
type: 'info' | 'warning'
}
type CloudPlanItemProps = {
currentPlan: BasicPlan
plan: BasicPlan
@ -64,15 +59,12 @@ const CloudPlanItem: FC<CloudPlanItemProps> = ({
const { enableEducationPlan, isEducationAccount } = useProviderContext()
const isEducationDiscountMode = enableEducationPlan && isEducationAccount
const isEducationDiscountSupportedPlan = plan === Plan.professional && isYear
const selectedPlanName = t(`${i18nPrefix}.name`, { ns: 'billing' })
const selectedBillingPeriod = t(`educationPricingConfirm.billingPeriod.${isYear ? 'yearly' : 'monthly'}`, { ns: 'education' })
const educationDiscountWarningText = canPay && isEducationDiscountMode && !isFreePlan && !isEducationDiscountSupportedPlan
? t('planNotSupportEducationDiscount', { ns: 'education' })
: undefined
const openAsyncWindow = useAsyncWindowOpen()
const { handleEducationDiscount, isEducationDiscountLoading } = useEducationDiscount()
const [showEducationPricingConfirm, setShowEducationPricingConfirm] = React.useState(false)
const educationPricingConfirmInfo: ConfirmType = { type: 'warning' }
const btnText = useMemo(() => {
if (canPay && isEducationDiscountMode && isEducationDiscountSupportedPlan && !isCurrent)
@ -139,16 +131,19 @@ const CloudPlanItem: FC<CloudPlanItemProps> = ({
await handlePayCurrentPlan()
}
const handleContinueCurrentPlan = async () => {
setShowEducationPricingConfirm(false)
const handleSwitchToProfessionalAnnual = async () => {
await handleEducationDiscount()
}
const handleKeepCurrentPlan = async () => {
await handlePayCurrentPlan()
setShowEducationPricingConfirm(false)
}
return (
<div className="flex min-w-0 flex-1 flex-col pb-3">
<div className="flex flex-col px-5 py-4">
<div className="flex flex-col gap-y-6 px-1 pt-10">
{ICON_MAP[plan]}
<div className="flex min-h-[104px] flex-col gap-y-2">
<div className="flex min-h-26 flex-col gap-y-2">
<div className="flex items-center gap-x-2.5">
<div className="text-[30px] leading-[1.2] font-medium text-text-primary">{t(`${i18nPrefix}.name`, { ns: 'billing' })}</div>
{
@ -188,7 +183,7 @@ const CloudPlanItem: FC<CloudPlanItemProps> = ({
</>
)}
</div>
<Button
<PlanButton
plan={plan}
isPlanDisabled={isPlanDisabled}
btnText={btnText}
@ -197,41 +192,49 @@ const CloudPlanItem: FC<CloudPlanItemProps> = ({
/>
</div>
<List plan={plan} />
<AlertDialog
<Dialog
open={showEducationPricingConfirm}
onOpenChange={setShowEducationPricingConfirm}
>
<AlertDialogContent>
<div className="flex flex-col gap-2 px-6 pt-6 pb-4">
<AlertDialogTitle className="w-full truncate title-2xl-semi-bold text-text-primary">
<DialogContent
backdropProps={{ forceRender: true }}
className="w-[520px] overflow-visible"
>
<DialogCloseButton
aria-label={t('operation.close', { ns: 'common' })}
className="top-6 right-6"
/>
<div className="flex flex-col gap-2 pr-10">
<DialogTitle className="w-full title-2xl-semi-bold text-text-primary">
{t('educationPricingConfirm.title', { ns: 'education' })}
</AlertDialogTitle>
<AlertDialogDescription className="w-full system-md-regular wrap-break-word whitespace-pre-wrap text-text-tertiary">
{t('educationPricingConfirm.description', {
ns: 'education',
planName: selectedPlanName,
billingPeriod: selectedBillingPeriod,
})}
</AlertDialogDescription>
</DialogTitle>
<DialogDescription className="w-full system-md-regular text-text-tertiary">
{t('educationPricingConfirm.description', { ns: 'education' })}
</DialogDescription>
</div>
<AlertDialogActions>
<AlertDialogCancelButton
onClick={() => setShowEducationPricingConfirm(false)}
disabled={loading}
<div className="mt-10 flex items-start justify-end gap-3">
<Button
size="large"
onClick={handleKeepCurrentPlan}
disabled={loading || isEducationDiscountLoading}
loading={loading}
className="min-w-38"
>
{t('educationPricingConfirm.cancel', { ns: 'education' })}
</AlertDialogCancelButton>
<AlertDialogConfirmButton
tone={educationPricingConfirmInfo.type !== 'info' ? 'destructive' : 'default'}
onClick={handleContinueCurrentPlan}
disabled={loading}
loading={loading}
</Button>
<Button
variant="primary"
size="large"
onClick={handleSwitchToProfessionalAnnual}
disabled={isEducationDiscountLoading}
loading={isEducationDiscountLoading}
className="min-w-61"
>
{t('educationPricingConfirm.continue', { ns: 'education' })}
</AlertDialogConfirmButton>
</AlertDialogActions>
</AlertDialogContent>
</AlertDialog>
</Button>
</div>
</DialogContent>
</Dialog>
</div>
)
}

View File

@ -16,10 +16,10 @@
"currentSigned": "تم تسجيل الدخول حاليًا باسم",
"educationPricingConfirm.billingPeriod.monthly": "شهري",
"educationPricingConfirm.billingPeriod.yearly": "سنوي",
"educationPricingConfirm.cancel": "إلغاء",
"educationPricingConfirm.continue": "المتابعة بدون خصم",
"educationPricingConfirm.description": "خطتك {{planName}} {{billingPeriod}} لا تدعم الخصم التعليمي. فقط خطة Professional السنوية مؤهلة.",
"educationPricingConfirm.title": "الخصم التعليمي غير متاح",
"educationPricingConfirm.cancel": "الاحتفاظ بالخطة الحالية",
"educationPricingConfirm.continue": "التبديل إلى Professional السنوية",
"educationPricingConfirm.description": "ينطبق الخصم التعليمي على خطة Professional السنوية فقط. الاحتفاظ بخطتك الحالية لن يتضمن الخصم.",
"educationPricingConfirm.title": "الخطة التي اخترتها لا تدعم الخصم التعليمي",
"emailLabel": "بريدك الإلكتروني الحالي",
"form.schoolName.placeholder": "أدخل الاسم الرسمي الكامل لمدرستك",
"form.schoolName.title": "اسم مدرستك",

View File

@ -16,10 +16,10 @@
"currentSigned": "DERZEIT ANGEMELDET ALS",
"educationPricingConfirm.billingPeriod.monthly": "monatlich",
"educationPricingConfirm.billingPeriod.yearly": "jährlich",
"educationPricingConfirm.cancel": "Abbrechen",
"educationPricingConfirm.continue": "Ohne Rabatt fortfahren",
"educationPricingConfirm.description": "Ihr {{planName}} {{billingPeriod}} Plan unterstützt den Bildungsrabatt nicht. Nur der Professional-Jahresplan ist berechtigt.",
"educationPricingConfirm.title": "Bildungsrabatt nicht verfügbar",
"educationPricingConfirm.cancel": "Aktuellen Plan behalten",
"educationPricingConfirm.continue": "Zu Professional jährlich wechseln",
"educationPricingConfirm.description": "Der Bildungsrabatt gilt nur für den jährlichen Professional-Plan. Wenn Sie Ihren aktuellen Plan behalten, ist der Rabatt nicht enthalten.",
"educationPricingConfirm.title": "Ihr ausgewählter Plan unterstützt den Bildungsrabatt nicht",
"emailLabel": "Ihre aktuelle E-Mail",
"form.schoolName.placeholder": "Geben Sie den offiziellen, unabgekürzten Namen Ihrer Schule ein.",
"form.schoolName.title": "Ihr Schulname",

View File

@ -16,10 +16,10 @@
"currentSigned": "CURRENTLY SIGNED IN AS",
"educationPricingConfirm.billingPeriod.monthly": "monthly",
"educationPricingConfirm.billingPeriod.yearly": "annual",
"educationPricingConfirm.cancel": "Cancel",
"educationPricingConfirm.continue": "Continue without discount",
"educationPricingConfirm.description": "Your {{planName}} {{billingPeriod}} plan doesn't support the education discount. Only the Professional annual plan is eligible.",
"educationPricingConfirm.title": "Education discount not available",
"educationPricingConfirm.cancel": "Keep current plan",
"educationPricingConfirm.continue": "Switch to Professional Annual",
"educationPricingConfirm.description": "The education discount applies to the Professional annual plan only. Keeping your current plan won't include the discount.",
"educationPricingConfirm.title": "Your selected plan doesn't support the education discount",
"emailLabel": "Your current email",
"form.schoolName.placeholder": "Enter the official, unabbreviated name of your school",
"form.schoolName.title": "Your School Name",

View File

@ -16,10 +16,10 @@
"currentSigned": "ACTUALMENTE CONECTADO COMO",
"educationPricingConfirm.billingPeriod.monthly": "mensual",
"educationPricingConfirm.billingPeriod.yearly": "anual",
"educationPricingConfirm.cancel": "Cancelar",
"educationPricingConfirm.continue": "Continuar sin descuento",
"educationPricingConfirm.description": "Tu plan {{planName}} {{billingPeriod}} no admite el descuento educativo. Solo el plan Professional anual es elegible.",
"educationPricingConfirm.title": "Descuento educativo no disponible",
"educationPricingConfirm.cancel": "Mantener el plan actual",
"educationPricingConfirm.continue": "Cambiar a Professional anual",
"educationPricingConfirm.description": "El descuento educativo solo se aplica al plan Professional anual. Si mantienes tu plan actual, no se incluirá el descuento.",
"educationPricingConfirm.title": "El plan seleccionado no admite el descuento educativo",
"emailLabel": "Tu correo electrónico actual",
"form.schoolName.placeholder": "Ingrese el nombre oficial y completo de su escuela",
"form.schoolName.title": "El nombre de tu escuela",

View File

@ -16,10 +16,10 @@
"currentSigned": "اکنون به عنوان",
"educationPricingConfirm.billingPeriod.monthly": "ماهانه",
"educationPricingConfirm.billingPeriod.yearly": "سالانه",
"educationPricingConfirm.cancel": "لغو",
"educationPricingConfirm.continue": "ادامه بدون تخفیف",
"educationPricingConfirm.description": "طرح {{planName}} {{billingPeriod}} شما از تخفیف آموزشی پشتیبانی نمی‌کند. فقط طرح سالانه Professional واجد شرایط است.",
"educationPricingConfirm.title": "تخفیف آموزشی در دسترس نیست",
"educationPricingConfirm.cancel": "حفظ طرح فعلی",
"educationPricingConfirm.continue": "تغییر به Professional سالانه",
"educationPricingConfirm.description": "تخفیف آموزشی فقط برای طرح سالانه Professional اعمال می‌شود. با حفظ طرح فعلی، این تخفیف شامل نمی‌شود.",
"educationPricingConfirm.title": "طرح انتخاب‌شده شما از تخفیف آموزشی پشتیبانی نمی‌کند",
"emailLabel": "ایمیل فعلی شما",
"form.schoolName.placeholder": "نام رسمی و کامل مدرسه خود را وارد کنید",
"form.schoolName.title": "نام مدرسه شما",

View File

@ -16,10 +16,10 @@
"currentSigned": "ACTUELLEMENT CONNECTÉ EN TANT QUE",
"educationPricingConfirm.billingPeriod.monthly": "mensuel",
"educationPricingConfirm.billingPeriod.yearly": "annuel",
"educationPricingConfirm.cancel": "Annuler",
"educationPricingConfirm.continue": "Continuer sans remise",
"educationPricingConfirm.description": "Votre plan {{planName}} {{billingPeriod}} ne prend pas en charge la remise éducative. Seul le plan Professional annuel est éligible.",
"educationPricingConfirm.title": "Remise éducative non disponible",
"educationPricingConfirm.cancel": "Conserver le plan actuel",
"educationPricingConfirm.continue": "Passer à Professional annuel",
"educationPricingConfirm.description": "La remise éducation s'applique uniquement au plan Professional annuel. En conservant votre plan actuel, la remise ne sera pas incluse.",
"educationPricingConfirm.title": "Le plan sélectionné ne prend pas en charge la remise éducation",
"emailLabel": "Votre email actuel",
"form.schoolName.placeholder": "Entrez le nom officiel et complet de votre école",
"form.schoolName.title": "Le nom de votre école",

View File

@ -16,10 +16,10 @@
"currentSigned": "वर्तमान में साइन इन किया गया है के रूप में",
"educationPricingConfirm.billingPeriod.monthly": "मासिक",
"educationPricingConfirm.billingPeriod.yearly": "वार्षिक",
"educationPricingConfirm.cancel": "रद्द करें",
"educationPricingConfirm.continue": "छूट के बिना जारी रखें",
"educationPricingConfirm.description": "आपका {{planName}} {{billingPeriod}} प्लान शिक्षा छूट का समर्थन नहीं करता। केवल Professional वार्षिक प्लान पात्र है।",
"educationPricingConfirm.title": "शिक्षा छूट उपलब्ध नहीं",
"educationPricingConfirm.cancel": "वर्तमान प्लान रखें",
"educationPricingConfirm.continue": "Professional वार्षिक पर स्विच करें",
"educationPricingConfirm.description": "शिक्षा छूट केवल Professional वार्षिक प्लान पर लागू होती है। अपना वर्तमान प्लान रखने पर छूट शामिल नहीं होगी।",
"educationPricingConfirm.title": "आपका चुना हुआ प्लान शिक्षा छूट का समर्थन नहीं करता",
"emailLabel": "आपका वर्तमान ईमेल",
"form.schoolName.placeholder": "अपनी स्कूल का आधिकारिक, बिना संक्षिप्त नाम दर्ज करें",
"form.schoolName.title": "आपके स्कूल का नाम",

View File

@ -16,10 +16,10 @@
"currentSigned": "SAAT INI MASUK SEBAGAI",
"educationPricingConfirm.billingPeriod.monthly": "bulanan",
"educationPricingConfirm.billingPeriod.yearly": "tahunan",
"educationPricingConfirm.cancel": "Batal",
"educationPricingConfirm.continue": "Lanjutkan tanpa diskon",
"educationPricingConfirm.description": "Paket {{planName}} {{billingPeriod}} Anda tidak mendukung diskon pendidikan. Hanya paket Professional tahunan yang memenuhi syarat.",
"educationPricingConfirm.title": "Diskon pendidikan tidak tersedia",
"educationPricingConfirm.cancel": "Tetap gunakan paket saat ini",
"educationPricingConfirm.continue": "Beralih ke Professional Tahunan",
"educationPricingConfirm.description": "Diskon pendidikan hanya berlaku untuk paket Professional tahunan. Jika tetap menggunakan paket saat ini, diskon tidak akan disertakan.",
"educationPricingConfirm.title": "Paket yang Anda pilih tidak mendukung diskon pendidikan",
"emailLabel": "Email Anda saat ini",
"form.schoolName.placeholder": "Masukkan nama resmi sekolah Anda yang tidak disingkat",
"form.schoolName.title": "Nama Sekolah Anda",

View File

@ -16,10 +16,10 @@
"currentSigned": "ATTUALMENTE ACCEDUTO COME",
"educationPricingConfirm.billingPeriod.monthly": "mensile",
"educationPricingConfirm.billingPeriod.yearly": "annuale",
"educationPricingConfirm.cancel": "Annulla",
"educationPricingConfirm.continue": "Continua senza sconto",
"educationPricingConfirm.description": "Il tuo piano {{planName}} {{billingPeriod}} non supporta lo sconto educativo. Solo il piano Professional annuale è idoneo.",
"educationPricingConfirm.title": "Sconto educativo non disponibile",
"educationPricingConfirm.cancel": "Mantieni il piano attuale",
"educationPricingConfirm.continue": "Passa a Professional annuale",
"educationPricingConfirm.description": "Lo sconto Education si applica solo al piano Professional annuale. Mantenendo il piano attuale, lo sconto non verrà incluso.",
"educationPricingConfirm.title": "Il piano selezionato non supporta lo sconto Education",
"emailLabel": "La tua email attuale",
"form.schoolName.placeholder": "Inserisci il nome ufficiale e completo della tua scuola",
"form.schoolName.title": "Il Nome della tua Scuola",

View File

@ -16,10 +16,10 @@
"currentSigned": "現在ログイン中のアカウントは",
"educationPricingConfirm.billingPeriod.monthly": "月次",
"educationPricingConfirm.billingPeriod.yearly": "年次",
"educationPricingConfirm.cancel": "キャンセル",
"educationPricingConfirm.continue": "割引なしで続行",
"educationPricingConfirm.description": "{{planName}} {{billingPeriod}} プランは教育割引に対応していません。Professional 年次プランのみが対象です。",
"educationPricingConfirm.title": "教育割引は利用できません",
"educationPricingConfirm.cancel": "現在のプランを維持",
"educationPricingConfirm.continue": "Professional 年間プランに切り替える",
"educationPricingConfirm.description": "教育割引は Professional 年間プランにのみ適用されます。現在のプランを維持すると、割引は適用されません。",
"educationPricingConfirm.title": "選択したプランは教育割引に対応していません",
"emailLabel": "現在のメールアドレス",
"form.schoolName.placeholder": "学校の正式名称(省略不可)を入力してください。",
"form.schoolName.title": "学校名",

View File

@ -16,10 +16,10 @@
"currentSigned": "현재 로그인 중입니다",
"educationPricingConfirm.billingPeriod.monthly": "월간",
"educationPricingConfirm.billingPeriod.yearly": "연간",
"educationPricingConfirm.cancel": "취소",
"educationPricingConfirm.continue": "할인 없이 계속",
"educationPricingConfirm.description": "{{planName}} {{billingPeriod}} 플랜은 교육 할인을 지원하지 않습니다. Professional 연간 플랜만 자격이 있습니다.",
"educationPricingConfirm.title": "교육 할인 불가",
"educationPricingConfirm.cancel": "현재 플랜 유지",
"educationPricingConfirm.continue": "Professional 연간으로 전환",
"educationPricingConfirm.description": "교육 할인은 Professional 연간 플랜에만 적용됩니다. 현재 플랜을 유지하면 할인이 포함되지 않습니다.",
"educationPricingConfirm.title": "선택한 플랜은 교육 할인을 지원하지 않습니다",
"emailLabel": "현재 이메일",
"form.schoolName.placeholder": "귀하의 학교의 공식 약어가 아닌 전체 이름을 입력하세요.",
"form.schoolName.title": "당신의 학교 이름",

View File

@ -16,10 +16,10 @@
"currentSigned": "CURRENTLY SIGNED IN AS",
"educationPricingConfirm.billingPeriod.monthly": "maandelijks",
"educationPricingConfirm.billingPeriod.yearly": "jaarlijks",
"educationPricingConfirm.cancel": "Annuleren",
"educationPricingConfirm.continue": "Doorgaan zonder korting",
"educationPricingConfirm.description": "Uw {{planName}} {{billingPeriod}} abonnement ondersteunt de onderwijskorting niet. Alleen het jaarlijkse Professional abonnement komt in aanmerking.",
"educationPricingConfirm.title": "Onderwijskorting niet beschikbaar",
"educationPricingConfirm.cancel": "Huidig abonnement behouden",
"educationPricingConfirm.continue": "Overschakelen naar Professional jaarlijks",
"educationPricingConfirm.description": "De onderwijskorting is alleen van toepassing op het jaarlijkse Professional-abonnement. Als u uw huidige abonnement behoudt, is de korting niet inbegrepen.",
"educationPricingConfirm.title": "Uw geselecteerde abonnement ondersteunt de onderwijskorting niet",
"emailLabel": "Your current email",
"form.schoolName.placeholder": "Enter the official, unabbreviated name of your school",
"form.schoolName.title": "Your School Name",

View File

@ -16,10 +16,10 @@
"currentSigned": "AKTUALNIE ZALOGOWANY JAKO",
"educationPricingConfirm.billingPeriod.monthly": "miesięcznie",
"educationPricingConfirm.billingPeriod.yearly": "rocznie",
"educationPricingConfirm.cancel": "Anuluj",
"educationPricingConfirm.continue": "Kontynuuj bez rabatu",
"educationPricingConfirm.description": "Twój plan {{planName}} {{billingPeriod}} nie obsługuje rabatu edukacyjnego. Tylko roczny plan Professional jest uprawniony.",
"educationPricingConfirm.title": "Rabat edukacyjny niedostępny",
"educationPricingConfirm.cancel": "Zachowaj obecny plan",
"educationPricingConfirm.continue": "Przełącz na Professional roczny",
"educationPricingConfirm.description": "Zniżka edukacyjna dotyczy tylko rocznego planu Professional. Pozostanie przy obecnym planie nie obejmie zniżki.",
"educationPricingConfirm.title": "Wybrany plan nie obsługuje zniżki edukacyjnej",
"emailLabel": "Twój aktualny email",
"form.schoolName.placeholder": "Wpisz oficjalną, pełną nazwę swojej szkoły",
"form.schoolName.title": "Nazwa Twojej Szkoły",

View File

@ -16,10 +16,10 @@
"currentSigned": "ATUALMENTE CONECTADO COMO",
"educationPricingConfirm.billingPeriod.monthly": "mensal",
"educationPricingConfirm.billingPeriod.yearly": "anual",
"educationPricingConfirm.cancel": "Cancelar",
"educationPricingConfirm.continue": "Continuar sem desconto",
"educationPricingConfirm.description": "Seu plano {{planName}} {{billingPeriod}} não suporta o desconto educacional. Apenas o plano Professional anual é elegível.",
"educationPricingConfirm.title": "Desconto educacional não disponível",
"educationPricingConfirm.cancel": "Manter plano atual",
"educationPricingConfirm.continue": "Mudar para Professional anual",
"educationPricingConfirm.description": "O desconto educacional se aplica apenas ao plano Professional anual. Manter seu plano atual não incluirá o desconto.",
"educationPricingConfirm.title": "O plano selecionado não aceita o desconto educacional",
"emailLabel": "Seu e-mail atual",
"form.schoolName.placeholder": "Digite o nome oficial e não abreviado da sua escola",
"form.schoolName.title": "O nome da sua escola",

View File

@ -16,10 +16,10 @@
"currentSigned": "CONEXIUNE ÎN PREZENT CA",
"educationPricingConfirm.billingPeriod.monthly": "lunar",
"educationPricingConfirm.billingPeriod.yearly": "anual",
"educationPricingConfirm.cancel": "Anulează",
"educationPricingConfirm.continue": "Continuă fără reducere",
"educationPricingConfirm.description": "Planul tău {{planName}} {{billingPeriod}} nu suportă reducerea educațională. Doar planul Professional anual este eligibil.",
"educationPricingConfirm.title": "Reducerea educațională nu este disponibilă",
"educationPricingConfirm.cancel": "Păstrează planul curent",
"educationPricingConfirm.continue": "Treci la Professional anual",
"educationPricingConfirm.description": "Reducerea educațională se aplică doar planului Professional anual. Dacă păstrezi planul curent, reducerea nu va fi inclusă.",
"educationPricingConfirm.title": "Planul selectat nu acceptă reducerea educațională",
"emailLabel": "Emailul tău curent",
"form.schoolName.placeholder": "Introduceți numele oficial, neabbreviat al școlii dumneavoastră",
"form.schoolName.title": "Numele Școlii Tale",

View File

@ -16,10 +16,10 @@
"currentSigned": "В ДАННЫЙ МОМЕНТ ВХОД В ПРОФИЛЬ КАК",
"educationPricingConfirm.billingPeriod.monthly": "ежемесячно",
"educationPricingConfirm.billingPeriod.yearly": "ежегодно",
"educationPricingConfirm.cancel": "Отмена",
"educationPricingConfirm.continue": родолжить без скидки",
"educationPricingConfirm.description": "Ваш план {{planName}} {{billingPeriod}} не поддерживает образовательную скидку. Только годовой план Professional имеет право на скидку.",
"educationPricingConfirm.title": "Образовательная скидка недоступна",
"educationPricingConfirm.cancel": "Оставить текущий план",
"educationPricingConfirm.continue": ерейти на Professional годовой",
"educationPricingConfirm.description": "Образовательная скидка применяется только к годовому плану Professional. Если оставить текущий план, скидка не будет включена.",
"educationPricingConfirm.title": "Выбранный план не поддерживает образовательную скидку",
"emailLabel": "Ваш текущий адрес электронной почты",
"form.schoolName.placeholder": "Введите официальное, полное название вашей школы",
"form.schoolName.title": "Название вашей школы",

View File

@ -16,10 +16,10 @@
"currentSigned": "Trenutno prijavljen kot",
"educationPricingConfirm.billingPeriod.monthly": "mesečno",
"educationPricingConfirm.billingPeriod.yearly": "letno",
"educationPricingConfirm.cancel": "Prekliči",
"educationPricingConfirm.continue": "Nadaljuj brez popusta",
"educationPricingConfirm.description": "Vaš načrt {{planName}} {{billingPeriod}} ne podpira izobraževalnega popusta. Do popusta je upravičen samo letni načrt Professional.",
"educationPricingConfirm.title": "Izobraževalni popust ni na voljo",
"educationPricingConfirm.cancel": "Obdrži trenutni paket",
"educationPricingConfirm.continue": "Preklopi na letni Professional",
"educationPricingConfirm.description": "Izobraževalni popust velja samo za letni paket Professional. Če obdržite trenutni paket, popust ne bo vključen.",
"educationPricingConfirm.title": "Izbrani paket ne podpira izobraževalnega popusta",
"emailLabel": "Vaš trenutni elektronski naslov",
"form.schoolName.placeholder": "Vpišite uradno, neokrnjeno ime vaše šole",
"form.schoolName.title": "Ime vaše šole",

View File

@ -16,10 +16,10 @@
"currentSigned": "ลงชื่อเข้าใช้ในฐานะ",
"educationPricingConfirm.billingPeriod.monthly": "รายเดือน",
"educationPricingConfirm.billingPeriod.yearly": "รายปี",
"educationPricingConfirm.cancel": "ยกเลิก",
"educationPricingConfirm.continue": "ดำเนินการต่อโดยไม่มีส่วนลด",
"educationPricingConfirm.description": "แผน {{planName}} {{billingPeriod}} ของคุณไม่รองรับส่วนลดการศึกษา เฉพาะแผน Professional รายปีเท่านั้นที่มีสิทธิ์",
"educationPricingConfirm.title": "ส่วนลดการศึกษาไม่พร้อมใช้งาน",
"educationPricingConfirm.cancel": "ใช้แผนปัจจุบันต่อ",
"educationPricingConfirm.continue": "เปลี่ยนเป็น Professional รายปี",
"educationPricingConfirm.description": "ส่วนลดการศึกษาใช้ได้เฉพาะกับแผน Professional รายปีเท่านั้น หากใช้แผนปัจจุบันต่อ จะไม่มีส่วนลดนี้รวมอยู่ด้วย",
"educationPricingConfirm.title": "แผนที่คุณเลือกไม่รองรับส่วนลดการศึกษา",
"emailLabel": "อีเมลปัจจุบันของคุณ",
"form.schoolName.placeholder": "กรุณาใส่ชื่อของโรงเรียนอย่างเป็นทางการที่ไม่มีการย่อ",
"form.schoolName.title": "ชื่อโรงเรียนของคุณ",

View File

@ -16,10 +16,10 @@
"currentSigned": "ŞU ANDA GİRİŞ YAPILDIĞI KİŞİ",
"educationPricingConfirm.billingPeriod.monthly": "aylık",
"educationPricingConfirm.billingPeriod.yearly": "yıllık",
"educationPricingConfirm.cancel": "İptal",
"educationPricingConfirm.continue": "İndirim olmadan devam et",
"educationPricingConfirm.description": "{{planName}} {{billingPeriod}} planınız eğitim indirimini desteklemiyor. Yalnızca yıllık Professional planı uygundur.",
"educationPricingConfirm.title": "Eğitim indirimi mevcut değil",
"educationPricingConfirm.cancel": "Mevcut planı koru",
"educationPricingConfirm.continue": "Professional yıllık plana geç",
"educationPricingConfirm.description": "Eğitim indirimi yalnızca yıllık Professional planı için geçerlidir. Mevcut planınızı korursanız indirim dahil edilmez.",
"educationPricingConfirm.title": "Seçtiğiniz plan eğitim indirimini desteklemiyor",
"emailLabel": "Şu anki e-posta adresin",
"form.schoolName.placeholder": "Okulunuzun resmi, kısaltılmamış adını girin",
"form.schoolName.title": "Okulunuzun Adı",

View File

@ -16,10 +16,10 @@
"currentSigned": "В даний момент ви підписані як",
"educationPricingConfirm.billingPeriod.monthly": "щомісячно",
"educationPricingConfirm.billingPeriod.yearly": "щорічно",
"educationPricingConfirm.cancel": "Скасувати",
"educationPricingConfirm.continue": родовжити без знижки",
"educationPricingConfirm.description": "Ваш план {{planName}} {{billingPeriod}} не підтримує освітню знижку. Лише річний план Professional має право на знижку.",
"educationPricingConfirm.title": "Освітня знижка недоступна",
"educationPricingConfirm.cancel": "Залишити поточний план",
"educationPricingConfirm.continue": ерейти на Professional річний",
"educationPricingConfirm.description": "Освітня знижка застосовується лише до річного плану Professional. Якщо залишити поточний план, знижку не буде включено.",
"educationPricingConfirm.title": "Вибраний план не підтримує освітню знижку",
"emailLabel": "Ваш поточний електронний лист",
"form.schoolName.placeholder": "Введіть офіційну, повну назву вашої школи",
"form.schoolName.title": "Ваша назва школи",

View File

@ -16,10 +16,10 @@
"currentSigned": "HIỆN ĐANG ĐĂNG NHẬP VÀO",
"educationPricingConfirm.billingPeriod.monthly": "hàng tháng",
"educationPricingConfirm.billingPeriod.yearly": "hàng năm",
"educationPricingConfirm.cancel": "Hủy",
"educationPricingConfirm.continue": "Tiếp tục không có giảm giá",
"educationPricingConfirm.description": "Gói {{planName}} {{billingPeriod}} của bạn không hỗ trợ giảm giá giáo dục. Chỉ gói Professional hàng năm mới được áp dụng.",
"educationPricingConfirm.title": "Giảm giá giáo dục không khả dụng",
"educationPricingConfirm.cancel": "Giữ gói hiện tại",
"educationPricingConfirm.continue": "Chuyển sang Professional hằng năm",
"educationPricingConfirm.description": "Giảm giá giáo dục chỉ áp dụng cho gói Professional hằng năm. Nếu giữ gói hiện tại, giảm giá sẽ không được áp dụng.",
"educationPricingConfirm.title": "Gói bạn chọn không hỗ trợ giảm giá giáo dục",
"emailLabel": "Email hiện tại của bạn",
"form.schoolName.placeholder": "Nhập tên chính thức, không viết tắt của trường bạn",
"form.schoolName.title": "Tên Trường Của Bạn",

View File

@ -16,10 +16,10 @@
"currentSigned": "您当前登录的账户是",
"educationPricingConfirm.billingPeriod.monthly": "月付",
"educationPricingConfirm.billingPeriod.yearly": "年付",
"educationPricingConfirm.cancel": "取消",
"educationPricingConfirm.continue": "不使用优惠继续",
"educationPricingConfirm.description": "你的 {{planName}} 计划{{billingPeriod}}不支持教育优惠。只有 Professional 的年付计划符合条件。",
"educationPricingConfirm.title": "教育优惠不适用于该计划",
"educationPricingConfirm.cancel": "保留当前计划",
"educationPricingConfirm.continue": "切换到 Professional 年付",
"educationPricingConfirm.description": "教育优惠仅适用于 Professional 年付计划。保留当前计划将不包含该优惠。",
"educationPricingConfirm.title": "你选择的计划不支持教育优惠",
"emailLabel": "您当前的邮箱",
"form.schoolName.placeholder": "请输入您的学校的官方全称(不得缩写)",
"form.schoolName.title": "您的学校名称",

View File

@ -16,10 +16,10 @@
"currentSigned": "當前以以下身份登入",
"educationPricingConfirm.billingPeriod.monthly": "月付",
"educationPricingConfirm.billingPeriod.yearly": "年付",
"educationPricingConfirm.cancel": "取消",
"educationPricingConfirm.continue": "不使用優惠繼續",
"educationPricingConfirm.description": "你的 {{planName}} 方案{{billingPeriod}}不支援教育優惠。只有 Professional 的年付方案符合資格。",
"educationPricingConfirm.title": "教育優惠不適用於此方案",
"educationPricingConfirm.cancel": "保留目前方案",
"educationPricingConfirm.continue": "切換到 Professional 年付",
"educationPricingConfirm.description": "教育優惠僅適用於 Professional 年付方案。保留目前方案將不包含此優惠。",
"educationPricingConfirm.title": "你選擇的方案不支援教育優惠",
"emailLabel": "您當前的電子郵件",
"form.schoolName.placeholder": "請輸入您學校的正式全名",
"form.schoolName.title": "你的學校名稱",