fix(billing): align subscription actions with workspace plans

This commit is contained in:
yyh committed 2026-11-10 18:31:40 +08:00
1 parent dae8e95b3a
commit df16d87600
56 files changed
+258 -142

No files matched your search

@@ -84,8 +84,8 @@ afterEach(() => {
describe('Cloud plan payment flow', () => {
it.each([
{ plan: 'professional', interval: 'month', label: 'startBuilding' },
{ plan: 'team', interval: 'year', label: 'getStarted' },
{ plan: 'professional', interval: 'month', label: 'upgradeToProfessional' },
{ plan: 'team', interval: 'year', label: 'upgradeToTeam' },
] as const)(
'displays $plan pricing and redirects to its $interval checkout',
async ({ plan, interval, label }) => {
@@ -115,7 +115,7 @@ describe('Cloud plan payment flow', () => {
}),
)
renderPlan()
const button = screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })
const button = screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' })
await user.click(button)
expect(await screen.findByText('billing.errors.requestInProgress')).toBeInTheDocument()
expect(screen.queryByText('Backend text')).not.toBeInTheDocument()
@@ -124,30 +124,25 @@ describe('Cloud plan payment flow', () => {
})
it.each([
{ currentPlan: 'sandbox', plan: 'sandbox', label: 'startForFree' },
{ currentPlan: 'professional', plan: 'sandbox', label: 'startForFree' },
{ currentPlan: 'team', plan: 'sandbox', label: 'startForFree' },
{ currentPlan: 'team', plan: 'professional', label: 'startBuilding' },
] as const)(
'prevents purchasing $plan from $currentPlan',
async ({ currentPlan, plan, label }) => {
const user = userEvent.setup()
renderPlan({ currentPlan, plan })
const button = screen.getByRole('button', { name: `billing.plansCommon.${label}` })
expect(button).toBeDisabled()
await user.click(button)
expect(mockGetSubscription).not.toHaveBeenCalled()
expect(mockGetInvoices).not.toHaveBeenCalled()
expect(window.open).not.toHaveBeenCalled()
},
)
['sandbox', 'sandbox'],
['professional', 'sandbox'],
['team', 'sandbox'],
['team', 'professional'],
] as const)('hides the purchase action for %s viewing %s', (currentPlan, plan) => {
renderPlan({ currentPlan, plan })
expect(
screen.queryByRole('button', {
name: /billing\.plansCommon\.(startForFree|startBuilding|getStarted|upgradeToProfessional|upgradeToTeam|manageSubscription)$/,
}),
).not.toBeInTheDocument()
})
it('opens the billing portal for the current paid subscription after resolving its URL', async () => {
const user = userEvent.setup()
const request = createDeferred<{ url: string }>()
mockGetInvoices.mockReturnValue(request.promise)
renderPlan({ currentPlan: 'professional', plan: 'professional' })
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.manageSubscription' }))
expect(window.open).toHaveBeenCalledWith('about:blank', '_blank', undefined)
expect(popup.opener).toBeNull()
expect(popup.location.href).toBe('')
@@ -163,7 +158,7 @@ describe('Cloud plan payment flow', () => {
new ORPCError('billing_unavailable', { defined: true, status: 503, message: 'Backend text' }),
)
renderPlan({ currentPlan: 'professional', plan: 'professional' })
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.manageSubscription' }))
expect(await screen.findByText('billing.errors.unavailable')).toBeInTheDocument()
expect(screen.queryByText('Backend text')).not.toBeInTheDocument()
expect(popup.close).toHaveBeenCalledOnce()
@@ -175,7 +170,7 @@ describe('Cloud plan payment flow', () => {
mockGetSubscription.mockReturnValue(request.promise)
const user = userEvent.setup()
renderPlan()
const button = screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })
const button = screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' })
await user.click(button)
await user.click(button)
expect(mockGetSubscription).toHaveBeenCalledOnce()
@@ -146,7 +146,9 @@ describe('Pricing Modal Flow', () => {
const user = userEvent.setup()
await render(<Pricing />)
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await user.click(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
)
await waitFor(() => {
expect(mockGetSubscription).toHaveBeenCalledWith(
@@ -166,7 +168,9 @@ describe('Pricing Modal Flow', () => {
expect(screen.getByRole('radio', { name: /billing\.pricing\.annually/ })).toBeChecked()
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await user.click(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
)
await waitFor(() => {
expect(mockGetSubscription).toHaveBeenCalledWith(
@@ -194,13 +198,14 @@ describe('Pricing Modal Flow', () => {
expect(window.open).not.toHaveBeenCalled()
})
it('keeps the Sandbox action disabled for the current free plan', async () => {
it('shows the current Sandbox plan as a label without a purchase action', async () => {
setupContexts({ type: 'sandbox' })
await render(<Pricing />)
expect(
screen.getByRole('button', { name: 'billing.plansCommon.startForFree' }),
).toBeDisabled()
screen.queryByRole('button', { name: 'billing.plansCommon.startForFree' }),
).not.toBeInTheDocument()
expect(screen.getByText('billing.plansCommon.currentPlan')).toBeVisible()
})
})
@@ -64,7 +64,9 @@ it('shows prices and disables purchase buttons while features load', async () =>
screen.getByRole('link', { name: 'billing.plansCommon.comparePlanAndFeatures' }),
).toBeVisible()
expect(screen.getByRole('heading', { name: 'billing.plans.professional.name' })).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeDisabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeDisabled()
expect(screen.getByRole('radio', { name: /billing\.pricing\.annually/ })).not.toHaveAttribute(
'aria-disabled',
'true',
@@ -73,7 +75,9 @@ it('shows prices and disables purchase buttons while features load', async () =>
expect(screen.getByText('$159')).toBeVisible()
await user.click(screen.getByRole('radio', { name: /billing\.pricing\.annually/ }))
expect(screen.getByText('$590')).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeDisabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeDisabled()
await act(async () => {
resolveFeatures(
seedFeatures(createConsoleQueryClient(), { billing: { subscription: { plan: 'team' } } }),
@@ -133,7 +137,9 @@ it('preserves a billing interval selected before education eligibility arrives',
'true',
)
expect(screen.getByRole('heading', { name: 'billing.plans.professional.name' })).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeDisabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeDisabled()
await user.click(screen.getByRole('radio', { name: /billing\.pricing\.annually/ }))
await user.click(screen.getByRole('radio', { name: 'billing.pricing.monthly' }))
await act(async () => {
@@ -143,7 +149,9 @@ it('preserves a billing interval selected before education eligibility arrives',
await waitFor(() => expect(screen.queryByRole('status')).not.toBeInTheDocument())
expect(screen.getByRole('radio', { name: /billing\.pricing\.annually/ })).not.toBeChecked()
expect(screen.getByText('$59')).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeEnabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeEnabled()
act(() =>
queryClient.setQueryData(options.queryKey, {
is_student: true,
@@ -167,18 +175,23 @@ it('shows yearly pricing immediately for a cached eligible education account', (
show()
expect(screen.getByRole('radio', { name: /billing\.pricing\.annually/ })).toBeChecked()
expect(screen.getByText('$590')).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeEnabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeEnabled()
expect(screen.queryByRole('status')).not.toBeInTheDocument()
})
it.each(['year', 'month'] as const)(
'takes an active education subscription directly to Team checkout with %s billing',
async (interval) => {
it.each([
['year', true],
['month', false],
] as const)(
'opens the Team change flow for a paid plan with %s billing and education activated=%s',
async (interval, activated) => {
const user = userEvent.setup()
const { queryClient, show } = setup()
seedFeatures(queryClient, {
billing: { subscription: { plan: 'professional', interval: 'year' } },
education: { enabled: true, activated: true },
education: { enabled: true, activated },
})
seedEducationStatus(queryClient, { is_student: true })
const checkoutUrl = 'https://billing.example.com/team-checkout'
@@ -192,7 +205,7 @@ it.each(['year', 'month'] as const)(
if (interval === 'month')
await user.click(screen.getByRole('radio', { name: 'billing.pricing.monthly' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.upgradeToTeam' }))
await waitFor(() => expect(navigate).toHaveBeenCalledWith(checkoutUrl))
expect(checkout).toHaveBeenCalledTimes(1)
@@ -216,12 +229,20 @@ it('offers education pricing before Team checkout when the discount has not been
)
show()
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.upgradeToTeam' }))
expect(
await screen.findByRole('dialog', { name: 'education.educationPricingConfirm.title' }),
).toBeVisible()
expect(checkout).not.toHaveBeenCalled()
const navigate = vi.spyOn(window.location, 'href', 'set').mockImplementation(() => {})
await user.click(screen.getByRole('button', { name: 'education.educationPricingConfirm.cancel' }))
await waitFor(() =>
expect(navigate).toHaveBeenCalledWith('https://billing.example.com/team-checkout'),
)
const target = new URL((checkout.mock.calls[0]?.[0] as Request).url)
expect(target.searchParams.get('plan')).toBe('team')
expect(target.searchParams.get('interval')).toBe('year')
})
it('keeps plan information visible after a request failure and restores billing on retry', async () => {
@@ -242,12 +263,16 @@ it('keeps plan information visible after a request failure and restores billing
expect(await screen.findByRole('alert')).toHaveTextContent('common.error')
expect(screen.queryByRole('status')).not.toBeInTheDocument()
expect(await screen.findByRole('heading', { name: 'billing.plans.sandbox.name' })).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startForFree' })).toBeDisabled()
expect(
screen.queryByRole('button', { name: 'billing.plansCommon.startForFree' }),
).not.toBeInTheDocument()
expect(screen.getByText('$59')).toBeVisible()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeDisabled()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeDisabled()
await user.click(screen.getByRole('button', { name: 'common.operation.retry' }))
expect(
await screen.findByRole('button', { name: 'billing.plansCommon.startBuilding' }),
await screen.findByRole('button', { name: 'billing.plansCommon.upgradeToProfessional' }),
).toBeEnabled()
})
@@ -255,44 +280,21 @@ afterEach(() => {
vi.restoreAllMocks()
})
it('keeps the current paid plan billing action available while education loads or fails', async () => {
const user = userEvent.setup()
it('lets paid subscribers manage or upgrade without requesting education eligibility', async () => {
const { queryClient, show } = setup()
queryClient.setDefaultOptions({
queries: { retry: false, retryOnMount: false, staleTime: Infinity },
})
seedFeatures(queryClient, {
billing: { subscription: { plan: 'professional', interval: 'month' } },
education: { enabled: true },
billing: { subscription: { plan: 'professional', interval: 'year' } },
education: { enabled: true, activated: false },
})
let rejectEducation!: (error: Error) => void
const request = queryClient
.query({
...consoleQuery.account.education.get.queryOptions(),
queryFn: () =>
new Promise<never>((_, reject) => {
rejectEducation = reject
}),
})
.catch(() => {})
vi.spyOn(globalThis, 'fetch').mockImplementation(
async () =>
new Response(JSON.stringify({ url: 'https://billing.example.com' }), {
headers: { 'Content-Type': 'application/json' },
}),
)
const fetch = vi.spyOn(globalThis, 'fetch')
show()
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeEnabled()
expect(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' })).toBeDisabled()
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await waitFor(() => expect(billingPopup.location.href).toBe('https://billing.example.com'))
await act(async () => {
rejectEducation(new Error('Unavailable'))
await request
})
expect(await screen.findByRole('alert')).toHaveTextContent('common.error')
expect(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' })).toBeEnabled()
expect(screen.getByRole('button', { name: 'billing.plansCommon.getStarted' })).toBeDisabled()
expect(screen.getByRole('radio', { name: /billing\.pricing\.annually/ })).toBeChecked()
expect(screen.getByText('billing.plansCommon.currentPlan')).toBeVisible()
expect(
screen.getByRole('button', { name: 'billing.plansCommon.manageSubscription' }),
).toBeEnabled()
expect(screen.getByRole('button', { name: 'billing.plansCommon.upgradeToTeam' })).toBeEnabled()
expect(fetch).not.toHaveBeenCalled()
})
it('selects the billing interval using the named options', async () => {
@@ -313,7 +315,7 @@ it.each([
['team', 'month', 'year'],
['team', 'year', 'month'],
] as const)(
'checks out %s when changing from %s to %s',
'requests the selected %s subscription change from %s to %s',
async (plan, currentInterval, selectedInterval) => {
const user = userEvent.setup()
const { queryClient, show } = setup()
@@ -327,12 +329,16 @@ it.each([
}),
)
show()
if (selectedInterval === 'year')
await user.click(screen.getByRole('radio', { name: /billing\.pricing\.annually/ }))
await user.click(
screen.getByRole('radio', {
name:
selectedInterval === 'year' ? /billing\.pricing\.annually/ : 'billing.pricing.monthly',
}),
)
expect(screen.queryByText('billing.plansCommon.currentPlan')).not.toBeInTheDocument()
await user.click(
screen.getByRole('button', {
name:
plan === 'team' ? 'billing.plansCommon.getStarted' : 'billing.plansCommon.startBuilding',
name: 'billing.plansCommon.manageSubscription',
}),
)
await waitFor(() => expect(navigate).toHaveBeenCalledWith('https://checkout.example.com'))
@@ -361,7 +367,7 @@ it.each(['month', 'year'] as const)(
show()
if (interval === 'year')
await user.click(screen.getByRole('radio', { name: /billing\.pricing\.annually/ }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.startBuilding' }))
await user.click(screen.getByRole('button', { name: 'billing.plansCommon.manageSubscription' }))
await waitFor(() => expect(billingPopup.location.href).toBe('https://billing.example.com'))
},
)
+17 -7
View File
@@ -18,24 +18,34 @@ export function PricingContent() {
const { t } = useTranslation(['appApi', 'billing', 'common'])
const featuresQuery = useQuery(consoleQuery.features.get.queryOptions())
const { data: features } = featuresQuery
const educationEnabled = features?.education.enabled ?? false
const canManageBilling = useAtomValue(isCurrentWorkspaceManagerAtom)
const currentCloudPlan = features?.billing.subscription.plan
const checkEducationEligibility =
canManageBilling &&
currentCloudPlan === 'sandbox' &&
features?.education.enabled === true &&
!features.education.activated
const educationQuery = useQuery(
consoleQuery.account.education.get.queryOptions({
enabled: educationEnabled,
enabled: checkEducationEligibility,
select: ({ is_student }) => is_student,
}),
)
const canManageBilling = useAtomValue(isCurrentWorkspaceManagerAtom)
const isEducationDiscountEligible = educationEnabled ? educationQuery.data : false
const isEducationDiscountEligible = checkEducationEligibility ? educationQuery.data : false
const isCheckoutReady = features !== undefined && isEducationDiscountEligible !== undefined
const pricingError =
(!features && featuresQuery.isError) ||
(educationEnabled && educationQuery.data === undefined && educationQuery.isError)
(checkEducationEligibility && educationQuery.data === undefined && educationQuery.isError)
const paidInterval =
currentCloudPlan !== 'sandbox' ? features?.billing.subscription.interval : undefined
const defaultBillingInterval: BillingInterval =
canManageBilling && isEducationDiscountEligible ? 'year' : 'month'
paidInterval === 'year' || paidInterval === 'month'
? paidInterval
: canManageBilling && isEducationDiscountEligible
? 'year'
: 'month'
const [selectedBillingInterval, setSelectedBillingInterval] = React.useState<BillingInterval>()
const billingInterval = selectedBillingInterval ?? defaultBillingInterval
const currentCloudPlan = features?.billing.subscription.plan
const billing = currentCloudPlan
? {
currentPlan: currentCloudPlan,
@@ -54,10 +54,12 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
isCurrentPaidPlan && billingInterval === billing?.currentBillingInterval
const isPlanDisabled =
!billing ||
(!isCurrentSubscription && billing.isEducationDiscountEligible === undefined) ||
(!isCurrentPaidPlan && billing.isEducationDiscountEligible === undefined) ||
(!isCurrentPaidPlan && planInfo.level <= ALL_PLANS[billing.currentPlan].level)
const isEducationDiscountSupportedPlan = plan === 'professional' && isYearly
const educationDiscountWarningText =
currentPlan === 'sandbox' &&
!billing?.isEducationDiscountActivated &&
canManageBilling &&
isEducationDiscountEligible &&
!isFreePlan &&
@@ -68,11 +70,21 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
const { handleEducationDiscount, isEducationDiscountLoading } = useEducationDiscount()
const [showEducationPricingConfirm, setShowEducationPricingConfirm] = React.useState(false)
const buttonLabel = {
sandbox: t(($) => $['plansCommon.startForFree'], { ns: 'billing' }),
professional: t(($) => $['plansCommon.startBuilding'], { ns: 'billing' }),
team: t(($) => $['plansCommon.getStarted'], { ns: 'billing' }),
}[plan]
const showPlanButton =
!canManageBilling ||
(!isFreePlan &&
(!billing || isCurrentPaidPlan || planInfo.level > ALL_PLANS[billing.currentPlan].level))
const buttonLabel = !canManageBilling
? {
sandbox: t(($) => $['plansCommon.startForFree'], { ns: 'billing' }),
professional: t(($) => $['plansCommon.startBuilding'], { ns: 'billing' }),
team: t(($) => $['plansCommon.getStarted'], { ns: 'billing' }),
}[plan]
: isCurrentPaidPlan
? t(($) => $['plansCommon.manageSubscription'], { ns: 'billing' })
: plan === 'team'
? t(($) => $['plansCommon.upgradeToTeam'], { ns: 'billing' })
: t(($) => $['plansCommon.upgradeToProfessional'], { ns: 'billing' })
const runPlanAction = async () => {
if (isPlanActionPending || isEducationDiscountLoading) return
@@ -111,7 +123,12 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
return
}
if (isEducationDiscountEligible && isEducationDiscountSupportedPlan) {
if (
currentPlan === 'sandbox' &&
!billing.isEducationDiscountActivated &&
isEducationDiscountEligible &&
isEducationDiscountSupportedPlan
) {
await handleEducationDiscount()
return
}
@@ -129,7 +146,7 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
}
}
const handlePlanButtonClick = async () => {
if (educationDiscountWarningText && !billing?.isEducationDiscountActivated && !isPlanDisabled) {
if (educationDiscountWarningText && !isPlanDisabled) {
setShowEducationPricingConfirm(true)
return
}
@@ -152,6 +169,9 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
<h3 className={styles.planName}>
{t(($) => $[`${i18nPrefix}.name`], { ns: 'billing' })}
</h3>
{canManageBilling && (isCurrentSubscription || (isCurrent && isFreePlan)) && (
<span>{t(($) => $['plansCommon.currentPlan'], { ns: 'billing' })}</span>
)}
{isMostPopularPlan && (
<div className={styles.badge}>
<span>{t(($) => $['plansCommon.mostPopular'], { ns: 'billing' })}</span>
@@ -195,23 +215,25 @@ export function CloudPlanItem({ plan, billingInterval, billing }: CloudPlanItemP
</>
)}
</div>
<div className="relative">
<Button
data-plan={plan}
variant="tertiary"
size={null}
disabled={isPlanDisabled}
className={styles.planButton}
onClick={handlePlanButtonClick}
>
<span className="min-w-0">{buttonLabel}</span>
</Button>
{educationDiscountWarningText && (
<div className="absolute inset-x-0 top-full mt-1.5 text-start system-2xs-medium text-text-tertiary">
{educationDiscountWarningText}
</div>
)}
</div>
{showPlanButton && (
<div className="relative">
<Button
data-plan={plan}
variant="tertiary"
size={null}
disabled={isPlanDisabled}
className={styles.planButton}
onClick={handlePlanButtonClick}
>
<span className="min-w-0">{buttonLabel}</span>
</Button>
{educationDiscountWarningText && (
<div className="absolute inset-x-0 top-full mt-1.5 text-start system-2xs-medium text-text-tertiary">
{educationDiscountWarningText}
</div>
)}
</div>
)}
</div>
<CloudPlanFeatures plan={plan} />
<Dialog open={showEducationPricingConfirm} onOpenChange={setShowEducationPricingConfirm}>
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "مجاني",
"plansCommon.getStarted": "ابدأ الآن",
"plansCommon.logsHistory": "{{days}} تاريخ السجلات",
"plansCommon.manageSubscription": "إدارة الاشتراك",
"plansCommon.member": "عضو",
"plansCommon.memberAfter": "عضو",
"plansCommon.messageRequest.title": "{{count,number}} أرصدة الرسائل",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "غير متوفر",
"plansCommon.unlimited": "غير محدود",
"plansCommon.unlimitedApiRate": "لا يوجد حد لمعدل API لـ Dify",
"plansCommon.upgradeToProfessional": "الترقية إلى Professional",
"plansCommon.upgradeToTeam": "الترقية إلى Team",
"plansCommon.vectorSpace": "{{size}} تخزين بيانات المعرفة",
"plansCommon.vectorSpaceTooltip": "ستستهلك المستندات ذات وضع الفهرسة عالي الجودة موارد تخزين بيانات المعرفة. عندما يصل تخزين بيانات المعرفة إلى الحد الأقصى، لن يتم تحميل مستندات جديدة.",
"plansCommon.workflowExecution.faster": "تنفيذ سير عمل أسرع",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "لقد قدمت بنجاح طلباً للحصول على الخصم التعليمي.",
"applied.step2.description": "اختر مساحة العمل التي تريد استخدامها مع الخصم التعليمي.",
"currentSigned": "تم تسجيل الدخول حاليًا باسم",
"educationPricingConfirm.cancel": "الاحتفاظ بالخطة الحالية",
"educationPricingConfirm.cancel": "المتابعة دون خصم",
"educationPricingConfirm.continue": "التبديل إلى Professional السنوية",
"educationPricingConfirm.description": "ينطبق الخصم التعليمي على خطة Professional السنوية فقط. الاحتفاظ بخطتك الحالية لن يتضمن الخصم.",
"educationPricingConfirm.title": "الخطة التي اخترتها لا تدعم الخصم التعليمي",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Pulsuz",
"plansCommon.getStarted": "Başla",
"plansCommon.logsHistory": "Jurnal tarixçəsi: {{days}}",
"plansCommon.manageSubscription": "Abunəliyi idarə et",
"plansCommon.member": "Üzv",
"plansCommon.memberAfter": "Üzv",
"plansCommon.messageRequest.title": "{{count,number}} mesaj krediti",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Əlçatan deyil",
"plansCommon.unlimited": "Limitsiz",
"plansCommon.unlimitedApiRate": "Dify API sorğu tezliyi limiti yoxdur",
"plansCommon.upgradeToProfessional": "Professional planına yüksəlt",
"plansCommon.upgradeToTeam": "Team planına yüksəlt",
"plansCommon.vectorSpace": "{{size}} həcmində bilik məlumatlarının saxlanma sahəsi",
"plansCommon.vectorSpaceTooltip": "Yüksək keyfiyyətli indeksləmə rejimində olan sənədlər bilik məlumatlarının saxlanma sahəsindən istifadə edir. Bu sahənin tutum həddinə çatdıqda yeni sənədlər yüklənməyəcək.",
"plansCommon.workflowExecution.faster": "İş axınının daha sürətli icrası",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Təhsil endirimi üçün uğurla müraciət etdiniz.",
"applied.step2.description": "Təhsil endirimindən istifadə etmək istədiyiniz iş sahəsini seçin.",
"currentSigned": "Hazırda daxil olduğunuz hesab:",
"educationPricingConfirm.cancel": "Cari planı saxla",
"educationPricingConfirm.cancel": "Endirimsiz davam et",
"educationPricingConfirm.continue": "İllik peşəkar plana keç",
"educationPricingConfirm.description": "Təhsil endirimi yalnız illik peşəkar plana aiddir. Cari planınızı saxlasanız, endirim tətbiq edilməyəcək.",
"educationPricingConfirm.title": "Seçdiyiniz plan təhsil endirimini dəstəkləmir",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Kostenlos",
"plansCommon.getStarted": "Loslegen",
"plansCommon.logsHistory": "{{days}} Protokollverlauf",
"plansCommon.manageSubscription": "Abonnement verwalten",
"plansCommon.member": "Mitglied",
"plansCommon.memberAfter": "Mitglied",
"plansCommon.messageRequest.title": "{{count,number}} Nachrichtenguthaben",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Nicht verfügbar",
"plansCommon.unlimited": "Unbegrenzt",
"plansCommon.unlimitedApiRate": "Keine API-Ratebeschränkung",
"plansCommon.upgradeToProfessional": "Auf Professional upgraden",
"plansCommon.upgradeToTeam": "Auf Team upgraden",
"plansCommon.vectorSpace": "{{size}} Vektorraum",
"plansCommon.vectorSpaceTooltip": "Vektorraum ist das Langzeitspeichersystem, das erforderlich ist, damit LLMs Ihre Daten verstehen können.",
"plansCommon.workflowExecution.faster": "Schnellere Arbeitsablauf-Ausführung",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Sie haben erfolgreich den Bildungsrabatt beantragt.",
"applied.step2.description": "Wählen Sie den Arbeitsbereich aus, den Sie mit dem Bildungsrabatt verwenden möchten.",
"currentSigned": "DERZEIT ANGEMELDET ALS",
"educationPricingConfirm.cancel": "Aktuellen Plan behalten",
"educationPricingConfirm.cancel": "Ohne Rabatt fortfahren",
"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",
+4 -1
View File
@@ -71,7 +71,7 @@
"plansCommon.buildApps": "{{count,number}} Apps",
"plansCommon.cloud": "Cloud Service",
"plansCommon.comparePlanAndFeatures": "Compare plans & features",
"plansCommon.currentPlan": "Current Plan",
"plansCommon.currentPlan": "Current plan",
"plansCommon.days": "Days",
"plansCommon.discountedAnnualPrice": "Discounted annual price: ",
"plansCommon.documentProcessingPriority": " document processing",
@@ -84,6 +84,7 @@
"plansCommon.free": "Free",
"plansCommon.getStarted": "Get Started",
"plansCommon.logsHistory": "{{days}} Log history",
"plansCommon.manageSubscription": "Manage subscription",
"plansCommon.member": "Member",
"plansCommon.memberAfter": "Member",
"plansCommon.messageRequest.title": "{{count,number}} message credits",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Unavailable",
"plansCommon.unlimited": "Unlimited",
"plansCommon.unlimitedApiRate": "No Dify API Rate Limit",
"plansCommon.upgradeToProfessional": "Upgrade to Professional",
"plansCommon.upgradeToTeam": "Upgrade to Team",
"plansCommon.vectorSpace": "{{size}} knowledge storage",
"plansCommon.vectorSpaceTooltip": "Documents with the High Quality indexing mode will consume Knowledge Data Storage resources. When Knowledge Data Storage reaches the limit, new documents will not be uploaded.",
"plansCommon.workflowExecution.faster": "Faster workflow execution",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "You've successfully applied for the education discount.",
"applied.step2.description": "Select the workspace you want to use the education discount with.",
"currentSigned": "CURRENTLY SIGNED IN AS",
"educationPricingConfirm.cancel": "Keep current plan",
"educationPricingConfirm.cancel": "Continue without discount",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Gratis",
"plansCommon.getStarted": "Comenzar",
"plansCommon.logsHistory": "{{days}} Historial de registros",
"plansCommon.manageSubscription": "Gestionar la suscripción",
"plansCommon.member": "Miembro",
"plansCommon.memberAfter": "Miembro",
"plansCommon.messageRequest.title": "{{count,number}} créditos de mensajes",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "No disponible",
"plansCommon.unlimited": "Ilimitado",
"plansCommon.unlimitedApiRate": "Sin límite de tasa de API",
"plansCommon.upgradeToProfessional": "Mejorar a Professional",
"plansCommon.upgradeToTeam": "Mejorar a Team",
"plansCommon.vectorSpace": "{{size}} Espacio vectorial",
"plansCommon.vectorSpaceTooltip": "El Espacio Vectorial es el sistema de memoria a largo plazo necesario para que los LLMs comprendan tus datos.",
"plansCommon.workflowExecution.faster": "Ejecución de flujo de trabajo más rápida",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Has solicitado exitosamente el descuento educativo.",
"applied.step2.description": "Selecciona el workspace que deseas usar con el descuento educativo.",
"currentSigned": "ACTUALMENTE CONECTADO COMO",
"educationPricingConfirm.cancel": "Mantener el plan actual",
"educationPricingConfirm.cancel": "Continuar sin descuento",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "رایگان",
"plansCommon.getStarted": "شروع کنید",
"plansCommon.logsHistory": "{{days}} تاریخچه گزارشات",
"plansCommon.manageSubscription": "مدیریت اشتراک",
"plansCommon.member": "عضو",
"plansCommon.memberAfter": "عضو",
"plansCommon.messageRequest.title": "{{count,number}} اعتبار پیام",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "غیرقابل دسترس",
"plansCommon.unlimited": "نامحدود",
"plansCommon.unlimitedApiRate": "هیچ محدودیتی برای نرخ API وجود ندارد.",
"plansCommon.upgradeToProfessional": "ارتقا به Professional",
"plansCommon.upgradeToTeam": "ارتقا به Team",
"plansCommon.vectorSpace": "{{size}} فضای وکتور",
"plansCommon.vectorSpaceTooltip": "فضای وکتور سیستم حافظه بلند مدت است که برای درک داده‌های شما توسط LLM‌ها مورد نیاز است.",
"plansCommon.workflowExecution.faster": "اجرای سریع‌تر جریان کاری",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "درخواست تخفیف آموزشی شما با موفقیت ثبت شد.",
"applied.step2.description": "workspace‌ای را که می‌خواهید با تخفیف آموزشی استفاده کنید انتخاب کنید.",
"currentSigned": "اکنون به عنوان",
"educationPricingConfirm.cancel": "حفظ طرح فعلی",
"educationPricingConfirm.cancel": "ادامه بدون تخفیف",
"educationPricingConfirm.continue": "تغییر به Professional سالانه",
"educationPricingConfirm.description": "تخفیف آموزشی فقط برای طرح سالانه Professional اعمال می‌شود. با حفظ طرح فعلی، این تخفیف شامل نمی‌شود.",
"educationPricingConfirm.title": "طرح انتخاب‌شده شما از تخفیف آموزشی پشتیبانی نمی‌کند",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Gratuit",
"plansCommon.getStarted": "Commencer",
"plansCommon.logsHistory": "{{days}} historique des logs",
"plansCommon.manageSubscription": "Gérer l’abonnement",
"plansCommon.member": "Membre",
"plansCommon.memberAfter": "Membre",
"plansCommon.messageRequest.title": "{{count,number}} crédits de message",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Indisponible",
"plansCommon.unlimited": "Illimité",
"plansCommon.unlimitedApiRate": "Pas de limite de taux d'API",
"plansCommon.upgradeToProfessional": "Passer à Professional",
"plansCommon.upgradeToTeam": "Passer à Team",
"plansCommon.vectorSpace": "{{size}} espace vectoriel",
"plansCommon.vectorSpaceTooltip": "L'espace vectoriel est le système de mémoire à long terme nécessaire pour que les LLMs comprennent vos données.",
"plansCommon.workflowExecution.faster": "Exécution de flux de travail plus rapide",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Vous avez fait la demande de remise éducative avec succès.",
"applied.step2.description": "Sélectionnez l'espace de travail que vous souhaitez utiliser avec la remise éducative.",
"currentSigned": "ACTUELLEMENT CONNECTÉ EN TANT QUE",
"educationPricingConfirm.cancel": "Conserver le plan actuel",
"educationPricingConfirm.cancel": "Continuer sans réduction",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "मुफ्त",
"plansCommon.getStarted": "शुरू करें",
"plansCommon.logsHistory": "{{days}} लॉग इतिहास",
"plansCommon.manageSubscription": "सदस्यता प्रबंधित करें",
"plansCommon.member": "सदस्य",
"plansCommon.memberAfter": "सदस्य",
"plansCommon.messageRequest.title": "{{count,number}} संदेश क्रेडिट्स",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "अनुपलब्ध",
"plansCommon.unlimited": "असीमित",
"plansCommon.unlimitedApiRate": "कोई एपीआई दर सीमा नहीं",
"plansCommon.upgradeToProfessional": "Professional में अपग्रेड करें",
"plansCommon.upgradeToTeam": "Team में अपग्रेड करें",
"plansCommon.vectorSpace": "{{size}} वेक्टर स्पेस",
"plansCommon.vectorSpaceTooltip": "वेक्टर स्पेस वह दीर्घकालिक स्मृति प्रणाली है जिसकी आवश्यकता LLMs को आपके डेटा को समझने के लिए होती है।",
"plansCommon.workflowExecution.faster": "तेज़ कार्यप्रवाह निष्पादन",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "आपने शिक्षा छूट के लिए सफलतापूर्वक आवेदन किया है।",
"applied.step2.description": "वह workspace चुनें जिसे आप शिक्षा छूट के साथ उपयोग करना चाहते हैं।",
"currentSigned": "वर्तमान में साइन इन किया गया है के रूप में",
"educationPricingConfirm.cancel": "वर्तमान प्लान रखें",
"educationPricingConfirm.cancel": "छूट के बिना जारी रखें",
"educationPricingConfirm.continue": "Professional वार्षिक पर स्विच करें",
"educationPricingConfirm.description": "शिक्षा छूट केवल Professional वार्षिक प्लान पर लागू होती है। अपना वर्तमान प्लान रखने पर छूट शामिल नहीं होगी।",
"educationPricingConfirm.title": "आपका चुना हुआ प्लान शिक्षा छूट का समर्थन नहीं करता",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Bebas",
"plansCommon.getStarted": "Memulai",
"plansCommon.logsHistory": "{{days}} Riwayat log",
"plansCommon.manageSubscription": "Kelola langganan",
"plansCommon.member": "Anggota",
"plansCommon.memberAfter": "Anggota",
"plansCommon.messageRequest.title": "kredit pesan {{count,number}}",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Tidak tersedia",
"plansCommon.unlimited": "Unlimited",
"plansCommon.unlimitedApiRate": "Tidak Ada Batas Tarif API",
"plansCommon.upgradeToProfessional": "Tingkatkan ke Professional",
"plansCommon.upgradeToTeam": "Tingkatkan ke Team",
"plansCommon.vectorSpace": "{{size}} Penyimpanan Data Pengetahuan",
"plansCommon.vectorSpaceTooltip": "Dokumen dengan mode pengindeksan Kualitas Tinggi akan menggunakan sumber daya Penyimpanan Data Pengetahuan. Ketika Penyimpanan Data Pengetahuan mencapai batas, dokumen baru tidak akan diunggah.",
"plansCommon.workflowExecution.faster": "Eksekusi Alur Kerja yang Lebih Cepat",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Anda telah berhasil mengajukan diskon pendidikan.",
"applied.step2.description": "Pilih workspace yang ingin Anda gunakan dengan diskon pendidikan.",
"currentSigned": "SAAT INI MASUK SEBAGAI",
"educationPricingConfirm.cancel": "Tetap gunakan paket saat ini",
"educationPricingConfirm.cancel": "Lanjutkan tanpa diskon",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Gratuito",
"plansCommon.getStarted": "Inizia",
"plansCommon.logsHistory": "{{days}} storico dei log",
"plansCommon.manageSubscription": "Gestisci abbonamento",
"plansCommon.member": "Membro",
"plansCommon.memberAfter": "Membro",
"plansCommon.messageRequest.title": "{{count,number}} crediti messaggi",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Non Disponibile",
"plansCommon.unlimited": "Illimitato",
"plansCommon.unlimitedApiRate": "Nessun limite di tasso API",
"plansCommon.upgradeToProfessional": "Passa a Professional",
"plansCommon.upgradeToTeam": "Passa a Team",
"plansCommon.vectorSpace": "{{size}} spazio vettoriale",
"plansCommon.vectorSpaceTooltip": "Lo Spazio Vettoriale è il sistema di memoria a lungo termine necessario per permettere agli LLM di comprendere i tuoi dati.",
"plansCommon.workflowExecution.faster": "Esecuzione del flusso di lavoro più rapida",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Hai fatto domanda per lo sconto educativo con successo.",
"applied.step2.description": "Seleziona il workspace che vuoi utilizzare con lo sconto educativo.",
"currentSigned": "ATTUALMENTE ACCEDUTO COME",
"educationPricingConfirm.cancel": "Mantieni il piano attuale",
"educationPricingConfirm.cancel": "Continua senza sconto",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "無料",
"plansCommon.getStarted": "始める",
"plansCommon.logsHistory": "{{days}}のログ履歴",
"plansCommon.manageSubscription": "サブスクリプションを管理",
"plansCommon.member": "メンバー",
"plansCommon.memberAfter": "メンバー",
"plansCommon.messageRequest.title": "{{count,number}}メッセージクレジット",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "利用不可",
"plansCommon.unlimited": "無制限",
"plansCommon.unlimitedApiRate": "無制限の API コール",
"plansCommon.upgradeToProfessional": "Professional にアップグレード",
"plansCommon.upgradeToTeam": "Team にアップグレード",
"plansCommon.vectorSpace": "{{size}}のナレッジベースのデータストレージ",
"plansCommon.vectorSpaceTooltip": "高品質インデックスモードのドキュメントは、ナレッジベースのデータストレージのリソースを消費します。ナレッジベースのデータストレージの上限に達すると、新しいドキュメントはアップロードされません。",
"plansCommon.workflowExecution.faster": "高速ワークフロー実行キュー",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "教育割引の申請が成功しました。",
"applied.step2.description": "教育割引を使用するワークスペースを選択してください。",
"currentSigned": "現在ログイン中のアカウントは",
"educationPricingConfirm.cancel": "現在のプランを維持",
"educationPricingConfirm.cancel": "割引を適用せずに続ける",
"educationPricingConfirm.continue": "Professional 年間プランに切り替える",
"educationPricingConfirm.description": "教育割引は Professional 年間プランにのみ適用されます。現在のプランを維持すると、割引は適用されません。",
"educationPricingConfirm.title": "選択したプランは教育割引に対応していません",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "무료",
"plansCommon.getStarted": "시작하기",
"plansCommon.logsHistory": "{{days}} 로그 기록",
"plansCommon.manageSubscription": "구독 관리",
"plansCommon.member": "멤버",
"plansCommon.memberAfter": "멤버",
"plansCommon.messageRequest.title": "{{count,number}} 메시지 크레딧",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "사용 불가",
"plansCommon.unlimited": "무제한",
"plansCommon.unlimitedApiRate": "API 호출 속도 제한 없음",
"plansCommon.upgradeToProfessional": "Professional로 업그레이드",
"plansCommon.upgradeToTeam": "Team으로 업그레이드",
"plansCommon.vectorSpace": "{{size}} 벡터 공간",
"plansCommon.vectorSpaceTooltip": "벡터 공간은 LLM 이 데이터를 이해하는 데 필요한 장기 기억 시스템입니다.",
"plansCommon.workflowExecution.faster": "더 빠른 작업 흐름 실행",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "교육 할인 신청이 성공적으로 완료되었습니다.",
"applied.step2.description": "교육 할인을 사용할 워크스페이스를 선택하세요.",
"currentSigned": "현재 로그인 중입니다",
"educationPricingConfirm.cancel": "현재 플랜 유지",
"educationPricingConfirm.cancel": "할인 없이 계속",
"educationPricingConfirm.continue": "Professional 연간으로 전환",
"educationPricingConfirm.description": "교육 할인은 Professional 연간 플랜에만 적용됩니다. 현재 플랜을 유지하면 할인이 포함되지 않습니다.",
"educationPricingConfirm.title": "선택한 플랜은 교육 할인을 지원하지 않습니다",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "ຟຣີ",
"plansCommon.getStarted": "ເລີ່ມຕົ້ນເລີຍ",
"plansCommon.logsHistory": "ປະຫວັດບັນທຶກ (Log) {{days}} ມື້",
"plansCommon.manageSubscription": "ຈັດການການສະໝັກໃຊ້",
"plansCommon.member": "ສະມາຊິກ",
"plansCommon.memberAfter": "ສະມາຊິກ",
"plansCommon.messageRequest.title": "{{count,number}} ເຄຣດິດຂໍ້ຄວາມ",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "ບໍ່ສາມາດໃຊ້ງານໄດ້",
"plansCommon.unlimited": "ບໍ່ຈຳກັດ",
"plansCommon.unlimitedApiRate": "ບໍ່ມີຂີດຈຳກັດອັດຕາ Dify API",
"plansCommon.upgradeToProfessional": "ອັບເກຣດເປັນ Professional",
"plansCommon.upgradeToTeam": "ອັບເກຣດເປັນ Team",
"plansCommon.vectorSpace": "{{size}} ພື້ນທີ່ຈັດເກັບຂໍ້ມູນຄວາມຮູ້",
"plansCommon.vectorSpaceTooltip": "ເອກະສານທີ່ມີໂໝດການເຮັດ Index ແບບຄຸນນະພາບສູງຈະໃຊ້ຊັບພະຍາກອນການຈັດເກັບຂໍ້ມູນຄວາມຮູ້.",
"plansCommon.workflowExecution.faster": "ການເຮັດວຽກຂອງ Workflow ທີ່ໄວຂຶ້ນ",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "ທ່ານໄດ້ສະໝັກຂໍສ່ວນຫຼຸດເພື່ອການສຶກສາສຳເລັດແລ້ວ.",
"applied.step2.description": "ເລືອກພື້ນທີ່ເຮັດວຽກທີ່ທ່ານຕ້ອງການໃຊ້ສ່ວນຫຼຸດເພື່ອການສຶກສາ.",
"currentSigned": "ເຂົ້າສູ່ລະບົບໃນປັດຈຸບັນໃນນາມ",
"educationPricingConfirm.cancel": "ໃຊ້ແພັກເກດປັດຈຸບັນຕໍ່ໄປ",
"educationPricingConfirm.cancel": "ດຳເນີນການຕໍ່ໂດຍບໍ່ໃຊ້ສ່ວນຫຼຸດ",
"educationPricingConfirm.continue": "ປ່ຽນເປັນ Professional ແບບລາຍປີ",
"educationPricingConfirm.description": "ສ່ວນຫຼຸດເພື່ອການສຶກສານຳໃຊ້ໄດ້ກັບແພັກເກດ Professional ແບບລາຍປີເທົັ້ນັ້ນ. ການໃຊ້ແພັກເກດປັດຈຸບັນຂອງທ່ານຕໍ່ໄປຈະບໍ່ລວມເອົາສ່ວນຫຼຸດນີ້.",
"educationPricingConfirm.title": "ແພັກເກດທີ່ທ່ານເລືອກບໍ່ຮອງຮັບສ່ວນຫຼຸດເພື່ອການສຶກສາ",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Free",
"plansCommon.getStarted": "Get Started",
"plansCommon.logsHistory": "{{days}} Log history",
"plansCommon.manageSubscription": "Abonnement beheren",
"plansCommon.member": "Member",
"plansCommon.memberAfter": "Member",
"plansCommon.messageRequest.title": "{{count,number}} message credits",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Unavailable",
"plansCommon.unlimited": "Unlimited",
"plansCommon.unlimitedApiRate": "No Dify API Rate Limit",
"plansCommon.upgradeToProfessional": "Upgraden naar Professional",
"plansCommon.upgradeToTeam": "Upgraden naar Team",
"plansCommon.vectorSpace": "{{size}} Knowledge Data Storage",
"plansCommon.vectorSpaceTooltip": "Documents with the High Quality indexing mode will consume Knowledge Data Storage resources. When Knowledge Data Storage reaches the limit, new documents will not be uploaded.",
"plansCommon.workflowExecution.faster": "Faster Workflow Execution",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "U heeft met succes de onderwijskorting aangevraagd.",
"applied.step2.description": "Selecteer de werkruimte die u wilt gebruiken met de onderwijskorting.",
"currentSigned": "CURRENTLY SIGNED IN AS",
"educationPricingConfirm.cancel": "Huidig abonnement behouden",
"educationPricingConfirm.cancel": "Doorgaan zonder korting",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Darmowy",
"plansCommon.getStarted": "Zacznij",
"plansCommon.logsHistory": "{{days}} historia logów",
"plansCommon.manageSubscription": "Zarządzaj subskrypcją",
"plansCommon.member": "Członek",
"plansCommon.memberAfter": "Członek",
"plansCommon.messageRequest.title": "{{count,number}} kredytów wiadomości",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Niedostępne",
"plansCommon.unlimited": "Nieograniczony",
"plansCommon.unlimitedApiRate": "Brak limitu liczby zapytań API",
"plansCommon.upgradeToProfessional": "Przejdź na Professional",
"plansCommon.upgradeToTeam": "Przejdź na Team",
"plansCommon.vectorSpace": "{{size}} przestrzeń wektorowa",
"plansCommon.vectorSpaceTooltip": "Przestrzeń wektorowa jest systemem pamięci długoterminowej wymaganym dla LLM, aby zrozumieć Twoje dane.",
"plansCommon.workflowExecution.faster": "Szybsze wykonywanie przepływu pracy",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Pomyślnie złożono wniosek o rabat edukacyjny.",
"applied.step2.description": "Wybierz obszar roboczy, który chcesz używać z rabatem edukacyjnym.",
"currentSigned": "AKTUALNIE ZALOGOWANY JAKO",
"educationPricingConfirm.cancel": "Zachowaj obecny plan",
"educationPricingConfirm.cancel": "Kontynuuj bez zniżki",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Grátis",
"plansCommon.getStarted": "Começar",
"plansCommon.logsHistory": "{{days}} histórico de logs",
"plansCommon.manageSubscription": "Gerenciar assinatura",
"plansCommon.member": "Membro",
"plansCommon.memberAfter": "Membro",
"plansCommon.messageRequest.title": "{{count,number}} créditos de mensagem",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Indisponível",
"plansCommon.unlimited": "Ilimitado",
"plansCommon.unlimitedApiRate": "Sem limite de taxa da API",
"plansCommon.upgradeToProfessional": "Fazer upgrade para Professional",
"plansCommon.upgradeToTeam": "Fazer upgrade para Team",
"plansCommon.vectorSpace": "{{size}} espaço vetorial",
"plansCommon.vectorSpaceTooltip": "O Espaço Vetorial é o sistema de memória de longo prazo necessário para que LLMs compreendam seus dados.",
"plansCommon.workflowExecution.faster": "Execução de Fluxo de Trabalho Mais Rápida",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Você solicitou com sucesso o desconto educacional.",
"applied.step2.description": "Selecione o workspace que deseja usar com o desconto educacional.",
"currentSigned": "ATUALMENTE CONECTADO COMO",
"educationPricingConfirm.cancel": "Manter plano atual",
"educationPricingConfirm.cancel": "Continuar sem desconto",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Gratuit",
"plansCommon.getStarted": "Întrebați-vă",
"plansCommon.logsHistory": "{{days}} istoricul jurnalelor",
"plansCommon.manageSubscription": "Gestionează abonamentul",
"plansCommon.member": "Membru",
"plansCommon.memberAfter": "Membru",
"plansCommon.messageRequest.title": "{{count,number}} credite de mesaje",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Indisponibil",
"plansCommon.unlimited": "Nelimitat",
"plansCommon.unlimitedApiRate": "Fără limită de rată API",
"plansCommon.upgradeToProfessional": "Treci la Professional",
"plansCommon.upgradeToTeam": "Treci la Team",
"plansCommon.vectorSpace": "{{size}} spațiu vectorial",
"plansCommon.vectorSpaceTooltip": "Spațiul vectorial este sistemul de memorie pe termen lung necesar pentru ca LLM-urile să înțeleagă datele dvs.",
"plansCommon.workflowExecution.faster": "Executarea mai rapidă a fluxului de lucru",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Ai aplicat cu succes pentru reducerea educațională.",
"applied.step2.description": "Selectează workspace-ul pe care dorești să-l utilizezi cu reducerea educațională.",
"currentSigned": "CONEXIUNE ÎN PREZENT CA",
"educationPricingConfirm.cancel": "Păstrează planul curent",
"educationPricingConfirm.cancel": "Continuă fără reducere",
"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ă",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Бесплатно",
"plansCommon.getStarted": "Начать",
"plansCommon.logsHistory": "{{days}} история журналов",
"plansCommon.manageSubscription": "Управление подпиской",
"plansCommon.member": "Участник",
"plansCommon.memberAfter": "Участник",
"plansCommon.messageRequest.title": "{{count,number}} кредитов сообщений",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Недоступно",
"plansCommon.unlimited": "Неограниченно",
"plansCommon.unlimitedApiRate": "Нет ограничений на количество запросов к API",
"plansCommon.upgradeToProfessional": "Перейти на Professional",
"plansCommon.upgradeToTeam": "Перейти на Team",
"plansCommon.vectorSpace": "{{size}} векторное пространство",
"plansCommon.vectorSpaceTooltip": "Векторное пространство - это система долговременной памяти, необходимая LLM для понимания ваших данных.",
"plansCommon.workflowExecution.faster": "Более быстрое выполнение рабочих процессов",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Вы успешно подали заявку на образовательную скидку.",
"applied.step2.description": "Выберите рабочее пространство, которое хотите использовать с образовательной скидкой.",
"currentSigned": "В ДАННЫЙ МОМЕНТ ВХОД В ПРОФИЛЬ КАК",
"educationPricingConfirm.cancel": "Оставить текущий план",
"educationPricingConfirm.cancel": "Продолжить без скидки",
"educationPricingConfirm.continue": "Перейти на Professional годовой",
"educationPricingConfirm.description": "Образовательная скидка применяется только к годовому плану Professional. Если оставить текущий план, скидка не будет включена.",
"educationPricingConfirm.title": "Выбранный план не поддерживает образовательную скидку",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Brezplačno",
"plansCommon.getStarted": "Začnite",
"plansCommon.logsHistory": "{{days}} zgodovina dnevnikov",
"plansCommon.manageSubscription": "Upravljaj naročnino",
"plansCommon.member": "Član",
"plansCommon.memberAfter": "Član",
"plansCommon.messageRequest.title": "{{count,number}} kreditov za sporočila",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Ni na voljo",
"plansCommon.unlimited": "Neomejeno",
"plansCommon.unlimitedApiRate": "Brez omejitve hitrostnega limita API-ja",
"plansCommon.upgradeToProfessional": "Nadgradi na Professional",
"plansCommon.upgradeToTeam": "Nadgradi na Team",
"plansCommon.vectorSpace": "{{size}} prostor za vektorje",
"plansCommon.vectorSpaceTooltip": "Prostor za vektorje je dolgoročni pomnilniški sistem, potreben za to, da LLM-ji razumejo vaše podatke.",
"plansCommon.workflowExecution.faster": "Hitrejše izvajanje delovnega procesa",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Uspešno ste se prijavili za izobraževalni popust.",
"applied.step2.description": "Izberite delovni prostor, ki ga želite uporabiti z izobraževalnim popustom.",
"currentSigned": "Trenutno prijavljen kot",
"educationPricingConfirm.cancel": "Obdrži trenutni paket",
"educationPricingConfirm.cancel": "Nadaljuj brez popusta",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "ฟรี",
"plansCommon.getStarted": "เริ่มต้น",
"plansCommon.logsHistory": "ประวัติการบันทึก {{days}} วัน",
"plansCommon.manageSubscription": "จัดการการสมัครสมาชิก",
"plansCommon.member": "สมาชิก",
"plansCommon.memberAfter": "สมาชิก",
"plansCommon.messageRequest.title": "{{count,number}} เครดิตข้อความ",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "ไม่",
"plansCommon.unlimited": "จำกัด",
"plansCommon.unlimitedApiRate": "ไม่มีข้อจำกัดอัตราการเรียก API",
"plansCommon.upgradeToProfessional": "อัปเกรดเป็น Professional",
"plansCommon.upgradeToTeam": "อัปเกรดเป็น Team",
"plansCommon.vectorSpace": "{{size}} พื้นที่เวกเตอร์",
"plansCommon.vectorSpaceTooltip": "Vector Space เป็นระบบหน่วยความจําระยะยาวที่จําเป็นสําหรับ LLM ในการทําความเข้าใจข้อมูลของคุณ",
"plansCommon.workflowExecution.faster": "การดำเนินงานเวิร์กโฟลว์ที่รวดเร็วขึ้น",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "คุณได้สมัครรับส่วนลดการศึกษาสำเร็จแล้ว",
"applied.step2.description": "เลือกพื้นที่ทำงานที่คุณต้องการใช้กับส่วนลดการศึกษา",
"currentSigned": "ลงชื่อเข้าใช้ในฐานะ",
"educationPricingConfirm.cancel": "ใช้แผนปัจจุบันต่อ",
"educationPricingConfirm.cancel": "ดำเนินการต่อโดยไม่ใช้ส่วนลด",
"educationPricingConfirm.continue": "เปลี่ยนเป็น Professional รายปี",
"educationPricingConfirm.description": "ส่วนลดการศึกษาใช้ได้เฉพาะกับแผน Professional รายปีเท่านั้น หากใช้แผนปัจจุบันต่อ จะไม่มีส่วนลดนี้รวมอยู่ด้วย",
"educationPricingConfirm.title": "แผนที่คุณเลือกไม่รองรับส่วนลดการศึกษา",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Ücretsiz",
"plansCommon.getStarted": "Başlayın",
"plansCommon.logsHistory": "{{days}} günlük geçmişi",
"plansCommon.manageSubscription": "Aboneliği yönet",
"plansCommon.member": "Üye",
"plansCommon.memberAfter": "Üye",
"plansCommon.messageRequest.title": "{{count,number}} mesaj kredisi",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Mevcut Değil",
"plansCommon.unlimited": "Sınırsız",
"plansCommon.unlimitedApiRate": "API Hız Sınırı Yok",
"plansCommon.upgradeToProfessional": "Professional planına yükselt",
"plansCommon.upgradeToTeam": "Team planına yükselt",
"plansCommon.vectorSpace": "{{size}} vektör alanı",
"plansCommon.vectorSpaceTooltip": "Vektör Alanı, LLM'lerin verilerinizi anlaması için gerekli uzun süreli hafıza sistemidir.",
"plansCommon.workflowExecution.faster": "Daha Hızlı İş Akışı Yürütme",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Eğitim indirimi için başarıyla başvurdunuz.",
"applied.step2.description": "Eğitim indirimiyle kullanmak istediğiniz çalışma alanını seçin.",
"currentSigned": "ŞU ANDA GİRİŞ YAPILDIĞI KİŞİ",
"educationPricingConfirm.cancel": "Mevcut planı koru",
"educationPricingConfirm.cancel": "İndirim olmadan devam et",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Безкоштовно",
"plansCommon.getStarted": "Почати",
"plansCommon.logsHistory": "{{days}} історія журналів",
"plansCommon.manageSubscription": "Керувати підпискою",
"plansCommon.member": "Учасник",
"plansCommon.memberAfter": "учасника",
"plansCommon.messageRequest.title": "{{count,number}} кредитів повідомлень",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Недоступний",
"plansCommon.unlimited": "Безлімітний",
"plansCommon.unlimitedApiRate": "Немає обмеження на швидкість API",
"plansCommon.upgradeToProfessional": "Перейти на Professional",
"plansCommon.upgradeToTeam": "Перейти на Team",
"plansCommon.vectorSpace": "{{size}} векторний простір",
"plansCommon.vectorSpaceTooltip": "Векторний простір – це система довгострокової пам'яті, необхідна LLM для розуміння ваших даних.",
"plansCommon.workflowExecution.faster": "Швидше виконання робочого процесу",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Ви успішно подали заявку на освітню знижку.",
"applied.step2.description": "Виберіть робочий простір, який ви хочете використовувати з освітньою знижкою.",
"currentSigned": "В даний момент ви підписані як",
"educationPricingConfirm.cancel": "Залишити поточний план",
"educationPricingConfirm.cancel": "Продовжити без знижки",
"educationPricingConfirm.continue": "Перейти на Professional річний",
"educationPricingConfirm.description": "Освітня знижка застосовується лише до річного плану Professional. Якщо залишити поточний план, знижку не буде включено.",
"educationPricingConfirm.title": "Вибраний план не підтримує освітню знижку",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "Miễn phí",
"plansCommon.getStarted": "Bắt đầu",
"plansCommon.logsHistory": "{{days}} lịch sử nhật ký",
"plansCommon.manageSubscription": "Quản lý gói đăng ký",
"plansCommon.member": "Thành viên",
"plansCommon.memberAfter": "Thành viên",
"plansCommon.messageRequest.title": "{{count,number}} tín dụng tin nhắn",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "Không có sẵn",
"plansCommon.unlimited": "Không giới hạn",
"plansCommon.unlimitedApiRate": "Không giới hạn tỷ lệ API",
"plansCommon.upgradeToProfessional": "Nâng cấp lên Professional",
"plansCommon.upgradeToTeam": "Nâng cấp lên Team",
"plansCommon.vectorSpace": "{{size}} không gian vector",
"plansCommon.vectorSpaceTooltip": "Không gian Vector là hệ thống bộ nhớ dài hạn cần thiết cho LLMs để hiểu dữ liệu của bạn.",
"plansCommon.workflowExecution.faster": "Thực hiện quy trình làm việc nhanh hơn",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "Bạn đã đăng ký giảm giá giáo dục thành công.",
"applied.step2.description": "Chọn workspace bạn muốn sử dụng với giảm giá giáo dục.",
"currentSigned": "HIỆN ĐANG ĐĂNG NHẬP VÀO",
"educationPricingConfirm.cancel": "Giữ gói hiện tại",
"educationPricingConfirm.cancel": "Tiếp tục mà không áp dụng giảm giá",
"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",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "免费",
"plansCommon.getStarted": "立即开始",
"plansCommon.logsHistory": "{{days}}日志历史",
"plansCommon.manageSubscription": "管理订阅",
"plansCommon.member": "成员",
"plansCommon.memberAfter": "个成员",
"plansCommon.messageRequest.title": "{{count,number}} 条消息额度",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "不可用",
"plansCommon.unlimited": "无限制",
"plansCommon.unlimitedApiRate": "API 请求频率无限制",
"plansCommon.upgradeToProfessional": "升级到专业版",
"plansCommon.upgradeToTeam": "升级到团队版",
"plansCommon.vectorSpace": "{{size}} 知识库数据存储空间",
"plansCommon.vectorSpaceTooltip": "采用高质量索引模式的文档会消耗知识数据存储资源。当知识数据存储达到限制时,将不会上传新文档。",
"plansCommon.workflowExecution.faster": "快速工作流执行队列",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "您已成功申请教育优惠。",
"applied.step2.description": "选择要使用教育优惠的 workspace。",
"currentSigned": "您当前登录的账户是",
"educationPricingConfirm.cancel": "保留当前计划",
"educationPricingConfirm.cancel": "不使用折扣,继续购买",
"educationPricingConfirm.continue": "切换到 Professional 年付",
"educationPricingConfirm.description": "教育优惠仅适用于 Professional 年付计划。保留当前计划将不包含该优惠。",
"educationPricingConfirm.title": "你选择的计划不支持教育优惠",
+3
View File
@@ -84,6 +84,7 @@
"plansCommon.free": "免費",
"plansCommon.getStarted": "開始使用",
"plansCommon.logsHistory": "{{days}} 日誌歷史",
"plansCommon.manageSubscription": "管理訂閱",
"plansCommon.member": "成員",
"plansCommon.memberAfter": "個成員",
"plansCommon.messageRequest.title": "{{count,number}} 訊息額度",
@@ -116,6 +117,8 @@
"plansCommon.unavailable": "不可用",
"plansCommon.unlimited": "無限制",
"plansCommon.unlimitedApiRate": "沒有 API 速率限制",
"plansCommon.upgradeToProfessional": "升級至專業版",
"plansCommon.upgradeToTeam": "升級至團隊版",
"plansCommon.vectorSpace": "{{size}} 向量空間",
"plansCommon.vectorSpaceTooltip": "向量空間是 LLMs 理解您的資料所需的長期記憶系統。",
"plansCommon.workflowExecution.faster": "更快速的工作流程執行",
+1 -1
View File
@@ -6,7 +6,7 @@
"applied.step1.description": "您已成功申請教育優惠。",
"applied.step2.description": "選擇要使用教育優惠的 workspace。",
"currentSigned": "當前以以下身份登入",
"educationPricingConfirm.cancel": "保留目前方案",
"educationPricingConfirm.cancel": "不使用折扣,繼續購買",
"educationPricingConfirm.continue": "切換到 Professional 年付",
"educationPricingConfirm.description": "教育優惠僅適用於 Professional 年付方案。保留目前方案將不包含此優惠。",
"educationPricingConfirm.title": "你選擇的方案不支援教育優惠",
+5 -2
View File
@@ -1557,7 +1557,7 @@ export default interface Resources {
'plansCommon.buildApps': '{{count,number}} Apps'
'plansCommon.cloud': 'Cloud Service'
'plansCommon.comparePlanAndFeatures': 'Compare plans & features'
'plansCommon.currentPlan': 'Current Plan'
'plansCommon.currentPlan': 'Current plan'
'plansCommon.days': 'Days'
'plansCommon.discountedAnnualPrice': 'Discounted annual price: '
'plansCommon.documentProcessingPriority': ' document processing'
@@ -1570,6 +1570,7 @@ export default interface Resources {
'plansCommon.free': 'Free'
'plansCommon.getStarted': 'Get Started'
'plansCommon.logsHistory': '{{days}} Log history'
'plansCommon.manageSubscription': 'Manage subscription'
'plansCommon.member': 'Member'
'plansCommon.memberAfter': 'Member'
'plansCommon.messageRequest.title': '{{count,number}} message credits'
@@ -1601,6 +1602,8 @@ export default interface Resources {
'plansCommon.unavailable': 'Unavailable'
'plansCommon.unlimited': 'Unlimited'
'plansCommon.unlimitedApiRate': 'No Dify API Rate Limit'
'plansCommon.upgradeToProfessional': 'Upgrade to Professional'
'plansCommon.upgradeToTeam': 'Upgrade to Team'
'plansCommon.vectorSpace': '{{size}} knowledge storage'
'plansCommon.vectorSpaceTooltip': 'Documents with the High Quality indexing mode will consume Knowledge Data Storage resources. When Knowledge Data Storage reaches the limit, new documents will not be uploaded.'
'plansCommon.workflowExecution.faster': 'Faster workflow execution'
@@ -3285,7 +3288,7 @@ export default interface Resources {
'applied.step1.description': "You've successfully applied for the education discount."
'applied.step2.description': 'Select the workspace you want to use the education discount with.'
currentSigned: 'CURRENTLY SIGNED IN AS'
'educationPricingConfirm.cancel': 'Keep current plan'
'educationPricingConfirm.cancel': 'Continue without discount'
'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"