diff --git a/packages/console/src/consts/plan-quotas.ts b/packages/console/src/consts/plan-quotas.ts new file mode 100644 index 000000000..0dc04854f --- /dev/null +++ b/packages/console/src/consts/plan-quotas.ts @@ -0,0 +1,151 @@ +import { + type SubscriptionPlanTable, + type SubscriptionPlanTableData, + type SubscriptionPlanTableGroupKeyMap, + SubscriptionPlanTableGroupKey, + ReservedPlanName, +} from '@/types/subscriptions'; + +import { ReservedPlanId } from './subscriptions'; + +type EnabledFeatureMap = Record; + +export const customCssEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const appLogoAndFaviconEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const darkModeEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const i18nEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const passwordSignInEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const passwordlessSignInEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const emailConnectorsEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const smsConnectorsEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const userManagementEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const communitySupportEnabledMap: EnabledFeatureMap = { + [ReservedPlanId.free]: true, + [ReservedPlanId.hobby]: true, + [ReservedPlanId.pro]: true, +}; + +export const ticketSupportResponseTimeMap: Record = { + [ReservedPlanId.free]: 0, + [ReservedPlanId.hobby]: 72, + [ReservedPlanId.pro]: 48, +}; + +/** + * Note: this is only for display purpose. + * + * `null` => Unlimited + * `undefined` => Contact + */ +const enterprisePlanTable: SubscriptionPlanTable = { + basePrice: undefined, + mauUnitPrice: undefined, + mauLimit: undefined, + applicationsLimit: undefined, + machineToMachineLimit: undefined, + resourcesLimit: undefined, + scopesPerResourceLimit: undefined, + customDomainEnabled: true, + customCssEnabled: true, + appLogoAndFaviconEnabled: true, + darkModeEnabled: true, + i18nEnabled: true, + omniSignInEnabled: true, + passwordSignInEnabled: true, + passwordlessSignInEnabled: true, + emailConnectorsEnabled: true, + smsConnectorsEnabled: true, + socialConnectorsLimit: undefined, + standardConnectorsLimit: undefined, + userManagementEnabled: true, + rolesLimit: undefined, + scopesPerRoleLimit: undefined, + auditLogsRetentionDays: undefined, + hooksLimit: undefined, + communitySupportEnabled: true, + ticketSupportResponseTime: undefined, +}; + +/** + * Note: this is only for display purpose. + */ +export const enterprisePlanTableData: SubscriptionPlanTableData = { + id: 'enterprise', // Dummy + name: ReservedPlanName.Enterprise, + table: enterprisePlanTable, +}; + +export const planTableGroupKeyMap: SubscriptionPlanTableGroupKeyMap = Object.freeze({ + [SubscriptionPlanTableGroupKey.base]: ['basePrice', 'mauUnitPrice', 'mauLimit'], + [SubscriptionPlanTableGroupKey.applications]: ['applicationsLimit', 'machineToMachineLimit'], + [SubscriptionPlanTableGroupKey.resources]: ['resourcesLimit', 'scopesPerResourceLimit'], + [SubscriptionPlanTableGroupKey.branding]: [ + 'customDomainEnabled', + 'customCssEnabled', + 'appLogoAndFaviconEnabled', + 'darkModeEnabled', + 'i18nEnabled', + ], + [SubscriptionPlanTableGroupKey.userAuthentication]: [ + 'omniSignInEnabled', + 'passwordSignInEnabled', + 'passwordlessSignInEnabled', + 'emailConnectorsEnabled', + 'smsConnectorsEnabled', + 'socialConnectorsLimit', + 'standardConnectorsLimit', + ], + [SubscriptionPlanTableGroupKey.roles]: [ + 'userManagementEnabled', + 'rolesLimit', + 'scopesPerRoleLimit', + ], + [SubscriptionPlanTableGroupKey.auditLogs]: ['auditLogsRetentionDays'], + [SubscriptionPlanTableGroupKey.hooks]: ['hooksLimit'], + [SubscriptionPlanTableGroupKey.support]: ['communitySupportEnabled', 'ticketSupportResponseTime'], +}) satisfies SubscriptionPlanTableGroupKeyMap; diff --git a/packages/console/src/consts/quota-item-phrases.ts b/packages/console/src/consts/quota-item-phrases.ts index 3bc13fd49..b92362e30 100644 --- a/packages/console/src/consts/quota-item-phrases.ts +++ b/packages/console/src/consts/quota-item-phrases.ts @@ -13,7 +13,6 @@ export const quotaItemPhrasesMap: Record< scopesPerResourceLimit: 'scopes_per_resource_limit.name', customDomainEnabled: 'custom_domain_enabled.name', omniSignInEnabled: 'omni_sign_in_enabled.name', - builtInEmailConnectorEnabled: 'built_in_email_connector_enabled.name', socialConnectorsLimit: 'social_connectors_limit.name', standardConnectorsLimit: 'standard_connectors_limit.name', rolesLimit: 'roles_limit.name', @@ -35,7 +34,6 @@ export const quotaItemUnlimitedPhrasesMap: Record< scopesPerResourceLimit: 'scopes_per_resource_limit.unlimited', customDomainEnabled: 'custom_domain_enabled.unlimited', omniSignInEnabled: 'omni_sign_in_enabled.unlimited', - builtInEmailConnectorEnabled: 'built_in_email_connector_enabled.unlimited', socialConnectorsLimit: 'social_connectors_limit.unlimited', standardConnectorsLimit: 'standard_connectors_limit.unlimited', rolesLimit: 'roles_limit.unlimited', @@ -57,7 +55,6 @@ export const quotaItemLimitedPhrasesMap: Record< scopesPerResourceLimit: 'scopes_per_resource_limit.limited', customDomainEnabled: 'custom_domain_enabled.limited', omniSignInEnabled: 'omni_sign_in_enabled.limited', - builtInEmailConnectorEnabled: 'built_in_email_connector_enabled.limited', socialConnectorsLimit: 'social_connectors_limit.limited', standardConnectorsLimit: 'standard_connectors_limit.limited', rolesLimit: 'roles_limit.limited', @@ -79,7 +76,6 @@ export const quotaItemNotEligiblePhrasesMap: Record< scopesPerResourceLimit: 'scopes_per_resource_limit.not_eligible', customDomainEnabled: 'custom_domain_enabled.not_eligible', omniSignInEnabled: 'omni_sign_in_enabled.not_eligible', - builtInEmailConnectorEnabled: 'built_in_email_connector_enabled.not_eligible', socialConnectorsLimit: 'social_connectors_limit.not_eligible', standardConnectorsLimit: 'standard_connectors_limit.not_eligible', rolesLimit: 'roles_limit.not_eligible', diff --git a/packages/console/src/consts/subscriptions.ts b/packages/console/src/consts/subscriptions.ts index c97e5607f..ee62ce7d5 100644 --- a/packages/console/src/consts/subscriptions.ts +++ b/packages/console/src/consts/subscriptions.ts @@ -1,11 +1,3 @@ -import { - type SubscriptionPlanTableData, - ReservedPlanName, - type SubscriptionPlanTable, - type SubscriptionPlanTableGroupKeyMap, - SubscriptionPlanTableGroupKey, -} from '@/types/subscriptions'; - export enum ReservedPlanId { free = 'free', hobby = 'hobby', @@ -18,73 +10,6 @@ export const reservedPlanIdOrder: string[] = [ ReservedPlanId.pro, ]; -export const communitySupportEnabledMap: Record = { - [ReservedPlanName.Free]: true, - [ReservedPlanName.Hobby]: true, - [ReservedPlanName.Pro]: true, - [ReservedPlanName.Enterprise]: true, -}; - -export const ticketSupportResponseTimeMap: Record = { - [ReservedPlanName.Free]: 0, - [ReservedPlanName.Hobby]: 72, - [ReservedPlanName.Pro]: 48, - [ReservedPlanName.Enterprise]: undefined, -}; - -/** - * Note: this is only for display purpose. - * - * `null` => Unlimited - * `undefined` => Contact - */ -const enterprisePlanTable: SubscriptionPlanTable = { - basePrice: undefined, - mauUnitPrice: undefined, - mauLimit: undefined, - applicationsLimit: undefined, - machineToMachineLimit: undefined, - resourcesLimit: undefined, - scopesPerResourceLimit: undefined, - customDomainEnabled: true, - omniSignInEnabled: true, - builtInEmailConnectorEnabled: true, - socialConnectorsLimit: null, - standardConnectorsLimit: undefined, - rolesLimit: undefined, - scopesPerRoleLimit: null, - auditLogsRetentionDays: undefined, - hooksLimit: undefined, - communitySupportEnabled: true, - ticketSupportResponseTime: ticketSupportResponseTimeMap[ReservedPlanName.Enterprise], -}; - -/** - * Note: this is only for display purpose. - */ -export const enterprisePlanTableData: SubscriptionPlanTableData = { - id: 'enterprise', // Dummy - name: ReservedPlanName.Enterprise, - table: enterprisePlanTable, -}; - -export const planTableGroupKeyMap: SubscriptionPlanTableGroupKeyMap = Object.freeze({ - [SubscriptionPlanTableGroupKey.base]: ['basePrice', 'mauUnitPrice', 'mauLimit'], - [SubscriptionPlanTableGroupKey.applications]: ['applicationsLimit', 'machineToMachineLimit'], - [SubscriptionPlanTableGroupKey.resources]: ['resourcesLimit', 'scopesPerResourceLimit'], - [SubscriptionPlanTableGroupKey.branding]: ['customDomainEnabled'], - [SubscriptionPlanTableGroupKey.userAuthentication]: [ - 'omniSignInEnabled', - 'builtInEmailConnectorEnabled', - 'socialConnectorsLimit', - 'standardConnectorsLimit', - ], - [SubscriptionPlanTableGroupKey.roles]: ['rolesLimit', 'scopesPerRoleLimit'], - [SubscriptionPlanTableGroupKey.auditLogs]: ['auditLogsRetentionDays'], - [SubscriptionPlanTableGroupKey.hooks]: ['hooksLimit'], - [SubscriptionPlanTableGroupKey.support]: ['communitySupportEnabled', 'ticketSupportResponseTime'], -}) satisfies SubscriptionPlanTableGroupKeyMap; - export const checkoutStateQueryKey = 'checkout-state'; export const checkoutSuccessCallbackPath = 'checkout-success'; diff --git a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaGroupKeyLabel/index.tsx b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaGroupKeyLabel/index.tsx index 1068ba2a1..7d00e7ca1 100644 --- a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaGroupKeyLabel/index.tsx +++ b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaGroupKeyLabel/index.tsx @@ -14,7 +14,7 @@ const planQuotaGroupKeyPhraseMap: { [SubscriptionPlanTableGroupKey.resources]: 'resource.title', [SubscriptionPlanTableGroupKey.branding]: 'branding.title', [SubscriptionPlanTableGroupKey.userAuthentication]: 'user_authn.title', - [SubscriptionPlanTableGroupKey.roles]: 'roles.title', + [SubscriptionPlanTableGroupKey.roles]: 'user_management.title', [SubscriptionPlanTableGroupKey.hooks]: 'hooks.title', [SubscriptionPlanTableGroupKey.auditLogs]: 'audit_logs.title', [SubscriptionPlanTableGroupKey.support]: 'support.title', diff --git a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaKeyLabel/index.tsx b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaKeyLabel/index.tsx index 06cee7ecc..d039322b0 100644 --- a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaKeyLabel/index.tsx +++ b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/PlanQuotaKeyLabel/index.tsx @@ -9,22 +9,30 @@ const planQuotaKeyPhraseMap: { 'admin_console.subscription.quota_table' >; } = { + basePrice: 'quota.base_price', + mauUnitPrice: 'quota.mau_unit_price', mauLimit: 'quota.mau_limit', applicationsLimit: 'application.total', machineToMachineLimit: 'application.m2m', resourcesLimit: 'resource.resource_count', scopesPerResourceLimit: 'resource.scopes_per_resource', customDomainEnabled: 'branding.custom_domain', + customCssEnabled: 'branding.custom_css', + appLogoAndFaviconEnabled: 'branding.app_logo_and_favicon', + darkModeEnabled: 'branding.dark_mode', + i18nEnabled: 'branding.i18n', omniSignInEnabled: 'user_authn.omni_sign_in', - builtInEmailConnectorEnabled: 'user_authn.built_in_email_connector', + passwordSignInEnabled: 'user_authn.password', + passwordlessSignInEnabled: 'user_authn.passwordless', + emailConnectorsEnabled: 'user_authn.email_connector', + smsConnectorsEnabled: 'user_authn.sms_connector', socialConnectorsLimit: 'user_authn.social_connectors', standardConnectorsLimit: 'user_authn.standard_connectors', - rolesLimit: 'roles.roles', - scopesPerRoleLimit: 'roles.scopes_per_role', - hooksLimit: 'hooks.amount', + userManagementEnabled: 'user_management.user_management', + rolesLimit: 'user_management.roles', + scopesPerRoleLimit: 'user_management.scopes_per_role', + hooksLimit: 'hooks.hooks', auditLogsRetentionDays: 'audit_logs.retention', - basePrice: 'quota.base_price', - mauUnitPrice: 'quota.mau_unit_price', communitySupportEnabled: 'support.community', ticketSupportResponseTime: 'support.customer_ticket', }; diff --git a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/index.tsx b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/index.tsx index 31838e0dd..53153a280 100644 --- a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/index.tsx +++ b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/index.tsx @@ -3,7 +3,7 @@ import { useMemo } from 'react'; import Success from '@/assets/icons/success.svg'; import PlanName from '@/components/PlanName'; -import { enterprisePlanTableData, planTableGroupKeyMap } from '@/consts/subscriptions'; +import { enterprisePlanTableData, planTableGroupKeyMap } from '@/consts/plan-quotas'; import DynamicT from '@/ds-components/DynamicT'; import Table from '@/ds-components/Table'; import { type RowGroup, type Column } from '@/ds-components/Table/types'; diff --git a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/utils.ts b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/utils.ts index 5f40ca751..28accb553 100644 --- a/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/utils.ts +++ b/packages/console/src/pages/TenantSettings/Subscription/PlanQuotaTable/utils.ts @@ -1,5 +1,16 @@ import { conditional, conditionalString } from '@silverhand/essentials'; +import { + appLogoAndFaviconEnabledMap, + customCssEnabledMap, + darkModeEnabledMap, + emailConnectorsEnabledMap, + i18nEnabledMap, + passwordSignInEnabledMap, + passwordlessSignInEnabledMap, + smsConnectorsEnabledMap, + userManagementEnabledMap, +} from '@/consts/plan-quotas'; import { type SubscriptionPlanTableData, type SubscriptionPlan } from '@/types/subscriptions'; export const constructPlanTableDataArray = ( @@ -20,6 +31,15 @@ export const constructPlanTableDataArray = ( mauUnitPrice: stripeProducts .filter(({ type }) => type !== 'flat') .map(({ price: { unitAmountDecimal } }) => conditionalString(unitAmountDecimal)), + customCssEnabled: customCssEnabledMap[id], + appLogoAndFaviconEnabled: appLogoAndFaviconEnabledMap[id], + darkModeEnabled: darkModeEnabledMap[id], + i18nEnabled: i18nEnabledMap[id], + passwordSignInEnabled: passwordSignInEnabledMap[id], + passwordlessSignInEnabled: passwordlessSignInEnabledMap[id], + emailConnectorsEnabled: emailConnectorsEnabledMap[id], + smsConnectorsEnabled: smsConnectorsEnabledMap[id], + userManagementEnabled: userManagementEnabledMap[id], }, }; }); diff --git a/packages/console/src/types/subscriptions.ts b/packages/console/src/types/subscriptions.ts index 80e0001bb..429535541 100644 --- a/packages/console/src/types/subscriptions.ts +++ b/packages/console/src/types/subscriptions.ts @@ -9,7 +9,10 @@ export enum ReservedPlanName { Enterprise = 'Enterprise', } -export type SubscriptionPlanQuota = SubscriptionPlanResponse['quota'] & { +export type SubscriptionPlanQuota = Omit< + SubscriptionPlanResponse['quota'], + 'builtInEmailConnectorEnabled' +> & { communitySupportEnabled: boolean; ticketSupportResponseTime: number; }; @@ -20,8 +23,21 @@ export type SubscriptionPlan = Omit & { export type SubscriptionPlanTable = Partial< SubscriptionPlanQuota & { + // Base quota basePrice: string; mauUnitPrice: string[]; + // UI and branding + customCssEnabled: boolean; + appLogoAndFaviconEnabled: boolean; + darkModeEnabled: boolean; + i18nEnabled: boolean; + // User authn + passwordSignInEnabled: boolean; + passwordlessSignInEnabled: boolean; + emailConnectorsEnabled: boolean; + smsConnectorsEnabled: boolean; + // User management + userManagementEnabled: boolean; } >; diff --git a/packages/console/src/utils/subscription.ts b/packages/console/src/utils/subscription.ts index 6446b9496..343efa5ab 100644 --- a/packages/console/src/utils/subscription.ts +++ b/packages/console/src/utils/subscription.ts @@ -3,22 +3,19 @@ import dayjs from 'dayjs'; import { tryReadResponseErrorBody } from '@/cloud/hooks/use-cloud-api'; import { type SubscriptionPlanResponse } from '@/cloud/types/router'; -import { - communitySupportEnabledMap, - reservedPlanIdOrder, - ticketSupportResponseTimeMap, -} from '@/consts/subscriptions'; +import { communitySupportEnabledMap, ticketSupportResponseTimeMap } from '@/consts/plan-quotas'; +import { reservedPlanIdOrder } from '@/consts/subscriptions'; import { type Invoice } from '@/types/subscriptions'; export const addSupportQuotaToPlan = (subscriptionPlanResponse: SubscriptionPlanResponse) => { - const { name, quota } = subscriptionPlanResponse; + const { id, quota } = subscriptionPlanResponse; return { ...subscriptionPlanResponse, quota: { ...quota, - communitySupportEnabled: communitySupportEnabledMap[name] ?? false, // Fallback to not supported - ticketSupportResponseTime: ticketSupportResponseTimeMap[name] ?? 0, // Fallback to not supported + communitySupportEnabled: communitySupportEnabledMap[id] ?? false, // Fallback to not supported + ticketSupportResponseTime: ticketSupportResponseTimeMap[id] ?? 0, // Fallback to not supported }, }; }; diff --git a/packages/phrases/src/locales/de/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/de/translation/admin-console/subscription/quota-table.ts index e1a5f465c..8a9bcee58 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/subscription/quota-table.ts @@ -1,53 +1,62 @@ const quota_table = { quota: { - title: 'Quota', - tenant_limit: 'Mietergrenze', + title: 'Kontingent', + tenant_limit: 'Tenant-Limit', base_price: 'Grundpreis', mau_unit_price: '* MAU-Einheitspreis', - mau_limit: 'MAU-Grenze', + mau_limit: 'MAU-Limit', }, application: { title: 'Anwendungen', - total: 'Insgesamt', - m2m: 'Maschine zu Maschine', + total: 'Gesamtzahl der Anwendungen', + m2m: 'Maschine-zu-Maschine', }, resource: { title: 'API-Ressourcen', - resource_count: 'Anzahl der Ressourcen', + resource_count: 'Ressourcenanzahl', scopes_per_resource: 'Berechtigungen pro Ressource', }, branding: { - title: 'Branding', + title: 'Benutzeroberfläche und Branding', custom_domain: 'Benutzerdefinierte Domain', + custom_css: 'Benutzerdefiniertes CSS', + app_logo_and_favicon: 'App-Logo und Favicon', + dark_mode: 'Dunkler Modus', + i18n: 'Internationalisierung', }, user_authn: { title: 'Benutzerauthentifizierung', omni_sign_in: 'Omni-Anmeldung', - built_in_email_connector: 'Eingebauter E-Mail-Connector', - social_connectors: 'Soziale Connectoren', - standard_connectors: 'Standard-Connectoren', + password: 'Passwort', + passwordless: 'Passwortlos - E-Mail und SMS', + email_connector: 'E-Mail-Connector', + sms_connector: 'SMS-Connector', + social_connectors: 'Social-Connectors', + standard_connectors: 'Standard-Connectors', + built_in_email_connector: 'Integrierter E-Mail-Connector', }, - roles: { - title: 'Rollen', + user_management: { + title: 'Benutzerverwaltung', + user_management: 'Benutzerverwaltung', roles: 'Rollen', scopes_per_role: 'Berechtigungen pro Rolle', }, audit_logs: { title: 'Prüfprotokolle', - retention: 'Aufbewahrung', + retention: 'Aufbewahrungsdauer', }, hooks: { - title: 'Hooks', - amount: 'Menge', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: 'Support', community: 'Community', - customer_ticket: 'Kundenticket', + customer_ticket: 'Support-Ticket', premium: 'Premium', }, mau_unit_price_footnote: - '* Unsere Einheitspreise können je nach tatsächlichem Ressourcenverbrauch variieren und Logto behält sich das Recht vor, Änderungen der Einheitspreise zu erläutern.', + '* Ihre monatlich aktiven Benutzer (MAU) werden in 3 Stufen unterteilt, basierend darauf, wie oft sie sich während des Abrechnungszeitraums anmelden. Jede Stufe hat einen anderen Preis pro MAU-Einheit.', unlimited: 'Unbegrenzt', contact: 'Kontakt', // eslint-disable-next-line no-template-curly-in-string @@ -56,7 +65,7 @@ const quota_table = { mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} Tag', days_other: '{{count, number}} Tage', - add_on: 'Zusatz', + add_on: 'Zusatzleistung', }; export default quota_table; diff --git a/packages/phrases/src/locales/en/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/en/translation/admin-console/subscription/quota-table.ts index a470631da..a12260e6a 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/subscription/quota-table.ts @@ -8,46 +8,55 @@ const quota_table = { }, application: { title: 'Applications', - total: 'Total', - m2m: 'Machine to machine', + total: 'Total applications', + m2m: 'Machine-to-machine', }, resource: { title: 'API resources', resource_count: 'Resource count', - scopes_per_resource: 'Permission per resource', + scopes_per_resource: 'Permissions per resource', }, branding: { - title: 'Branding', - custom_domain: 'Custom Domain', + title: 'UI and branding', + custom_domain: 'Custom domain', + custom_css: 'Custom CSS', + app_logo_and_favicon: 'App logo and favicon', + dark_mode: 'Dark mode', + i18n: 'Internationalization', }, user_authn: { title: 'User authentication', omni_sign_in: 'Omni sign-in', - built_in_email_connector: 'Built-in email connector', + password: 'Password', + passwordless: 'Passwordless - Email and SMS', + email_connector: 'Email connector', + sms_connector: 'SMS connector', social_connectors: 'Social connectors', standard_connectors: 'Standard connectors', + built_in_email_connector: 'Built-in email connector', }, - roles: { - title: 'Roles', + user_management: { + title: 'User management', + user_management: 'User management', roles: 'Roles', - scopes_per_role: 'Permission per role', + scopes_per_role: 'Permissions per role', }, audit_logs: { title: 'Audit logs', retention: 'Retention', }, hooks: { - title: 'Hooks', - amount: 'Amount', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: 'Support', community: 'Community', - customer_ticket: 'Customer ticket', + customer_ticket: 'Ticket support', premium: 'Premium', }, mau_unit_price_footnote: - '* Our unit prices may vary based on the actual resources consumed, and Logto reserves the right to explain any changes in unit prices.', + '* Your monthly active users (MAU) are divided into 3 tiers based on how often they log in during the billing cycle. Each tier has a different price per MAU unit.', unlimited: 'Unlimited', contact: 'Contact', // eslint-disable-next-line no-template-curly-in-string diff --git a/packages/phrases/src/locales/es/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/es/translation/admin-console/subscription/quota-table.ts index 585c6e3b0..049fec11a 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/subscription/quota-table.ts @@ -1,34 +1,43 @@ const quota_table = { quota: { title: 'Cuota', - tenant_limit: 'Límite de inquilino', + tenant_limit: 'Límite de inquilinos', base_price: 'Precio base', - mau_unit_price: '* Precio unitario MAU', + mau_unit_price: '* Precio unitario de MAU', mau_limit: 'Límite de MAU', }, application: { title: 'Aplicaciones', - total: 'Total', - m2m: 'Máquina a máquina', + total: 'Total de aplicaciones', + m2m: 'Aplicación machine-to-machine', }, resource: { - title: 'Recursos API', - resource_count: 'Recuento de recursos', + title: 'Recursos de API', + resource_count: 'Cantidad de recursos', scopes_per_resource: 'Permisos por recurso', }, branding: { - title: 'Branding', + title: 'Interfaz de usuario y branding', custom_domain: 'Dominio personalizado', + custom_css: 'CSS personalizado', + app_logo_and_favicon: 'Logo de la aplicación y favicon', + dark_mode: 'Modo oscuro', + i18n: 'Internacionalización', }, user_authn: { title: 'Autenticación de usuario', - omni_sign_in: 'Inicio de sesión Omni', - built_in_email_connector: 'Conector de correo electrónico incorporado', + omni_sign_in: 'Inicio de sesión omnicanal', + password: 'Contraseña', + passwordless: 'Sin contraseña - Correo electrónico y SMS', + email_connector: 'Conector de correo electrónico', + sms_connector: 'Conector de SMS', social_connectors: 'Conectores sociales', standard_connectors: 'Conectores estándar', + built_in_email_connector: 'Conector de correo electrónico incorporado', }, - roles: { - title: 'Roles', + user_management: { + title: 'Gestión de usuarios', + user_management: 'Gestión de usuarios', roles: 'Roles', scopes_per_role: 'Permisos por rol', }, @@ -37,18 +46,18 @@ const quota_table = { retention: 'Retención', }, hooks: { - title: 'Hooks', - amount: 'Cantidad', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: 'Soporte', community: 'Comunidad', - customer_ticket: 'Ticket de cliente', + customer_ticket: 'Ticket de soporte', premium: 'Premium', }, mau_unit_price_footnote: - '* Nuestras tarifas unitarias pueden variar según los recursos consumidos y Logto se reserva el derecho de explicar cualquier cambio en las tarifas unitarias.', - unlimited: 'Sin límites', + '* Sus usuarios activos mensuales (MAU) se dividen en 3 niveles según la frecuencia con la que inician sesión durante el ciclo de facturación. Cada nivel tiene un precio diferente por unidad de MAU.', + unlimited: 'Ilimitado', contact: 'Contacto', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/mes', @@ -56,7 +65,7 @@ const quota_table = { mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} día', days_other: '{{count, number}} días', - add_on: 'Agregar', + add_on: 'Complemento', }; export default quota_table; diff --git a/packages/phrases/src/locales/fr/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/fr/translation/admin-console/subscription/quota-table.ts index b705a2607..82529f3a8 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/subscription/quota-table.ts @@ -1,62 +1,71 @@ const quota_table = { quota: { title: 'Quota', - tenant_limit: 'Limite du locataire', + tenant_limit: 'Limite de locataire', base_price: 'Prix de base', mau_unit_price: '* Prix unitaire MAU', mau_limit: 'Limite MAU', }, application: { title: 'Applications', - total: 'Total', - m2m: 'Machine à machine', + total: 'Total des applications', + m2m: 'Machine-à-machine', }, resource: { - title: 'API resources', + title: 'Ressources API', resource_count: 'Nombre de ressources', scopes_per_resource: 'Autorisations par ressource', }, branding: { - title: 'Branding', + title: 'Interface utilisateur et branding', custom_domain: 'Domaine personnalisé', + custom_css: 'CSS personnalisé', + app_logo_and_favicon: "Logo et favicon de l'application", + dark_mode: 'Mode sombre', + i18n: 'Internationalisation', }, user_authn: { - title: 'Authentification utilisateur', - omni_sign_in: 'Connexion omni', - built_in_email_connector: 'Connecteur de messagerie intégré', + title: 'Authentification des utilisateurs', + omni_sign_in: 'Connexion omnicanale', + password: 'Mot de passe', + passwordless: 'Sans mot de passe - Email et SMS', + email_connector: 'Connecteur email', + sms_connector: 'Connecteur SMS', social_connectors: 'Connecteurs sociaux', standard_connectors: 'Connecteurs standards', + built_in_email_connector: 'Connecteur email intégré', }, - roles: { - title: 'Rôles', + user_management: { + title: 'Gestion des utilisateurs', + user_management: 'Gestion des utilisateurs', roles: 'Rôles', scopes_per_role: 'Autorisations par rôle', }, audit_logs: { - title: 'Journaux d’audit', + title: "Journaux d'audit", retention: 'Conservation', }, hooks: { - title: 'Hooks', - amount: 'Montant', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: 'Support', community: 'Communauté', - customer_ticket: 'Ticket client', + customer_ticket: 'Ticket de support', premium: 'Premium', }, mau_unit_price_footnote: - '* Nos prix unitaires peuvent varier en fonction des ressources réellement consommées, et Logto se réserve le droit d’expliquer tout changement de prix unitaire.', + '* Vos utilisateurs actifs mensuels (MAU) sont répartis en 3 niveaux en fonction de la fréquence à laquelle ils se connectent pendant le cycle de facturation. Chaque niveau a un prix différent par unité MAU.', unlimited: 'Illimité', contact: 'Contact', // eslint-disable-next-line no-template-curly-in-string - monthly_price: '${{value, number}}/mois', + monthly_price: '${{value, number}}/mo', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} jour', days_other: '{{count, number}} jours', - add_on: 'Complément', + add_on: 'Module complémentaire', }; export default quota_table; diff --git a/packages/phrases/src/locales/it/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/it/translation/admin-console/subscription/quota-table.ts index b43e4a077..38cfe0479 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/subscription/quota-table.ts @@ -1,34 +1,43 @@ const quota_table = { quota: { title: 'Quota', - tenant_limit: 'Limite del tenant', + tenant_limit: 'Limite tenant', base_price: 'Prezzo base', mau_unit_price: '* Prezzo unitario MAU', mau_limit: 'Limite MAU', }, application: { title: 'Applicazioni', - total: 'Totale', - m2m: 'Machine to machine', + total: 'Totale applicazioni', + m2m: 'Machine-to-machine', }, resource: { title: 'Risorse API', - resource_count: 'Conteggio risorse', + resource_count: 'Numero di risorse', scopes_per_resource: 'Permessi per risorsa', }, branding: { - title: 'Branding', + title: 'UI e branding', custom_domain: 'Dominio personalizzato', + custom_css: 'CSS personalizzato', + app_logo_and_favicon: "Logo e favicon dell'applicazione", + dark_mode: 'Modalità scura', + i18n: 'Internazionalizzazione', }, user_authn: { title: 'Autenticazione utente', - omni_sign_in: 'Accesso omni', - built_in_email_connector: 'Connettore email integrato', + omni_sign_in: 'Accesso onnicomprensivo', + password: 'Password', + passwordless: 'Senza password - E-mail e SMS', + email_connector: 'Connettore e-mail', + sms_connector: 'Connettore SMS', social_connectors: 'Connettori sociali', standard_connectors: 'Connettori standard', + built_in_email_connector: 'Connettore e-mail integrato', }, - roles: { - title: 'Ruoli', + user_management: { + title: 'Gestione utenti', + user_management: 'Gestione utenti', roles: 'Ruoli', scopes_per_role: 'Permessi per ruolo', }, @@ -37,26 +46,26 @@ const quota_table = { retention: 'Conservazione', }, hooks: { - title: 'Hooks', - amount: 'Quantità', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { - title: 'Supporto', + title: 'Assistenza', community: 'Community', - customer_ticket: 'Ticket per il cliente', + customer_ticket: 'Ticket di assistenza', premium: 'Premium', }, mau_unit_price_footnote: - '* I nostri prezzi unitari possono variare in base alle risorse effettivamente consumate e Logto si riserva il diritto di spiegare eventuali variazioni dei prezzi unitari.', + "* I vostri utenti attivi mensili (MAU) sono divisi in 3 livelli in base a quante volte effettuano l'accesso durante il ciclo di fatturazione. Ogni livello ha un prezzo diverso per unità MAU.", unlimited: 'Illimitato', - contact: 'Contatto', + contact: 'Contatta', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/mese', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} giorno', days_other: '{{count, number}} giorni', - add_on: 'Aggiungi', + add_on: 'Aggiuntiva', }; export default quota_table; diff --git a/packages/phrases/src/locales/ja/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/ja/translation/admin-console/subscription/quota-table.ts index 3b2a665dc..b803fe1a6 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/subscription/quota-table.ts @@ -1,6 +1,6 @@ const quota_table = { quota: { - title: 'クオータ', + title: 'クォータ', tenant_limit: 'テナント制限', base_price: '基本価格', mau_unit_price: '* MAU単価', @@ -8,8 +8,8 @@ const quota_table = { }, application: { title: 'アプリケーション', - total: '合計', - m2m: '機械間', + total: '総アプリケーション数', + m2m: 'マシン・ツー・マシン', }, resource: { title: 'APIリソース', @@ -17,18 +17,27 @@ const quota_table = { scopes_per_resource: 'リソースごとの権限', }, branding: { - title: 'ブランディング', + title: 'UIとブランディング', custom_domain: 'カスタムドメイン', + custom_css: 'カスタムCSS', + app_logo_and_favicon: 'アプリロゴとFavicon', + dark_mode: 'ダークモード', + i18n: '国際化', }, user_authn: { title: 'ユーザー認証', omni_sign_in: 'オムニサインイン', - built_in_email_connector: '組み込みメールコネクタ', + password: 'パスワード', + passwordless: 'パスワードレス - E-mailとSMS', + email_connector: 'E-mailコネクタ', + sms_connector: 'SMSコネクタ', social_connectors: 'ソーシャルコネクタ', - standard_connectors: '標準コネクタ', + standard_connectors: 'スタンダードコネクタ', + built_in_email_connector: '組み込みE-mailコネクタ', }, - roles: { - title: 'ロール', + user_management: { + title: 'ユーザー管理', + user_management: 'ユーザー管理', roles: 'ロール', scopes_per_role: 'ロールごとの権限', }, @@ -37,25 +46,25 @@ const quota_table = { retention: '保持期間', }, hooks: { - title: 'フック', - amount: '量', + title: 'ウェブフック', + hooks: 'ウェブフック', }, support: { title: 'サポート', community: 'コミュニティ', - customer_ticket: '顧客チケット', + customer_ticket: 'サポートチケット', premium: 'プレミアム', }, mau_unit_price_footnote: - '* 実際に消費されるリソースに基づいて単価が変動する場合があり、Logtoは単価変更の説明をする権利を留保します。', + '* 月間アクティブユーザー(MAU)は、請求サイクル中のログイン頻度に基づいて3つの階層に分かれます。各階層ごとに異なるMAU単価が適用されます。', unlimited: '無制限', - contact: '連絡先', + contact: 'お問い合わせ', // eslint-disable-next-line no-template-curly-in-string - monthly_price: '月額${{value, number}}', + monthly_price: '${{value, number}}/mo', // eslint-disable-next-line no-template-curly-in-string - mau_price: 'MAUあたり${{value, number}}', - days_one: '{{count, number}} 日', - days_other: '{{count, number}} 日', + mau_price: '${{value, number}}/MAU', + days_one: '{{count, number}}日', + days_other: '{{count, number}}日', add_on: 'アドオン', }; diff --git a/packages/phrases/src/locales/ko/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/ko/translation/admin-console/subscription/quota-table.ts index e6709cb53..78d916a37 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/subscription/quota-table.ts @@ -1,6 +1,6 @@ const quota_table = { quota: { - title: '배정량', + title: '할당량', tenant_limit: '테넌트 제한', base_price: '기본 가격', mau_unit_price: '* MAU 단가', @@ -8,48 +8,57 @@ const quota_table = { }, application: { title: '애플리케이션', - total: '총계', - m2m: '기계 간 통신', + total: '총 애플리케이션 수', + m2m: '머신 투 머신', }, resource: { - title: 'API 자원', - resource_count: '자원 개수', - scopes_per_resource: '자원 당 권한', + title: 'API 리소스', + resource_count: '리소스 수', + scopes_per_resource: '리소스 당 권한', }, branding: { - title: '브랜딩', + title: 'UI 및 브랜딩', custom_domain: '사용자 정의 도메인', + custom_css: '사용자 정의 CSS', + app_logo_and_favicon: '앱 로고와 파비콘', + dark_mode: '다크 모드', + i18n: '국제화', }, user_authn: { title: '사용자 인증', - omni_sign_in: '옴니 로그인', - built_in_email_connector: '내장 이메일 커넥터', + omni_sign_in: '옴니 사인인', + password: '비밀번호', + passwordless: '비밀번호 없음 - 이메일과 SMS', + email_connector: '이메일 커넥터', + sms_connector: 'SMS 커넥터', social_connectors: '소셜 커넥터', standard_connectors: '표준 커넥터', + built_in_email_connector: '내장 이메일 커넥터', }, - roles: { - title: '역할', + user_management: { + title: '사용자 관리', + user_management: '사용자 관리', roles: '역할', scopes_per_role: '역할 당 권한', }, audit_logs: { title: '감사 로그', - retention: '유지 기간', + retention: '보존 기간', }, hooks: { - title: '후크', - amount: '수량', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: '지원', community: '커뮤니티', - customer_ticket: '고객 문의', + customer_ticket: '지원 티켓', premium: '프리미엄', }, mau_unit_price_footnote: - '* 실제 사용된 리소스에 따라 단가가 달라질 수 있으며, Logto는 단가 변경에 대한 설명을 예약합니다.', + '* 월간 활성 사용자(MAU)는 청구 주기 동안 로그인 빈도에 따라 3단계로 나뉩니다. 각 단계마다 달리 책정되는 MAU 단가가 있습니다.', unlimited: '무제한', - contact: '연락', + contact: '문의', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/월', // eslint-disable-next-line no-template-curly-in-string diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/subscription/quota-table.ts index fab5b3411..11f946fef 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/subscription/quota-table.ts @@ -1,15 +1,15 @@ const quota_table = { quota: { title: 'Limit', - tenant_limit: 'Limit dzierżawcy', + tenant_limit: 'Limit lokatora', base_price: 'Cena podstawowa', - mau_unit_price: '* Cena jednostkowa MAU', + mau_unit_price: '* Cena za MAU', mau_limit: 'Limit MAU', }, application: { title: 'Aplikacje', - total: 'Razem', - m2m: 'Maszyna do maszyny', + total: 'Liczba aplikacji', + m2m: 'Aplikacja typu maszyna-maszyna', }, resource: { title: 'Zasoby API', @@ -17,41 +17,50 @@ const quota_table = { scopes_per_resource: 'Uprawnienia na zasób', }, branding: { - title: 'Brandowanie', - custom_domain: 'Niestandardowa domena', + title: 'Interfejs użytkownika i branding', + custom_domain: 'Domena niestandardowa', + custom_css: 'Niestandardowy CSS', + app_logo_and_favicon: 'Logo aplikacji i ikona', + dark_mode: 'Tryb ciemny', + i18n: 'Internacjonalizacja', }, user_authn: { - title: 'Uwierzytelnianie użytkownika', + title: 'Uwierzytelnianie użytkowników', omni_sign_in: 'Omni logowanie', - built_in_email_connector: 'Wbudowany konektor e-mailowy', - social_connectors: 'Konektory społecznościowe', - standard_connectors: 'Standardowe konektory', + password: 'Hasło', + passwordless: 'Logowanie bez hasła - E-mail i SMS', + email_connector: 'Podłączenie e-mail', + sms_connector: 'Podłączenie SMS', + social_connectors: 'Podłączenia społecznościowe', + standard_connectors: 'Standardowe podłączenia', + built_in_email_connector: 'Wbudowane podłączenie e-mail', }, - roles: { - title: 'Role', + user_management: { + title: 'Zarządzanie użytkownikami', + user_management: 'Zarządzanie użytkownikami', roles: 'Role', scopes_per_role: 'Uprawnienia na rolę', }, audit_logs: { - title: 'Dzienniki audytu', - retention: 'Zatrzymanie', + title: 'Logi audytu', + retention: 'Okres przechowywania', }, hooks: { - title: 'Hooks', - amount: 'Liczba', + title: 'Webhooki', + hooks: 'Webhooki', }, support: { title: 'Wsparcie', community: 'Społeczność', - customer_ticket: 'Bilet klienta', + customer_ticket: 'Zgłoszenie wsparcia', premium: 'Premium', }, mau_unit_price_footnote: - '* Nasze ceny jednostkowe mogą się różnić w zależności od faktycznie zużywanych zasobów, a Logto zastrzega sobie prawo do wyjaśnienia ewentualnych zmian cen jednostkowych.', - unlimited: 'Bez ograniczeń', + '* Aktywni użytkownicy miesięcznie (MAU) są podzieleni na 3 poziomy w zależności od częstotliwości logowania się w okresie rozliczeniowym. Każdy poziom ma inną cenę za jednostkę MAU.', + unlimited: 'Nieograniczone', contact: 'Kontakt', // eslint-disable-next-line no-template-curly-in-string - monthly_price: '${{value, number}}/mc', + monthly_price: '${{value, number}}/mies.', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} dzień', diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/subscription/quota-table.ts index 1a3c17b02..2828d8899 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/subscription/quota-table.ts @@ -1,53 +1,62 @@ const quota_table = { quota: { title: 'Cota', - tenant_limit: 'Limite de locatários', + tenant_limit: 'Limite de inquilino', base_price: 'Preço base', - mau_unit_price: '* Preço unitário do MAU', + mau_unit_price: '* Preço unitário de MAU', mau_limit: 'Limite de MAU', }, application: { title: 'Aplicações', - total: 'Total', - m2m: 'Máquina para máquina', + total: 'Total de aplicações', + m2m: 'Aplicação máquina-a-máquina', }, resource: { - title: 'Recursos da API', + title: 'Recursos de API', resource_count: 'Contagem de recursos', scopes_per_resource: 'Permissões por recurso', }, branding: { - title: 'Marca', + title: 'Interface de usuário e branding', custom_domain: 'Domínio personalizado', + custom_css: 'CSS personalizado', + app_logo_and_favicon: 'Logotipo da aplicação e favicon', + dark_mode: 'Modo escuro', + i18n: 'Internacionalização', }, user_authn: { title: 'Autenticação de usuário', - omni_sign_in: 'Omni sign-in', - built_in_email_connector: 'Conector de e-mail incorporado', + omni_sign_in: 'Entrada Omni', + password: 'Senha', + passwordless: 'Sem senha - E-mail e SMS', + email_connector: 'Conector de e-mail', + sms_connector: 'Conector de SMS', social_connectors: 'Conectores sociais', standard_connectors: 'Conectores padrão', + built_in_email_connector: 'Conector de e-mail integrado', }, - roles: { - title: 'Funções', + user_management: { + title: 'Gerenciamento de usuários', + user_management: 'Gerenciamento de usuários', roles: 'Funções', scopes_per_role: 'Permissões por função', }, audit_logs: { - title: 'Logs de auditoria', + title: 'Registros de auditoria', retention: 'Retenção', }, hooks: { - title: 'Hooks', - amount: 'Quantidade', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: 'Suporte', community: 'Comunidade', - customer_ticket: 'Ticket do cliente', + customer_ticket: 'Ticket de suporte', premium: 'Premium', }, mau_unit_price_footnote: - '* Nossos preços unitários podem variar com base nos recursos consumidos reais, e o Logto reserva o direito de explicar quaisquer alterações nos preços unitários.', + '* Seus usuários ativos mensais (MAU) são divididos em 3 níveis com base em quantas vezes eles fazem login durante o ciclo de faturamento. Cada nível tem um preço diferente por unidade de MAU.', unlimited: 'Ilimitado', contact: 'Contato', // eslint-disable-next-line no-template-curly-in-string @@ -56,7 +65,7 @@ const quota_table = { mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} dia', days_other: '{{count, number}} dias', - add_on: 'Adicionar', + add_on: 'Adicional', }; export default quota_table; diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/subscription/quota-table.ts index 817548c0c..e44ccdb20 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/subscription/quota-table.ts @@ -3,60 +3,69 @@ const quota_table = { title: 'Quota', tenant_limit: 'Limite do inquilino', base_price: 'Preço base', - mau_unit_price: '* Preço unitário do MAU', - mau_limit: 'Limite do MAU', + mau_unit_price: '* Preço unitário MAU', + mau_limit: 'Limite MAU', }, application: { title: 'Aplicações', - total: 'Total', - m2m: 'Máquina a máquina', + total: 'Total de aplicações', + m2m: 'Aplicações de máquina para máquina', }, resource: { title: 'Recursos da API', resource_count: 'Contagem de recursos', - scopes_per_resource: 'Permissão por recurso', + scopes_per_resource: 'Permissões por recurso', }, branding: { - title: 'Marca', + title: 'UI e branding', custom_domain: 'Domínio personalizado', + custom_css: 'CSS personalizado', + app_logo_and_favicon: 'Logótipo da aplicação e favicon', + dark_mode: 'Modo escuro', + i18n: 'Internacionalização', }, user_authn: { - title: 'Autenticação do usuário', - omni_sign_in: 'Omni sign-in', - built_in_email_connector: 'Conector de e-mail incorporado', + title: 'Autenticação do utilizador', + omni_sign_in: 'Início de sessão Omni', + password: 'Palavra-passe', + passwordless: 'Sem palavra-passe - E-mail e SMS', + email_connector: 'Conector de e-mail', + sms_connector: 'Conector de SMS', social_connectors: 'Conectores sociais', standard_connectors: 'Conectores padrão', + built_in_email_connector: 'Conector de e-mail incorporado', }, - roles: { - title: 'Funções', + user_management: { + title: 'Gestão de utilizadores', + user_management: 'Gestão de utilizadores', roles: 'Funções', - scopes_per_role: 'Permissão por função', + scopes_per_role: 'Permissões por função', }, audit_logs: { - title: 'Registos de Auditoria', + title: 'Registos de auditoria', retention: 'Retenção', }, hooks: { title: 'Hooks', - amount: 'Quantidade', + hooks: 'Hooks', }, support: { title: 'Suporte', community: 'Comunidade', - customer_ticket: 'Bilhete de cliente', + customer_ticket: 'Bilhete de suporte', premium: 'Premium', }, mau_unit_price_footnote: - '* Nossos preços unitários podem variar de acordo com os recursos reais consumidos, e a Logto reserva-se o direito de explicar quaisquer alterações nos preços unitários.', + '* Os seus utilizadores ativos mensais (MAU) são divididos em 3 níveis com base na frequência com que iniciam sessão durante o ciclo de faturação. Cada nível tem um preço diferente por unidade de MAU.', unlimited: 'Ilimitado', - contact: 'Contacto', + contact: 'Contactar', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/mês', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} dia', days_other: '{{count, number}} dias', - add_on: 'Adicionar', + add_on: 'Suplemento', }; export default quota_table; diff --git a/packages/phrases/src/locales/ru/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/ru/translation/admin-console/subscription/quota-table.ts index 9da6938f5..2cca3f6b5 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/subscription/quota-table.ts @@ -3,60 +3,69 @@ const quota_table = { title: 'Квота', tenant_limit: 'Лимит арендатора', base_price: 'Базовая цена', - mau_unit_price: '* Цена за MAU', - mau_limit: 'Лимит MAU', + mau_unit_price: '* Цена за активного пользователя (MAU)', + mau_limit: 'Лимит активных пользователей (MAU)', }, application: { title: 'Приложения', - total: 'Всего', - m2m: 'Машина к машине', + total: 'Всего приложений', + m2m: 'Приложения "машина-машина"', }, resource: { - title: 'API ресурсы', + title: 'Ресурсы API', resource_count: 'Количество ресурсов', scopes_per_resource: 'Разрешения на ресурс', }, branding: { - title: 'Брендинг', + title: 'Интерфейс и брендинг', custom_domain: 'Пользовательский домен', + custom_css: 'Пользовательский CSS', + app_logo_and_favicon: 'Логотип и фавикон приложения', + dark_mode: 'Темный режим', + i18n: 'Интернационализация', }, user_authn: { - title: 'Аутентификация пользователя', - omni_sign_in: 'Omni вход', - built_in_email_connector: 'Встроенный электронный коннектор', - social_connectors: 'Социальные коннекторы', - standard_connectors: 'Стандартные коннекторы', + title: 'Проверка подлинности пользователя', + omni_sign_in: 'Многочисленные входы', + password: 'Пароль', + passwordless: 'Без пароля - Электронная почта и SMS', + email_connector: 'Подключение электронной почты', + sms_connector: 'Подключение SMS', + social_connectors: 'Социальные подключения', + standard_connectors: 'Стандартные подключения', + built_in_email_connector: 'Встроенное подключение электронной почты', }, - roles: { - title: 'Роли', + user_management: { + title: 'Управление пользователями', + user_management: 'Управление пользователями', roles: 'Роли', scopes_per_role: 'Разрешения на роль', }, audit_logs: { - title: 'Аудит', - retention: 'Хранение', + title: 'Аудит журналов', + retention: 'Сохранение', }, hooks: { - title: 'Хуки', - amount: 'Количество', + title: 'Вебхуки', + hooks: 'Вебхуки', }, support: { title: 'Поддержка', community: 'Сообщество', - customer_ticket: 'Техническая заявка', + customer_ticket: 'Техническая поддержка', premium: 'Премиум', }, mau_unit_price_footnote: - '* Цены наших единиц могут изменяться в зависимости от фактически используемых ресурсов, и Logto оставляет за собой право объяснить любые изменения в ценах за единицу.', - unlimited: 'Неограниченный', - contact: 'Связаться с нами', + '* Ваши активные пользователи в месяц (MAU) разделены на 3 уровня в зависимости от того, как часто они входят в систему в течение биллингового периода. Каждый уровень имеет свою стоимость за единицу MAU.', + unlimited: 'Неограниченно', + contact: 'Связаться', // eslint-disable-next-line no-template-curly-in-string - monthly_price: '${{value, number}}/месяц', + monthly_price: '${{value, number}}/мес.', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} день', days_other: '{{count, number}} дней', - add_on: 'Дополнительный', + add_on: 'Дополнительно', }; export default quota_table; diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/subscription/quota-table.ts index 815a44d65..b75ae6f70 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/subscription/quota-table.ts @@ -1,53 +1,62 @@ const quota_table = { quota: { title: 'Kota', - tenant_limit: 'Kiracı sınırlaması', + tenant_limit: 'Kiracı limiti', base_price: 'Temel fiyat', - mau_unit_price: '* MAU birim fiyatı', - mau_limit: 'MAU sınırlaması', + mau_unit_price: '* Aylık Etkin Kullanıcı (MAU) birim fiyatı', + mau_limit: 'MAU limiti', }, application: { title: 'Uygulamalar', - total: 'Toplam', - m2m: 'Makineye Makine', + total: 'Toplam uygulama sayısı', + m2m: 'Makine-makine uygulamaları', }, resource: { - title: 'API kaynakları', + title: 'API Kaynakları', resource_count: 'Kaynak sayısı', - scopes_per_resource: 'Kaynak başına izin', + scopes_per_resource: 'Kaynak başına izinler', }, branding: { - title: 'Markalama', - custom_domain: 'Özel Alan Adı', + title: 'Kullanıcı Arayüzü ve Markalama', + custom_domain: 'Özel alan adı', + custom_css: 'Özel CSS', + app_logo_and_favicon: 'Uygulama logoları ve favicon', + dark_mode: 'Karanlık mod', + i18n: 'Uluslararasılaştırma', }, user_authn: { - title: 'Kullanıcı yetkilendirmesi', - omni_sign_in: 'Omni girişi', - built_in_email_connector: 'Dahili e-posta bağlayıcısı', + title: 'Kullanıcı Kimlik Doğrulama', + omni_sign_in: 'Çoklu oturum açma', + password: 'Parola', + passwordless: 'Parolasız - E-posta ve SMS', + email_connector: 'E-posta bağlayıcı', + sms_connector: 'SMS bağlayıcı', social_connectors: 'Sosyal bağlayıcılar', standard_connectors: 'Standart bağlayıcılar', + built_in_email_connector: 'Dahili e-posta bağlayıcısı', }, - roles: { - title: 'Roller', + user_management: { + title: 'Kullanıcı Yönetimi', + user_management: 'Kullanıcı Yönetimi', roles: 'Roller', - scopes_per_role: 'Rol başına izin', + scopes_per_role: 'Rol başına izinler', }, audit_logs: { - title: 'Denetim günlükleri', + title: 'Denetim Günlükleri', retention: 'Saklama', }, hooks: { - title: 'Hooks', - amount: 'Miktar', + title: 'Web Kancaları', + hooks: 'Web Kancaları', }, support: { title: 'Destek', community: 'Topluluk', - customer_ticket: 'Müşteri bileti', + customer_ticket: 'Müşteri destek bileti', premium: 'Premium', }, mau_unit_price_footnote: - '* Gerçek kaynakların tüketimine bağlı olarak birim fiyatlarımız değişebilir ve Logto, birim fiyatlardaki değişikliklerin açıklamasını yapma hakkını saklı tutar.', + '* Aylık etkin kullanıcılarınız (MAU), faturalandırma dönemi boyunca ne sıklıkla oturum açtıklarına göre 3 düzeye ayrılır. Her düzeyin farklı bir MAU birim fiyatı vardır.', unlimited: 'Sınırsız', contact: 'İletişim', // eslint-disable-next-line no-template-curly-in-string @@ -56,7 +65,7 @@ const quota_table = { mau_price: '${{value, number}}/MAU', days_one: '{{count, number}} gün', days_other: '{{count, number}} gün', - add_on: 'Ek fonksiyon', + add_on: 'Ek Hizmet', }; export default quota_table; diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/subscription/quota-table.ts index 6e9eaee08..6455db28a 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/subscription/quota-table.ts @@ -2,52 +2,61 @@ const quota_table = { quota: { title: '配额', tenant_limit: '租户限制', - base_price: '基础价格', - mau_unit_price: '* MAU单价', - mau_limit: 'MAU限制', + base_price: '基本价格', + mau_unit_price: '* 每活跃用户(MAU)单价', + mau_limit: 'MAU 限制', }, application: { title: '应用', - total: '总数', + total: '总应用数', m2m: '机器对机器', }, resource: { - title: 'API资源', - resource_count: '资源数', - scopes_per_resource: '每个资源的权限', + title: 'API 资源', + resource_count: '资源数量', + scopes_per_resource: '每资源权限', }, branding: { - title: '品牌', + title: '界面与品牌', custom_domain: '自定义域名', + custom_css: '自定义 CSS', + app_logo_and_favicon: '应用图标与网站图标', + dark_mode: '深色模式', + i18n: '国际化', }, user_authn: { - title: '用户身份验证', + title: '用户认证', omni_sign_in: '全渠道登录', + password: '密码', + passwordless: '免密码登录 - 电子邮件和短信', + email_connector: '电子邮件连接器', + sms_connector: '短信连接器', + social_connectors: '社交连接器', + standard_connectors: '标准连接器', built_in_email_connector: '内置电子邮件连接器', - social_connectors: '社会化登录连接器', - standard_connectors: '标准登录连接器', }, - roles: { - title: '角色', + user_management: { + title: '用户管理', + user_management: '用户管理', roles: '角色', - scopes_per_role: '每个角色的权限', + scopes_per_role: '每角色权限', }, audit_logs: { title: '审计日志', - retention: '保留时间', + retention: '保留期限', }, hooks: { - title: 'Hooks', - amount: '数量', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: '支持', community: '社区', - customer_ticket: '客户工单', - premium: '高级', + customer_ticket: '客户支持票据', + premium: '高级版', }, mau_unit_price_footnote: - '*我们的计费单价可能根据实际消耗的资源变化,并且Logto有权解释单价的任何变动。', + '* 您的每月活跃用户(MAU)根据在结算周期内登录的频率分为3个层级。每个层级的MAU单价不同。', unlimited: '无限制', contact: '联系', // eslint-disable-next-line no-template-curly-in-string diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/subscription/quota-table.ts index 7668fdcd0..5a4bfc2eb 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/subscription/quota-table.ts @@ -1,62 +1,71 @@ const quota_table = { quota: { - title: '額度', + title: '配額', tenant_limit: '租戶限制', base_price: '基本價格', - mau_unit_price: '* MAU 單價', + mau_unit_price: '* 每月活躍用戶(MAU)單價', mau_limit: 'MAU 限制', }, application: { title: '應用程式', - total: '總計', - m2m: 'Machine to machine', + total: '應用程式總數', + m2m: '機器到機器', }, resource: { title: 'API 資源', resource_count: '資源數量', - scopes_per_resource: '每個資源的權限', + scopes_per_resource: '每資源權限', }, branding: { - title: '品牌', + title: '用戶界面與品牌', custom_domain: '自訂網域', + custom_css: '自訂 CSS', + app_logo_and_favicon: '應用程式徽標和網站圖示', + dark_mode: '深色模式', + i18n: '國際化', }, user_authn: { - title: '用戶身份驗證', - omni_sign_in: 'Omni 登入', - built_in_email_connector: '內建電子郵件連接器', + title: '用戶認證', + omni_sign_in: '萬用登錄', + password: '密碼', + passwordless: '免密碼登錄 - 電子郵件和短信', + email_connector: '電子郵件連接器', + sms_connector: '短信連接器', social_connectors: '社交連接器', standard_connectors: '標準連接器', + built_in_email_connector: '內置電子郵件連接器', }, - roles: { - title: '角色', + user_management: { + title: '用戶管理', + user_management: '用戶管理', roles: '角色', - scopes_per_role: '每個角色的權限', + scopes_per_role: '每角色權限', }, audit_logs: { - title: '審計日誌', - retention: '保留時間', + title: '審核日誌', + retention: '保留期限', }, hooks: { - title: 'Hooks', - amount: '數量', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: '支援', community: '社群', - customer_ticket: '客戶工單', - premium: '高級', + customer_ticket: '客戶支援票據', + premium: '高級版', }, mau_unit_price_footnote: - '* 根據實際消耗的資源,我們的單價可能會有所不同,Logto 保留解釋單價變化的權利。', - unlimited: '不限制', - contact: '聯絡方式', + '* 您的每月活躍用戶(MAU)將根據在結算週期內登錄的頻率分為3個層級。每個層級都有不同的MAU單價。', + unlimited: '無限制', + contact: '聯絡', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/月', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', - days_one: '{{count, number}} 天', - days_other: '{{count, number}} 天', - add_on: '附加選項', + days_one: '{{count, number}}天', + days_other: '{{count, number}}天', + add_on: '附加功能', }; export default quota_table; diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/subscription/quota-table.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/subscription/quota-table.ts index a8166df5a..82230a209 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/subscription/quota-table.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/subscription/quota-table.ts @@ -3,60 +3,69 @@ const quota_table = { title: '配額', tenant_limit: '租戶限制', base_price: '基本價格', - mau_unit_price: '* MAU 單位價格', + mau_unit_price: '* 每月活躍使用者(MAU)單價', mau_limit: 'MAU 限制', }, application: { title: '應用程式', - total: '總數', + total: '總應用程式數', m2m: '機器對機器', }, resource: { title: 'API 資源', resource_count: '資源數量', - scopes_per_resource: '資源每個權限', + scopes_per_resource: '每資源權限', }, branding: { - title: '品牌', + title: '使用者介面和品牌塑造', custom_domain: '自訂網域', + custom_css: '自訂 CSS', + app_logo_and_favicon: '應用程式標誌和網站圖示', + dark_mode: '深色模式', + i18n: '國際化', }, user_authn: { - title: '用戶身份驗證', + title: '使用者認證', omni_sign_in: 'Omni 登入', - built_in_email_connector: '內建電子郵件連接器', + password: '密碼', + passwordless: '免密碼登入 - 電子郵件和簡訊', + email_connector: '電子郵件連接器', + sms_connector: '簡訊連接器', social_connectors: '社交連接器', standard_connectors: '標準連接器', + built_in_email_connector: '內建電子郵件連接器', }, - roles: { - title: '角色', + user_management: { + title: '使用者管理', + user_management: '使用者管理', roles: '角色', - scopes_per_role: '角色每個權限', + scopes_per_role: '每角色權限', }, audit_logs: { - title: '審核日誌', - retention: '保留', + title: '稽核日誌', + retention: '保留期限', }, hooks: { - title: 'Hooks', - amount: '數量', + title: 'Webhooks', + hooks: 'Webhooks', }, support: { title: '支援', community: '社群', - customer_ticket: '客戶工單', - premium: '高級', + customer_ticket: '客戶支援票證', + premium: '進階版', }, mau_unit_price_footnote: - '* 我們的單價可能因實際消耗的資源而有所變動,並且 Logto 保留隨時解釋單價變動的權利。', + '* 您的每月活躍使用者(MAU)將根據在結算週期內登錄的頻率分為3個層級。每個層級都有不同的MAU單價。', unlimited: '無限制', - contact: '聯絡我們', + contact: '聯絡', // eslint-disable-next-line no-template-curly-in-string monthly_price: '${{value, number}}/月', // eslint-disable-next-line no-template-curly-in-string mau_price: '${{value, number}}/MAU', - days_one: '{{count, number}} 天', - days_other: '{{count, number}} 天', - add_on: '附加', + days_one: '{{count, number}}天', + days_other: '{{count, number}}天', + add_on: '附加功能', }; export default quota_table;