mirror of
https://github.com/langgenius/dify.git
synced 2026-11-10 21:35:45 +08:00
fix(billing): align subscription actions with workspace plans
This commit is contained in:
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'))
|
||||
},
|
||||
)
|
||||
@@ -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}>
|
||||
|
||||
@@ -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": "تنفيذ سير عمل أسرع",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "لقد قدمت بنجاح طلباً للحصول على الخصم التعليمي.",
|
||||
"applied.step2.description": "اختر مساحة العمل التي تريد استخدامها مع الخصم التعليمي.",
|
||||
"currentSigned": "تم تسجيل الدخول حاليًا باسم",
|
||||
"educationPricingConfirm.cancel": "الاحتفاظ بالخطة الحالية",
|
||||
"educationPricingConfirm.cancel": "المتابعة دون خصم",
|
||||
"educationPricingConfirm.continue": "التبديل إلى Professional السنوية",
|
||||
"educationPricingConfirm.description": "ينطبق الخصم التعليمي على خطة Professional السنوية فقط. الاحتفاظ بخطتك الحالية لن يتضمن الخصم.",
|
||||
"educationPricingConfirm.title": "الخطة التي اخترتها لا تدعم الخصم التعليمي",
|
||||
|
||||
@@ -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ı",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "اجرای سریعتر جریان کاری",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "درخواست تخفیف آموزشی شما با موفقیت ثبت شد.",
|
||||
"applied.step2.description": "workspaceای را که میخواهید با تخفیف آموزشی استفاده کنید انتخاب کنید.",
|
||||
"currentSigned": "اکنون به عنوان",
|
||||
"educationPricingConfirm.cancel": "حفظ طرح فعلی",
|
||||
"educationPricingConfirm.cancel": "ادامه بدون تخفیف",
|
||||
"educationPricingConfirm.continue": "تغییر به Professional سالانه",
|
||||
"educationPricingConfirm.description": "تخفیف آموزشی فقط برای طرح سالانه Professional اعمال میشود. با حفظ طرح فعلی، این تخفیف شامل نمیشود.",
|
||||
"educationPricingConfirm.title": "طرح انتخابشده شما از تخفیف آموزشی پشتیبانی نمیکند",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "तेज़ कार्यप्रवाह निष्पादन",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "आपने शिक्षा छूट के लिए सफलतापूर्वक आवेदन किया है।",
|
||||
"applied.step2.description": "वह workspace चुनें जिसे आप शिक्षा छूट के साथ उपयोग करना चाहते हैं।",
|
||||
"currentSigned": "वर्तमान में साइन इन किया गया है के रूप में",
|
||||
"educationPricingConfirm.cancel": "वर्तमान प्लान रखें",
|
||||
"educationPricingConfirm.cancel": "छूट के बिना जारी रखें",
|
||||
"educationPricingConfirm.continue": "Professional वार्षिक पर स्विच करें",
|
||||
"educationPricingConfirm.description": "शिक्षा छूट केवल Professional वार्षिक प्लान पर लागू होती है। अपना वर्तमान प्लान रखने पर छूट शामिल नहीं होगी।",
|
||||
"educationPricingConfirm.title": "आपका चुना हुआ प्लान शिक्षा छूट का समर्थन नहीं करता",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "高速ワークフロー実行キュー",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "教育割引の申請が成功しました。",
|
||||
"applied.step2.description": "教育割引を使用するワークスペースを選択してください。",
|
||||
"currentSigned": "現在ログイン中のアカウントは",
|
||||
"educationPricingConfirm.cancel": "現在のプランを維持",
|
||||
"educationPricingConfirm.cancel": "割引を適用せずに続ける",
|
||||
"educationPricingConfirm.continue": "Professional 年間プランに切り替える",
|
||||
"educationPricingConfirm.description": "教育割引は Professional 年間プランにのみ適用されます。現在のプランを維持すると、割引は適用されません。",
|
||||
"educationPricingConfirm.title": "選択したプランは教育割引に対応していません",
|
||||
|
||||
@@ -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": "더 빠른 작업 흐름 실행",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "교육 할인 신청이 성공적으로 완료되었습니다.",
|
||||
"applied.step2.description": "교육 할인을 사용할 워크스페이스를 선택하세요.",
|
||||
"currentSigned": "현재 로그인 중입니다",
|
||||
"educationPricingConfirm.cancel": "현재 플랜 유지",
|
||||
"educationPricingConfirm.cancel": "할인 없이 계속",
|
||||
"educationPricingConfirm.continue": "Professional 연간으로 전환",
|
||||
"educationPricingConfirm.description": "교육 할인은 Professional 연간 플랜에만 적용됩니다. 현재 플랜을 유지하면 할인이 포함되지 않습니다.",
|
||||
"educationPricingConfirm.title": "선택한 플랜은 교육 할인을 지원하지 않습니다",
|
||||
|
||||
@@ -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 ທີ່ໄວຂຶ້ນ",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "ທ່ານໄດ້ສະໝັກຂໍສ່ວນຫຼຸດເພື່ອການສຶກສາສຳເລັດແລ້ວ.",
|
||||
"applied.step2.description": "ເລືອກພື້ນທີ່ເຮັດວຽກທີ່ທ່ານຕ້ອງການໃຊ້ສ່ວນຫຼຸດເພື່ອການສຶກສາ.",
|
||||
"currentSigned": "ເຂົ້າສູ່ລະບົບໃນປັດຈຸບັນໃນນາມ",
|
||||
"educationPricingConfirm.cancel": "ໃຊ້ແພັກເກດປັດຈຸບັນຕໍ່ໄປ",
|
||||
"educationPricingConfirm.cancel": "ດຳເນີນການຕໍ່ໂດຍບໍ່ໃຊ້ສ່ວນຫຼຸດ",
|
||||
"educationPricingConfirm.continue": "ປ່ຽນເປັນ Professional ແບບລາຍປີ",
|
||||
"educationPricingConfirm.description": "ສ່ວນຫຼຸດເພື່ອການສຶກສານຳໃຊ້ໄດ້ກັບແພັກເກດ Professional ແບບລາຍປີເທົັ້ນັ້ນ. ການໃຊ້ແພັກເກດປັດຈຸບັນຂອງທ່ານຕໍ່ໄປຈະບໍ່ລວມເອົາສ່ວນຫຼຸດນີ້.",
|
||||
"educationPricingConfirm.title": "ແພັກເກດທີ່ທ່ານເລືອກບໍ່ຮອງຮັບສ່ວນຫຼຸດເພື່ອການສຶກສາ",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ă",
|
||||
|
||||
@@ -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": "Более быстрое выполнение рабочих процессов",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "Вы успешно подали заявку на образовательную скидку.",
|
||||
"applied.step2.description": "Выберите рабочее пространство, которое хотите использовать с образовательной скидкой.",
|
||||
"currentSigned": "В ДАННЫЙ МОМЕНТ ВХОД В ПРОФИЛЬ КАК",
|
||||
"educationPricingConfirm.cancel": "Оставить текущий план",
|
||||
"educationPricingConfirm.cancel": "Продолжить без скидки",
|
||||
"educationPricingConfirm.continue": "Перейти на Professional годовой",
|
||||
"educationPricingConfirm.description": "Образовательная скидка применяется только к годовому плану Professional. Если оставить текущий план, скидка не будет включена.",
|
||||
"educationPricingConfirm.title": "Выбранный план не поддерживает образовательную скидку",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "การดำเนินงานเวิร์กโฟลว์ที่รวดเร็วขึ้น",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "คุณได้สมัครรับส่วนลดการศึกษาสำเร็จแล้ว",
|
||||
"applied.step2.description": "เลือกพื้นที่ทำงานที่คุณต้องการใช้กับส่วนลดการศึกษา",
|
||||
"currentSigned": "ลงชื่อเข้าใช้ในฐานะ",
|
||||
"educationPricingConfirm.cancel": "ใช้แผนปัจจุบันต่อ",
|
||||
"educationPricingConfirm.cancel": "ดำเนินการต่อโดยไม่ใช้ส่วนลด",
|
||||
"educationPricingConfirm.continue": "เปลี่ยนเป็น Professional รายปี",
|
||||
"educationPricingConfirm.description": "ส่วนลดการศึกษาใช้ได้เฉพาะกับแผน Professional รายปีเท่านั้น หากใช้แผนปัจจุบันต่อ จะไม่มีส่วนลดนี้รวมอยู่ด้วย",
|
||||
"educationPricingConfirm.title": "แผนที่คุณเลือกไม่รองรับส่วนลดการศึกษา",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Швидше виконання робочого процесу",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "Ви успішно подали заявку на освітню знижку.",
|
||||
"applied.step2.description": "Виберіть робочий простір, який ви хочете використовувати з освітньою знижкою.",
|
||||
"currentSigned": "В даний момент ви підписані як",
|
||||
"educationPricingConfirm.cancel": "Залишити поточний план",
|
||||
"educationPricingConfirm.cancel": "Продовжити без знижки",
|
||||
"educationPricingConfirm.continue": "Перейти на Professional річний",
|
||||
"educationPricingConfirm.description": "Освітня знижка застосовується лише до річного плану Professional. Якщо залишити поточний план, знижку не буде включено.",
|
||||
"educationPricingConfirm.title": "Вибраний план не підтримує освітню знижку",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "快速工作流执行队列",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "您已成功申请教育优惠。",
|
||||
"applied.step2.description": "选择要使用教育优惠的 workspace。",
|
||||
"currentSigned": "您当前登录的账户是",
|
||||
"educationPricingConfirm.cancel": "保留当前计划",
|
||||
"educationPricingConfirm.cancel": "不使用折扣,继续购买",
|
||||
"educationPricingConfirm.continue": "切换到 Professional 年付",
|
||||
"educationPricingConfirm.description": "教育优惠仅适用于 Professional 年付计划。保留当前计划将不包含该优惠。",
|
||||
"educationPricingConfirm.title": "你选择的计划不支持教育优惠",
|
||||
|
||||
@@ -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": "更快速的工作流程執行",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"applied.step1.description": "您已成功申請教育優惠。",
|
||||
"applied.step2.description": "選擇要使用教育優惠的 workspace。",
|
||||
"currentSigned": "當前以以下身份登入",
|
||||
"educationPricingConfirm.cancel": "保留目前方案",
|
||||
"educationPricingConfirm.cancel": "不使用折扣,繼續購買",
|
||||
"educationPricingConfirm.continue": "切換到 Professional 年付",
|
||||
"educationPricingConfirm.description": "教育優惠僅適用於 Professional 年付方案。保留目前方案將不包含此優惠。",
|
||||
"educationPricingConfirm.title": "你選擇的方案不支援教育優惠",
|
||||
|
||||
Vendored
+5
-2
@@ -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"
|
||||
|
||||
Reference in new issue
Block a user