0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2024-12-16 20:26:19 -05:00

refactor(console): update plan quota table content (#4234)

* refactor(console): update plan quota table content

* refactor(console): use reserved plan id to index plan-related data
This commit is contained in:
Xiao Yijun 2023-07-25 20:29:54 +08:00 committed by GitHub
parent 129d22980f
commit 491840926c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 621 additions and 373 deletions

View file

@ -0,0 +1,151 @@
import {
type SubscriptionPlanTable,
type SubscriptionPlanTableData,
type SubscriptionPlanTableGroupKeyMap,
SubscriptionPlanTableGroupKey,
ReservedPlanName,
} from '@/types/subscriptions';
import { ReservedPlanId } from './subscriptions';
type EnabledFeatureMap = Record<string, boolean | undefined>;
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<string, number | undefined> = {
[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;

View file

@ -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',

View file

@ -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<string, boolean | undefined> = {
[ReservedPlanName.Free]: true,
[ReservedPlanName.Hobby]: true,
[ReservedPlanName.Pro]: true,
[ReservedPlanName.Enterprise]: true,
};
export const ticketSupportResponseTimeMap: Record<string, number | undefined> = {
[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';

View file

@ -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',

View file

@ -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',
};

View file

@ -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';

View file

@ -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],
},
};
});

View file

@ -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<SubscriptionPlanResponse, 'quota'> & {
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;
}
>;

View file

@ -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
},
};
};

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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 daudit',
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 dexpliquer 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;

View file

@ -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;

View file

@ -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: 'アドオン',
};

View file

@ -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

View file

@ -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ń',

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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;