diff --git a/packages/console/src/consts/page-tabs.ts b/packages/console/src/consts/page-tabs.ts index 6bce50ab6bb..55dca2099e2 100644 --- a/packages/console/src/consts/page-tabs.ts +++ b/packages/console/src/consts/page-tabs.ts @@ -4,6 +4,7 @@ export enum ApplicationDetailsTabs { Logs = 'logs', Branding = 'branding', Permissions = 'permissions', + Rules = 'rules', Organizations = 'organizations', AttributeMapping = 'attribute-mapping', } diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.module.scss b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.module.scss new file mode 100644 index 00000000000..7585f88d08c --- /dev/null +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.module.scss @@ -0,0 +1,68 @@ +@use '@/scss/underscore' as _; + +.notification { + margin-block-start: _.unit(3); +} + +.loading { + display: flex; + justify-content: center; + padding: _.unit(6) 0; + color: var(--color-primary-50); +} + +.ruleRows { + display: flex; + flex-direction: column; + gap: _.unit(3); + margin-block-start: _.unit(5); +} + +.ruleRowsHeader { + display: flex; + flex-direction: column; + gap: _.unit(1); +} + +.ruleRowsTitle { + font: var(--font-title-3); + color: var(--color-text); +} + +.ruleRowsDescription { + font: var(--font-body-2); + color: var(--color-text-secondary); +} + +.ruleRow { + display: flex; + align-items: center; + justify-content: space-between; + gap: _.unit(4); + padding: _.unit(4); + border: 1px solid var(--color-divider); + border-radius: 8px; +} + +.ruleContent { + display: flex; + flex-direction: column; + min-width: 0; + gap: _.unit(1); +} + +.ruleTitle { + font: var(--font-body-1); + color: var(--color-text); +} + +.ruleDescription { + font: var(--font-body-2); + color: var(--color-text-secondary); +} + +.ruleCount { + flex-shrink: 0; + font: var(--font-label-2); + color: var(--color-text-secondary); +} diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.tsx b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.tsx new file mode 100644 index 00000000000..6391411fb68 --- /dev/null +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/index.tsx @@ -0,0 +1,186 @@ +import { + type ApplicationAccessControl as ApplicationAccessControlRules, + type ApplicationResponse, +} from '@logto/schemas'; +import { useEffect, useState } from 'react'; +import { toast } from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import useSWR from 'swr'; + +import FormCard from '@/components/FormCard'; +import FormField from '@/ds-components/FormField'; +import InlineNotification from '@/ds-components/InlineNotification'; +import { Ring } from '@/ds-components/Spinner'; +import Switch from '@/ds-components/Switch'; +import useApi, { type RequestError } from '@/hooks/use-api'; + +import styles from './index.module.scss'; +import { getOrganizationRoleRuleCount, hasApplicationAccessControlRules } from './utils'; + +type RuleRowProps = { + readonly title: string; + readonly description: string; + readonly count: number; +}; + +function RuleRow({ title, description, count }: RuleRowProps) { + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); + + return ( +
+
+
{title}
+
{description}
+
+
+ {t('application_details.access_control.rule_count', { count })} +
+
+ ); +} + +type Props = { + readonly application: ApplicationResponse; + readonly isActive: boolean; + readonly onApplicationUpdated: () => void; +}; + +function ApplicationAccessControl({ application, isActive, onApplicationUpdated }: Props) { + const { id, appLevelAccessControlEnabled } = application; + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); + const api = useApi(); + const [isEnabled, setIsEnabled] = useState(appLevelAccessControlEnabled); + const [isUpdatingEnabled, setIsUpdatingEnabled] = useState(false); + + const { + data: accessControl, + error, + isLoading, + mutate, + } = useSWR( + isActive && `api/applications/${id}/access-control` + ); + + useEffect(() => { + setIsEnabled(appLevelAccessControlEnabled); + }, [appLevelAccessControlEnabled]); + + const hasAccessControlRules = accessControl && hasApplicationAccessControlRules(accessControl); + const isEnableBlocked = !isEnabled && !hasAccessControlRules; + + const onEnabledChange = async (enabled: boolean) => { + if (isUpdatingEnabled) { + return; + } + + if (enabled && !hasAccessControlRules) { + toast.error(t('application_details.access_control.enable_without_rules_notice')); + return; + } + + setIsEnabled(enabled); + setIsUpdatingEnabled(true); + + try { + await api + .patch(`api/applications/${id}`, { + json: { appLevelAccessControlEnabled: enabled }, + }) + .json(); + onApplicationUpdated(); + toast.success(t('general.saved')); + } catch { + setIsEnabled(appLevelAccessControlEnabled); + // The global API error handler has already surfaced the error. + } finally { + setIsUpdatingEnabled(false); + } + }; + + return ( + + + { + void onEnabledChange(checked); + }} + /> + + {!isEnabled && accessControl && !hasAccessControlRules && ( + + {t('application_details.access_control.enable_without_rules_notice')} + + )} + + {t( + isEnabled + ? 'application_details.access_control.enabled_notice' + : 'application_details.access_control.disabled_notice' + )} + + {isLoading && ( +
+ +
+ )} + {error && ( + { + void mutate(); + }} + > + {t('application_details.access_control.load_error')} + + )} + {accessControl && ( +
+
+
+ {t('application_details.access_control.rules')} +
+
+ {t( + hasApplicationAccessControlRules(accessControl) + ? 'application_details.access_control.rules_description' + : 'application_details.access_control.empty_rules_description' + )} +
+
+ + + + +
+ )} +
+ ); +} + +export default ApplicationAccessControl; diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.test.ts b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.test.ts new file mode 100644 index 00000000000..20701c93314 --- /dev/null +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.test.ts @@ -0,0 +1,33 @@ +import { createDefaultApplicationAccessControl } from '@logto/schemas'; + +import { getOrganizationRoleRuleCount, hasApplicationAccessControlRules } from './utils'; + +describe('application access control utils', () => { + it('counts organization role rules by role assignment', () => { + expect( + getOrganizationRoleRuleCount({ + ...createDefaultApplicationAccessControl(), + organizationRoleRules: [ + { + organizationId: 'organization_1', + organizationRoleIds: ['role_1', 'role_2'], + }, + { + organizationId: 'organization_2', + organizationRoleIds: ['role_3'], + }, + ], + }) + ).toBe(3); + }); + + it('detects any configured access control rule', () => { + expect(hasApplicationAccessControlRules(createDefaultApplicationAccessControl())).toBe(false); + expect( + hasApplicationAccessControlRules({ + ...createDefaultApplicationAccessControl(), + organizationIds: ['organization_1'], + }) + ).toBe(true); + }); +}); diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.ts b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.ts new file mode 100644 index 00000000000..c5f1632656c --- /dev/null +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/ApplicationAccessControl/utils.ts @@ -0,0 +1,19 @@ +import type { ApplicationAccessControl } from '@logto/schemas'; + +export const getOrganizationRoleRuleCount = ({ organizationRoleRules }: ApplicationAccessControl) => + organizationRoleRules.reduce( + (count, { organizationRoleIds }) => count + organizationRoleIds.length, + 0 + ); + +export const hasApplicationAccessControlRules = ({ + userIds, + userRoleIds, + organizationIds, + organizationRoleRules, +}: ApplicationAccessControl) => + userIds.length > 0 || + userRoleIds.length > 0 || + organizationIds.length > 0 || + getOrganizationRoleRuleCount({ userIds, userRoleIds, organizationIds, organizationRoleRules }) > + 0; diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/MachineToMachineTabs.tsx b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/MachineToMachineTabs.tsx new file mode 100644 index 00000000000..94d5ed4ceae --- /dev/null +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/MachineToMachineTabs.tsx @@ -0,0 +1,58 @@ +import { type ApplicationResponse } from '@logto/schemas'; +import { Trans } from 'react-i18next'; + +import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder'; +import OrganizationList from '@/components/OrganizationList'; +import { ApplicationDetailsTabs } from '@/consts'; +import TabWrapper from '@/ds-components/TabWrapper'; +import TextLink from '@/ds-components/TextLink'; +import { organizations } from '@/hooks/use-console-routes/routes/organizations'; + +import MachineLogs from './MachineLogs'; +import MachineToMachineApplicationRoles from './MachineToMachineApplicationRoles'; +import styles from './index.module.scss'; + +type Props = { + readonly application: ApplicationResponse; + readonly activeTab?: string; +}; + +function MachineToMachineTabs({ application, activeTab }: Props) { + return ( + <> + + + + + + + + }} + /> + } + /> + } + /> + + + ); +} + +export default MachineToMachineTabs; diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx index 5b0c09b67e8..beac25da23c 100644 --- a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx @@ -16,16 +16,13 @@ import ApplicationIcon from '@/components/ApplicationIcon'; import DetailsForm from '@/components/DetailsForm'; import DetailsPageHeader from '@/components/DetailsPage/DetailsPageHeader'; import Drawer from '@/components/Drawer'; -import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder'; -import OrganizationList from '@/components/OrganizationList'; import UnsavedChangesAlertModal from '@/components/UnsavedChangesAlertModal'; import { ApplicationDetailsTabs, logtoThirdPartyGuideLink, protectedApp } from '@/consts'; +import { isDevFeaturesEnabled } from '@/consts/env'; import DeleteConfirmModal from '@/ds-components/DeleteConfirmModal'; import TabNav, { TabNavItem } from '@/ds-components/TabNav'; import TabWrapper from '@/ds-components/TabWrapper'; -import TextLink from '@/ds-components/TextLink'; import useApi from '@/hooks/use-api'; -import { organizations } from '@/hooks/use-console-routes/routes/organizations'; import useDocumentationUrl from '@/hooks/use-documentation-url'; import useTenantPathname from '@/hooks/use-tenant-pathname'; import { applicationTypeI18nKey } from '@/types/applications'; @@ -34,12 +31,12 @@ import { trySubmitSafe } from '@/utils/form'; import Branding from '../components/Branding'; import Permissions from '../components/Permissions'; +import ApplicationAccessControl from './ApplicationAccessControl'; import BackchannelLogout from './BackchannelLogout'; import ConcurrentDeviceLimit from './ConcurrentDeviceLimit'; import EndpointsAndCredentials, { type ApplicationSecretRow } from './EndpointsAndCredentials'; import GuideDrawer from './GuideDrawer'; -import MachineLogs from './MachineLogs'; -import MachineToMachineApplicationRoles from './MachineToMachineApplicationRoles'; +import MachineToMachineTabs from './MachineToMachineTabs'; import RefreshTokenSettings from './RefreshTokenSettings'; import Settings from './Settings'; import TokenExchangeSettings from './TokenExchangeSettings'; @@ -81,6 +78,7 @@ function ApplicationDetailsContent({ data, secrets, oidcConfig, onApplicationUpd ApplicationType.Traditional, ApplicationType.Protected, ].includes(data.type); + const hasRules = isDevFeaturesEnabled && data.type !== ApplicationType.MachineToMachine; const onSubmit = handleSubmit( trySubmitSafe(async (formData) => { @@ -214,6 +212,11 @@ function ApplicationDetailsContent({ data, secrets, oidcConfig, onApplicationUpd {t('application_details.branding.name')} )} + {hasRules && ( + + {t('application_details.access_control.name')} + + )} - {/* Protected apps will reference this section in component */} {data.type !== ApplicationType.Protected && ( {data.type === ApplicationType.MachineToMachine && ( - <> - - - - - - - - }} - /> - } - /> - } - /> - - + )} {data.isThirdParty && ( @@ -301,6 +271,15 @@ function ApplicationDetailsContent({ data, secrets, oidcConfig, onApplicationUpd )} + {hasRules && ( + + + + )} ); } diff --git a/packages/phrases/src/locales/ar/translation/admin-console/application-details.ts b/packages/phrases/src/locales/ar/translation/admin-console/application-details.ts index 2f928f844c0..b37fc48f96e 100644 --- a/packages/phrases/src/locales/ar/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/ar/translation/admin-console/application-details.ts @@ -120,6 +120,37 @@ const application_details = { field_custom_data_tip: 'معلومات تطبيق مخصصة إضافية غير مدرجة في خصائص التطبيق المحددة مسبقًا ، مثل الإعدادات والتكوينات الخاصة بالأعمال.', custom_data_invalid: 'يجب أن تكون البيانات المخصصة كائن JSON صالح', + access_control: { + name: 'القواعد', + title: 'التحكم في الوصول على مستوى التطبيق', + description: + 'قيّد المستخدمين الذين يمكنهم تسجيل الدخول إلى هذا التطبيق عن طريق تكوين قواعد الوصول.', + enable: 'تمكين التحكم في الوصول', + enable_description: + 'يمكن فقط للمستخدمين المطابقين لقاعدة مكونة واحدة على الأقل الوصول إلى هذا التطبيق.', + enable_without_rules_notice: 'أضف قاعدة وصول واحدة على الأقل قبل تمكين التحكم في الوصول.', + enabled_notice: + 'التحكم في الوصول مفعّل. يمكن فقط للمستخدمين المطابقين لقاعدة واحدة على الأقل الوصول إلى هذا التطبيق.', + disabled_notice: + 'التحكم في الوصول متوقف. يمكن لجميع المستخدمين المسجلين الوصول إلى هذا التطبيق.', + load_error: 'فشل تحميل قواعد التحكم في الوصول.', + rules: 'قواعد الوصول', + rules_description: 'يمكن للمستخدمين الوصول إلى هذا التطبيق عند مطابقة أي قاعدة مكونة.', + empty_rules_description: 'لم يتم تكوين أي قواعد بعد.', + rule_count: '{{count}} قاعدة', + rule_count_other: '{{count}} قواعد', + rule_users: 'المستخدمون', + rule_users_description: 'يمكن لمستخدمين محددين الوصول إلى هذا التطبيق.', + rule_user_roles: 'أدوار المستخدمين', + rule_user_roles_description: + 'يمكن للمستخدمين المعينين لأدوار المستخدم المحددة الوصول إلى هذا التطبيق.', + rule_organizations: 'المؤسسات', + rule_organizations_description: + 'يمكن لجميع الأعضاء الحاليين والمستقبليين في المؤسسات المحددة الوصول إلى هذا التطبيق.', + rule_organization_roles: 'أدوار المؤسسة', + rule_organization_roles_description: + 'يمكن للأعضاء الذين لديهم أدوار المؤسسة المحددة في المؤسسات المحددة الوصول إلى هذا التطبيق.', + }, branding: { name: 'العلامة التجارية', description: 'قم بتخصيص شعار التطبيق ولون العلامة التجارية لتجربة المستوى التطبيق.', diff --git a/packages/phrases/src/locales/de/translation/admin-console/application-details.ts b/packages/phrases/src/locales/de/translation/admin-console/application-details.ts index 09954ffcdcb..e70ba944c19 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/application-details.ts @@ -123,6 +123,39 @@ const application_details = { field_custom_data_tip: 'Zusätzliche benutzerdefinierte Anwendungsinformationen, die nicht in den vordefinierten Anwendungseigenschaften aufgeführt sind, wie z. B. geschäftsspezifische Einstellungen und Konfigurationen.', custom_data_invalid: 'Benutzerdefinierte Daten müssen ein gültiges JSON-Objekt sein', + access_control: { + name: 'Regeln', + title: 'App-level Zugriffskontrolle', + description: + 'Schränken Sie ein, welche Benutzer sich bei dieser Anwendung anmelden können, indem Sie Zugriffsregeln konfigurieren.', + enable: 'Zugriffskontrolle aktivieren', + enable_description: + 'Nur Benutzer, die mindestens einer konfigurierten Regel entsprechen, können auf diese App zugreifen.', + enable_without_rules_notice: + 'Fügen Sie mindestens eine Zugriffsregel hinzu, bevor Sie die Zugriffskontrolle aktivieren.', + enabled_notice: + 'Die Zugriffskontrolle ist aktiviert. Nur Benutzer, die mindestens einer Regel entsprechen, können auf diese App zugreifen.', + disabled_notice: + 'Die Zugriffskontrolle ist deaktiviert. Alle registrierten Benutzer können auf diese App zugreifen.', + load_error: 'Zugriffsregeln konnten nicht geladen werden.', + rules: 'Zugriffsregeln', + rules_description: + 'Benutzer können auf diese App zugreifen, wenn sie einer der konfigurierten Regeln entsprechen.', + empty_rules_description: 'Es sind noch keine Regeln konfiguriert.', + rule_count: '{{count}} Regel', + rule_count_other: '{{count}} Regeln', + rule_users: 'Benutzer', + rule_users_description: 'Bestimmte Benutzer können auf diese App zugreifen.', + rule_user_roles: 'Benutzerrollen', + rule_user_roles_description: + 'Benutzer mit ausgewählten Benutzerrollen können auf diese App zugreifen.', + rule_organizations: 'Organisationen', + rule_organizations_description: + 'Alle aktuellen und zukünftigen Mitglieder der ausgewählten Organisationen können auf diese App zugreifen.', + rule_organization_roles: 'Organisationsrollen', + rule_organization_roles_description: + 'Mitglieder mit ausgewählten Organisationsrollen in ausgewählten Organisationen können auf diese App zugreifen.', + }, branding: { name: 'Branding', description: diff --git a/packages/phrases/src/locales/en/translation/admin-console/application-details.ts b/packages/phrases/src/locales/en/translation/admin-console/application-details.ts index b44228cd8f8..5d0f6b71afd 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/application-details.ts @@ -120,6 +120,34 @@ const application_details = { field_custom_data_tip: 'Additional custom application info not listed in the pre-defined application properties, such as business-specific settings and configurations.', custom_data_invalid: 'Custom data must be a valid JSON object', + access_control: { + name: 'Rules', + title: 'App-level access control', + description: + 'Restrict which users can sign in to this application by configuring access rules.', + enable: 'Enable access control', + enable_description: 'Only users who match at least one configured rule can access this app.', + enable_without_rules_notice: 'Add at least one access rule before enabling access control.', + enabled_notice: + 'Access control is on. Only users who match at least one rule can access this app.', + disabled_notice: 'Access control is off. All registered users can access this app.', + load_error: 'Failed to load access control rules.', + rules: 'Access rules', + rules_description: 'Users can access this app when they match any one of the configured rules.', + empty_rules_description: 'No rules are configured yet.', + rule_count: '{{count}} rule', + rule_count_other: '{{count}} rules', + rule_users: 'Users', + rule_users_description: 'Specific users can access this app.', + rule_user_roles: 'User roles', + rule_user_roles_description: 'Users assigned to selected user roles can access this app.', + rule_organizations: 'Organizations', + rule_organizations_description: + 'All current and future members of selected organizations can access this app.', + rule_organization_roles: 'Organization roles', + rule_organization_roles_description: + 'Members with selected organization roles in selected organizations can access this app.', + }, branding: { name: 'Branding', description: 'Customize your app logo and branding color for the app-level experience.', diff --git a/packages/phrases/src/locales/es/translation/admin-console/application-details.ts b/packages/phrases/src/locales/es/translation/admin-console/application-details.ts index a2e8a027802..5568600d524 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/application-details.ts @@ -122,6 +122,39 @@ const application_details = { field_custom_data_tip: 'Información personalizada adicional de la aplicación no listada en las propiedades predefinidas de la aplicación, como configuraciones específicas del negocio.', custom_data_invalid: 'Los datos personalizados deben ser un objeto JSON válido', + access_control: { + name: 'Reglas', + title: 'Control de acceso a nivel de aplicación', + description: + 'Restringe qué usuarios pueden iniciar sesión en esta aplicación configurando reglas de acceso.', + enable: 'Habilitar control de acceso', + enable_description: + 'Solo los usuarios que coincidan con al menos una regla configurada pueden acceder a esta aplicación.', + enable_without_rules_notice: + 'Agrega al menos una regla de acceso antes de habilitar el control de acceso.', + enabled_notice: + 'El control de acceso está activado. Solo los usuarios que coincidan con al menos una regla pueden acceder a esta aplicación.', + disabled_notice: + 'El control de acceso está desactivado. Todos los usuarios registrados pueden acceder a esta aplicación.', + load_error: 'No se pudieron cargar las reglas de control de acceso.', + rules: 'Reglas de acceso', + rules_description: + 'Los usuarios pueden acceder a esta aplicación cuando coinciden con cualquiera de las reglas configuradas.', + empty_rules_description: 'Aún no hay reglas configuradas.', + rule_count: '{{count}} regla', + rule_count_other: '{{count}} reglas', + rule_users: 'Usuarios', + rule_users_description: 'Usuarios específicos pueden acceder a esta aplicación.', + rule_user_roles: 'Roles de usuario', + rule_user_roles_description: + 'Los usuarios asignados a los roles de usuario seleccionados pueden acceder a esta aplicación.', + rule_organizations: 'Organizaciones', + rule_organizations_description: + 'Todos los miembros actuales y futuros de las organizaciones seleccionadas pueden acceder a esta aplicación.', + rule_organization_roles: 'Roles de organización', + rule_organization_roles_description: + 'Los miembros con los roles de organización seleccionados en las organizaciones seleccionadas pueden acceder a esta aplicación.', + }, branding: { name: 'Marca', description: diff --git a/packages/phrases/src/locales/fr/translation/admin-console/application-details.ts b/packages/phrases/src/locales/fr/translation/admin-console/application-details.ts index 1a40920b290..031592752f4 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/application-details.ts @@ -121,6 +121,39 @@ const application_details = { field_custom_data_tip: 'Informations supplémentaires personnalisées de l’application non listées dans les propriétés prédéfinies de l’application, telles que les paramètres et configurations spécifiques à l’entreprise.', custom_data_invalid: 'Les données personnalisées doivent être un objet JSON valide.', + access_control: { + name: 'Règles', + title: 'Contrôle d’accès au niveau de l’application', + description: + 'Limitez les utilisateurs autorisés à se connecter à cette application en configurant des règles d’accès.', + enable: 'Activer le contrôle d’accès', + enable_description: + 'Seuls les utilisateurs correspondant à au moins une règle configurée peuvent accéder à cette application.', + enable_without_rules_notice: + 'Ajoutez au moins une règle d’accès avant d’activer le contrôle d’accès.', + enabled_notice: + 'Le contrôle d’accès est activé. Seuls les utilisateurs correspondant à au moins une règle peuvent accéder à cette application.', + disabled_notice: + 'Le contrôle d’accès est désactivé. Tous les utilisateurs inscrits peuvent accéder à cette application.', + load_error: 'Échec du chargement des règles de contrôle d’accès.', + rules: 'Règles d’accès', + rules_description: + 'Les utilisateurs peuvent accéder à cette application lorsqu’ils correspondent à l’une des règles configurées.', + empty_rules_description: 'Aucune règle n’est encore configurée.', + rule_count: '{{count}} règle', + rule_count_other: '{{count}} règles', + rule_users: 'Utilisateurs', + rule_users_description: 'Des utilisateurs spécifiques peuvent accéder à cette application.', + rule_user_roles: 'Rôles utilisateur', + rule_user_roles_description: + 'Les utilisateurs associés aux rôles utilisateur sélectionnés peuvent accéder à cette application.', + rule_organizations: 'Organisations', + rule_organizations_description: + 'Tous les membres actuels et futurs des organisations sélectionnées peuvent accéder à cette application.', + rule_organization_roles: 'Rôles d’organisation', + rule_organization_roles_description: + 'Les membres disposant des rôles d’organisation sélectionnés dans les organisations sélectionnées peuvent accéder à cette application.', + }, branding: { name: 'Marque', description: diff --git a/packages/phrases/src/locales/it/translation/admin-console/application-details.ts b/packages/phrases/src/locales/it/translation/admin-console/application-details.ts index 2f20e46a288..b9be9e5a958 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/application-details.ts @@ -122,6 +122,39 @@ const application_details = { field_custom_data_tip: "Ulteriori informazioni personalizzate sull'applicazione non elencate nelle proprietà predefinite dell'applicazione, come impostazioni e configurazioni specifiche del business.", custom_data_invalid: 'I dati personalizzati devono essere un oggetto JSON valido', + access_control: { + name: 'Regole', + title: 'Controllo accessi a livello di app', + description: + 'Limita quali utenti possono accedere a questa applicazione configurando regole di accesso.', + enable: 'Abilita controllo accessi', + enable_description: + 'Solo gli utenti che corrispondono ad almeno una regola configurata possono accedere a questa app.', + enable_without_rules_notice: + 'Aggiungi almeno una regola di accesso prima di abilitare il controllo accessi.', + enabled_notice: + 'Il controllo accessi è attivo. Solo gli utenti che corrispondono ad almeno una regola possono accedere a questa app.', + disabled_notice: + 'Il controllo accessi è disattivato. Tutti gli utenti registrati possono accedere a questa app.', + load_error: 'Impossibile caricare le regole di controllo accessi.', + rules: 'Regole di accesso', + rules_description: + 'Gli utenti possono accedere a questa app quando corrispondono a una qualsiasi delle regole configurate.', + empty_rules_description: 'Non è stata ancora configurata alcuna regola.', + rule_count: '{{count}} regola', + rule_count_other: '{{count}} regole', + rule_users: 'Utenti', + rule_users_description: 'Utenti specifici possono accedere a questa app.', + rule_user_roles: 'Ruoli utente', + rule_user_roles_description: + 'Gli utenti assegnati ai ruoli utente selezionati possono accedere a questa app.', + rule_organizations: 'Organizzazioni', + rule_organizations_description: + 'Tutti i membri attuali e futuri delle organizzazioni selezionate possono accedere a questa app.', + rule_organization_roles: 'Ruoli organizzazione', + rule_organization_roles_description: + 'I membri con i ruoli organizzazione selezionati nelle organizzazioni selezionate possono accedere a questa app.', + }, branding: { name: 'Marchio', description: "Personalizza il nome e il logo dell'applicazione sullo schermo del consenso.", diff --git a/packages/phrases/src/locales/ja/translation/admin-console/application-details.ts b/packages/phrases/src/locales/ja/translation/admin-console/application-details.ts index 121baf14fdf..0c2326a558e 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/application-details.ts @@ -121,6 +121,38 @@ const application_details = { field_custom_data_tip: '事前定義されたアプリケーションプロパティにリストされていない追加のカスタムアプリケーション情報。例えば、ビジネス固有の設定と構成。', custom_data_invalid: 'カスタムデータは有効な JSON オブジェクトである必要があります', + access_control: { + name: 'ルール', + title: 'アプリレベルのアクセス制御', + description: 'アクセスルールを設定して、このアプリにサインインできるユーザーを制限します。', + enable: 'アクセス制御を有効化', + enable_description: + '設定済みのルールに少なくとも 1 つ一致するユーザーのみが、このアプリにアクセスできます。', + enable_without_rules_notice: + 'アクセス制御を有効にする前に、少なくとも 1 つのアクセスルールを追加してください。', + enabled_notice: + 'アクセス制御は有効です。少なくとも 1 つのルールに一致するユーザーのみが、このアプリにアクセスできます。', + disabled_notice: + 'アクセス制御は無効です。登録済みのすべてのユーザーがこのアプリにアクセスできます。', + load_error: 'アクセス制御ルールの読み込みに失敗しました。', + rules: 'アクセスルール', + rules_description: + 'ユーザーはいずれかの設定済みルールに一致すると、このアプリにアクセスできます。', + empty_rules_description: 'まだルールが設定されていません。', + rule_count: '{{count}} 件のルール', + rule_count_other: '{{count}} 件のルール', + rule_users: 'ユーザー', + rule_users_description: '特定のユーザーがこのアプリにアクセスできます。', + rule_user_roles: 'ユーザーロール', + rule_user_roles_description: + '選択したユーザーロールに割り当てられたユーザーがこのアプリにアクセスできます。', + rule_organizations: '組織', + rule_organizations_description: + '選択した組織の現在および将来のすべてのメンバーがこのアプリにアクセスできます。', + rule_organization_roles: '組織ロール', + rule_organization_roles_description: + '選択した組織内で選択した組織ロールを持つメンバーがこのアプリにアクセスできます。', + }, branding: { name: 'ブランディング', description: 'Consent 画面上でアプリケーションの表示名とロゴをカスタマイズします。', diff --git a/packages/phrases/src/locales/ko/translation/admin-console/application-details.ts b/packages/phrases/src/locales/ko/translation/admin-console/application-details.ts index dca47175bcd..fa4f2dbd0e3 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/application-details.ts @@ -120,6 +120,33 @@ const application_details = { field_custom_data_tip: '사전 정의된 애플리케이션 속성에 나열되지 않은 추가 사용자 지정 애플리케이션 정보, 비즈니스 관련 설정 및 구성과 같은 항목들.', custom_data_invalid: '사용자 지정 데이터는 유효한 JSON 객체여야 합니다', + access_control: { + name: '규칙', + title: '앱 수준 접근 제어', + description: '접근 규칙을 구성하여 이 애플리케이션에 로그인할 수 있는 사용자를 제한합니다.', + enable: '접근 제어 사용', + enable_description: '구성된 규칙 중 하나 이상과 일치하는 사용자만 이 앱에 접근할 수 있습니다.', + enable_without_rules_notice: '접근 제어를 사용하기 전에 접근 규칙을 하나 이상 추가하세요.', + enabled_notice: + '접근 제어가 켜져 있습니다. 하나 이상의 규칙과 일치하는 사용자만 이 앱에 접근할 수 있습니다.', + disabled_notice: '접근 제어가 꺼져 있습니다. 등록된 모든 사용자가 이 앱에 접근할 수 있습니다.', + load_error: '접근 제어 규칙을 불러오지 못했습니다.', + rules: '접근 규칙', + rules_description: '사용자는 구성된 규칙 중 하나와 일치하면 이 앱에 접근할 수 있습니다.', + empty_rules_description: '아직 구성된 규칙이 없습니다.', + rule_count: '{{count}}개 규칙', + rule_count_other: '{{count}}개 규칙', + rule_users: '사용자', + rule_users_description: '특정 사용자가 이 앱에 접근할 수 있습니다.', + rule_user_roles: '사용자 역할', + rule_user_roles_description: '선택한 사용자 역할에 할당된 사용자가 이 앱에 접근할 수 있습니다.', + rule_organizations: '조직', + rule_organizations_description: + '선택한 조직의 현재 및 향후 모든 구성원이 이 앱에 접근할 수 있습니다.', + rule_organization_roles: '조직 역할', + rule_organization_roles_description: + '선택한 조직에서 선택한 조직 역할을 가진 구성원이 이 앱에 접근할 수 있습니다.', + }, branding: { name: '브랜딩', description: '동의 화면에서 앱의 표시 이름과 로고를 사용자 정의하세요.', diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/application-details.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/application-details.ts index 16369dd90df..63c711b07a4 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/application-details.ts @@ -121,6 +121,39 @@ const application_details = { field_custom_data_tip: 'Dodatkowe niestandardowe informacje o aplikacji, które nie są wymienione w predefiniowanych właściwościach aplikacji, takie jak ustawienia i konfiguracje specyficzne dla biznesu.', custom_data_invalid: 'Dane niestandardowe muszą być poprawnym obiektem JSON', + access_control: { + name: 'Reguły', + title: 'Kontrola dostępu na poziomie aplikacji', + description: + 'Ogranicz, którzy użytkownicy mogą logować się do tej aplikacji, konfigurując reguły dostępu.', + enable: 'Włącz kontrolę dostępu', + enable_description: + 'Tylko użytkownicy pasujący do co najmniej jednej skonfigurowanej reguły mogą uzyskać dostęp do tej aplikacji.', + enable_without_rules_notice: + 'Dodaj co najmniej jedną regułę dostępu przed włączeniem kontroli dostępu.', + enabled_notice: + 'Kontrola dostępu jest włączona. Tylko użytkownicy pasujący do co najmniej jednej reguły mogą uzyskać dostęp do tej aplikacji.', + disabled_notice: + 'Kontrola dostępu jest wyłączona. Wszyscy zarejestrowani użytkownicy mogą uzyskać dostęp do tej aplikacji.', + load_error: 'Nie udało się załadować reguł kontroli dostępu.', + rules: 'Reguły dostępu', + rules_description: + 'Użytkownicy mogą uzyskać dostęp do tej aplikacji, gdy pasują do dowolnej skonfigurowanej reguły.', + empty_rules_description: 'Nie skonfigurowano jeszcze żadnych reguł.', + rule_count: '{{count}} reguła', + rule_count_other: '{{count}} reguł', + rule_users: 'Użytkownicy', + rule_users_description: 'Określeni użytkownicy mogą uzyskać dostęp do tej aplikacji.', + rule_user_roles: 'Role użytkowników', + rule_user_roles_description: + 'Użytkownicy przypisani do wybranych ról użytkownika mogą uzyskać dostęp do tej aplikacji.', + rule_organizations: 'Organizacje', + rule_organizations_description: + 'Wszyscy obecni i przyszli członkowie wybranych organizacji mogą uzyskać dostęp do tej aplikacji.', + rule_organization_roles: 'Role organizacji', + rule_organization_roles_description: + 'Członkowie z wybranymi rolami organizacji w wybranych organizacjach mogą uzyskać dostęp do tej aplikacji.', + }, branding: { name: 'Branding', description: 'Dostosuj nazwę i logo aplikacji na ekranie zgody.', diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/application-details.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/application-details.ts index 951f0a0cd18..90cb2f0ac04 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/application-details.ts @@ -121,6 +121,39 @@ const application_details = { field_custom_data_tip: 'Informações adicionais personalizadas da aplicação não listadas nas propriedades pré-definidas da aplicação, como configurações e configurações específicas dos negócios.', custom_data_invalid: 'Os dados personalizados devem ser um objeto JSON válido', + access_control: { + name: 'Regras', + title: 'Controle de acesso no nível do aplicativo', + description: + 'Restrinja quais usuários podem entrar neste aplicativo configurando regras de acesso.', + enable: 'Ativar controle de acesso', + enable_description: + 'Somente usuários que corresponderem a pelo menos uma regra configurada podem acessar este app.', + enable_without_rules_notice: + 'Adicione pelo menos uma regra de acesso antes de ativar o controle de acesso.', + enabled_notice: + 'O controle de acesso está ativado. Somente usuários que corresponderem a pelo menos uma regra podem acessar este app.', + disabled_notice: + 'O controle de acesso está desativado. Todos os usuários registrados podem acessar este app.', + load_error: 'Falha ao carregar as regras de controle de acesso.', + rules: 'Regras de acesso', + rules_description: + 'Os usuários podem acessar este app quando corresponderem a qualquer uma das regras configuradas.', + empty_rules_description: 'Nenhuma regra foi configurada ainda.', + rule_count: '{{count}} regra', + rule_count_other: '{{count}} regras', + rule_users: 'Usuários', + rule_users_description: 'Usuários específicos podem acessar este app.', + rule_user_roles: 'Funções de usuário', + rule_user_roles_description: + 'Usuários atribuídos às funções de usuário selecionadas podem acessar este app.', + rule_organizations: 'Organizações', + rule_organizations_description: + 'Todos os membros atuais e futuros das organizações selecionadas podem acessar este app.', + rule_organization_roles: 'Funções da organização', + rule_organization_roles_description: + 'Membros com as funções da organização selecionadas nas organizações selecionadas podem acessar este app.', + }, branding: { name: 'Branding', description: diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/application-details.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/application-details.ts index be6c6bf22ba..f576cb2baaf 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/application-details.ts @@ -121,6 +121,39 @@ const application_details = { field_custom_data_tip: 'Informações personalizadas adicionais da aplicação não listadas nas propriedades predefinidas da aplicação, como configurações e configurações específicas de negócios.', custom_data_invalid: 'Os dados personalizados devem ser um objeto JSON válido', + access_control: { + name: 'Regras', + title: 'Controlo de acesso ao nível da aplicação', + description: + 'Restrinja que utilizadores podem iniciar sessão nesta aplicação configurando regras de acesso.', + enable: 'Ativar controlo de acesso', + enable_description: + 'Apenas os utilizadores que correspondam a pelo menos uma regra configurada podem aceder a esta aplicação.', + enable_without_rules_notice: + 'Adicione pelo menos uma regra de acesso antes de ativar o controlo de acesso.', + enabled_notice: + 'O controlo de acesso está ativo. Apenas os utilizadores que correspondam a pelo menos uma regra podem aceder a esta aplicação.', + disabled_notice: + 'O controlo de acesso está desativado. Todos os utilizadores registados podem aceder a esta aplicação.', + load_error: 'Falha ao carregar as regras de controlo de acesso.', + rules: 'Regras de acesso', + rules_description: + 'Os utilizadores podem aceder a esta aplicação quando corresponderem a qualquer uma das regras configuradas.', + empty_rules_description: 'Ainda não foram configuradas regras.', + rule_count: '{{count}} regra', + rule_count_other: '{{count}} regras', + rule_users: 'Utilizadores', + rule_users_description: 'Utilizadores específicos podem aceder a esta aplicação.', + rule_user_roles: 'Funções de utilizador', + rule_user_roles_description: + 'Utilizadores atribuídos às funções de utilizador selecionadas podem aceder a esta aplicação.', + rule_organizations: 'Organizações', + rule_organizations_description: + 'Todos os membros atuais e futuros das organizações selecionadas podem aceder a esta aplicação.', + rule_organization_roles: 'Funções da organização', + rule_organization_roles_description: + 'Membros com as funções da organização selecionadas nas organizações selecionadas podem aceder a esta aplicação.', + }, branding: { name: 'Marca', description: 'Personalize o nome e o logótipo da sua aplicação no ecrã de consentimento.', diff --git a/packages/phrases/src/locales/ru/translation/admin-console/application-details.ts b/packages/phrases/src/locales/ru/translation/admin-console/application-details.ts index b5fc727b8ea..daea93ba033 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/application-details.ts @@ -121,6 +121,39 @@ const application_details = { field_custom_data_tip: 'Дополнительная информация о приложении, не указанная в предопределенных свойствах приложения, такая как настройки и конфигурации, специфичные для бизнеса.', custom_data_invalid: 'Пользовательские данные должны быть допустимым объектом JSON', + access_control: { + name: 'Правила', + title: 'Контроль доступа на уровне приложения', + description: + 'Ограничьте, какие пользователи могут входить в это приложение, настроив правила доступа.', + enable: 'Включить контроль доступа', + enable_description: + 'Доступ к приложению получат только пользователи, соответствующие хотя бы одному настроенному правилу.', + enable_without_rules_notice: + 'Добавьте хотя бы одно правило доступа перед включением контроля доступа.', + enabled_notice: + 'Контроль доступа включен. Доступ к приложению получат только пользователи, соответствующие хотя бы одному правилу.', + disabled_notice: + 'Контроль доступа выключен. Все зарегистрированные пользователи могут получить доступ к этому приложению.', + load_error: 'Не удалось загрузить правила контроля доступа.', + rules: 'Правила доступа', + rules_description: + 'Пользователи могут получить доступ к приложению, если соответствуют любому из настроенных правил.', + empty_rules_description: 'Правила еще не настроены.', + rule_count: '{{count}} правило', + rule_count_other: '{{count}} правил', + rule_users: 'Пользователи', + rule_users_description: 'Указанные пользователи могут получить доступ к этому приложению.', + rule_user_roles: 'Роли пользователей', + rule_user_roles_description: + 'Пользователи, назначенные на выбранные роли пользователей, могут получить доступ к этому приложению.', + rule_organizations: 'Организации', + rule_organizations_description: + 'Все текущие и будущие участники выбранных организаций могут получить доступ к этому приложению.', + rule_organization_roles: 'Роли организации', + rule_organization_roles_description: + 'Участники с выбранными ролями организации в выбранных организациях могут получить доступ к этому приложению.', + }, branding: { name: 'Брендинг', description: 'Настройте отображаемое имя и логотип вашего приложения на экране согласия.', diff --git a/packages/phrases/src/locales/th/translation/admin-console/application-details.ts b/packages/phrases/src/locales/th/translation/admin-console/application-details.ts index bc28f41a951..de024e2fa3f 100644 --- a/packages/phrases/src/locales/th/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/th/translation/admin-console/application-details.ts @@ -120,6 +120,35 @@ const application_details = { field_custom_data_tip: 'ข้อมูลเพิ่มเติมที่ไม่อยู่ในคุณสมบัติแอปที่กำหนดไว้ล่วงหน้าเช่น ข้อมูลธุรกิจหรือการตั้งค่าเฉพาะ', custom_data_invalid: 'ข้อมูลกำหนดเองต้องเป็น JSON object ที่ถูกต้อง', + access_control: { + name: 'กฎ', + title: 'การควบคุมการเข้าถึงระดับแอป', + description: 'จำกัดผู้ใช้ที่สามารถเข้าสู่ระบบแอปนี้ได้โดยกำหนดค่ากฎการเข้าถึง', + enable: 'เปิดใช้งานการควบคุมการเข้าถึง', + enable_description: + 'เฉพาะผู้ใช้ที่ตรงกับกฎที่กำหนดไว้อย่างน้อยหนึ่งข้อเท่านั้นที่เข้าถึงแอปนี้ได้', + enable_without_rules_notice: + 'เพิ่มกฎการเข้าถึงอย่างน้อยหนึ่งข้อก่อนเปิดใช้งานการควบคุมการเข้าถึง', + enabled_notice: + 'เปิดการควบคุมการเข้าถึงแล้ว เฉพาะผู้ใช้ที่ตรงกับกฎอย่างน้อยหนึ่งข้อเท่านั้นที่เข้าถึงแอปนี้ได้', + disabled_notice: 'ปิดการควบคุมการเข้าถึงแล้ว ผู้ใช้ที่ลงทะเบียนทั้งหมดสามารถเข้าถึงแอปนี้ได้', + load_error: 'โหลดกฎการควบคุมการเข้าถึงไม่สำเร็จ', + rules: 'กฎการเข้าถึง', + rules_description: 'ผู้ใช้สามารถเข้าถึงแอปนี้ได้เมื่อตรงกับกฎที่กำหนดไว้ข้อใดข้อหนึ่ง', + empty_rules_description: 'ยังไม่ได้กำหนดค่ากฎใด ๆ', + rule_count: '{{count}} กฎ', + rule_count_other: '{{count}} กฎ', + rule_users: 'ผู้ใช้', + rule_users_description: 'ผู้ใช้ที่ระบุสามารถเข้าถึงแอปนี้ได้', + rule_user_roles: 'บทบาทผู้ใช้', + rule_user_roles_description: 'ผู้ใช้ที่ได้รับบทบาทผู้ใช้ที่เลือกสามารถเข้าถึงแอปนี้ได้', + rule_organizations: 'องค์กร', + rule_organizations_description: + 'สมาชิกปัจจุบันและอนาคตทั้งหมดขององค์กรที่เลือกสามารถเข้าถึงแอปนี้ได้', + rule_organization_roles: 'บทบาทองค์กร', + rule_organization_roles_description: + 'สมาชิกที่มีบทบาทองค์กรที่เลือกในองค์กรที่เลือกสามารถเข้าถึงแอปนี้ได้', + }, branding: { name: 'การสร้างแบรนด์', description: 'ปรับแต่งโลโก้แอปและสีแบรนด์สำหรับประสบการณ์ในระดับแอป', diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/application-details.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/application-details.ts index 5d33dd5de6f..e01622cbf42 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/application-details.ts @@ -120,6 +120,38 @@ const application_details = { field_custom_data_tip: 'Önceden tanımlanmış uygulama özelliklerinde listelenmeyen ek özel uygulama bilgileri, iş ile ilgili ayarlar ve yapılandırmalar gibi.', custom_data_invalid: 'Özel veri geçerli bir JSON nesnesi olmalıdır', + access_control: { + name: 'Kurallar', + title: 'Uygulama düzeyinde erişim kontrolü', + description: + 'Erişim kuralları yapılandırarak bu uygulamada kimlerin oturum açabileceğini sınırlayın.', + enable: 'Erişim kontrolünü etkinleştir', + enable_description: + 'Yapılandırılmış kurallardan en az biriyle eşleşen kullanıcılar bu uygulamaya erişebilir.', + enable_without_rules_notice: + 'Erişim kontrolünü etkinleştirmeden önce en az bir erişim kuralı ekleyin.', + enabled_notice: + 'Erişim kontrolü açık. En az bir kuralla eşleşen kullanıcılar bu uygulamaya erişebilir.', + disabled_notice: 'Erişim kontrolü kapalı. Tüm kayıtlı kullanıcılar bu uygulamaya erişebilir.', + load_error: 'Erişim kontrolü kuralları yüklenemedi.', + rules: 'Erişim kuralları', + rules_description: + 'Kullanıcılar yapılandırılmış kurallardan herhangi biriyle eşleştiğinde bu uygulamaya erişebilir.', + empty_rules_description: 'Henüz yapılandırılmış kural yok.', + rule_count: '{{count}} kural', + rule_count_other: '{{count}} kural', + rule_users: 'Kullanıcılar', + rule_users_description: 'Belirli kullanıcılar bu uygulamaya erişebilir.', + rule_user_roles: 'Kullanıcı rolleri', + rule_user_roles_description: + 'Seçilen kullanıcı rollerine atanmış kullanıcılar bu uygulamaya erişebilir.', + rule_organizations: 'Organizasyonlar', + rule_organizations_description: + 'Seçilen organizasyonların mevcut ve gelecekteki tüm üyeleri bu uygulamaya erişebilir.', + rule_organization_roles: 'Organizasyon rolleri', + rule_organization_roles_description: + 'Seçilen organizasyonlarda seçilen organizasyon rollerine sahip üyeler bu uygulamaya erişebilir.', + }, branding: { name: 'Markalama', description: 'Uygulamanızın adını ve logosunu açıklama ekranında özelleştirin.', diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/application-details.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/application-details.ts index 751f2d56a89..80781a15a40 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/application-details.ts @@ -114,6 +114,30 @@ const application_details = { field_custom_data_tip: '不在预定义的应用程序属性中列出的其他自定义应用程序信息,例如业务特定的设置和配置。', custom_data_invalid: '自定义数据必须是有效的 JSON 对象', + access_control: { + name: '规则', + title: '应用级访问控制', + description: '通过配置访问规则,限制哪些用户可以登录此应用。', + enable: '启用访问控制', + enable_description: '仅允许匹配至少一条已配置规则的用户访问此应用。', + enable_without_rules_notice: '请先添加至少一条访问规则,再启用访问控制。', + enabled_notice: '访问控制已开启。只有匹配至少一条规则的用户可以访问此应用。', + disabled_notice: '访问控制已关闭。所有已注册用户都可以访问此应用。', + load_error: '加载访问控制规则失败。', + rules: '访问规则', + rules_description: '用户匹配任意一条已配置规则时即可访问此应用。', + empty_rules_description: '尚未配置任何规则。', + rule_count: '{{count}} 条规则', + rule_count_other: '{{count}} 条规则', + rule_users: '用户', + rule_users_description: '指定用户可以访问此应用。', + rule_user_roles: '用户角色', + rule_user_roles_description: '拥有所选用户角色的用户可以访问此应用。', + rule_organizations: '组织', + rule_organizations_description: '所选组织中的当前和未来成员都可以访问此应用。', + rule_organization_roles: '组织角色', + rule_organization_roles_description: '在所选组织中拥有所选组织角色的成员可以访问此应用。', + }, branding: { name: '品牌化', description: '在授权屏幕上自定义应用程序的显示名称和标识。', diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/application-details.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/application-details.ts index f3f0fe6ba5a..07a8b9c46a8 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/application-details.ts @@ -114,6 +114,30 @@ const application_details = { field_custom_data_tip: '額外的自定義應用程式資訊,不在預定義的應用程式屬性中列出,例如業務特定的設定和配置。', custom_data_invalid: '自定義資料必須是一個有效的 JSON 對象', + access_control: { + name: '規則', + title: '應用程式級別訪問控制', + description: '透過配置訪問規則,限制哪些用戶可以登入此應用程式。', + enable: '啟用訪問控制', + enable_description: '僅允許符合至少一條已配置規則的用戶訪問此應用程式。', + enable_without_rules_notice: '請先新增至少一條訪問規則,再啟用訪問控制。', + enabled_notice: '訪問控制已開啟。只有符合至少一條規則的用戶可以訪問此應用程式。', + disabled_notice: '訪問控制已關閉。所有已註冊用戶都可以訪問此應用程式。', + load_error: '載入訪問控制規則失敗。', + rules: '訪問規則', + rules_description: '用戶符合任一條已配置規則時即可訪問此應用程式。', + empty_rules_description: '尚未配置任何規則。', + rule_count: '{{count}} 條規則', + rule_count_other: '{{count}} 條規則', + rule_users: '用戶', + rule_users_description: '指定用戶可以訪問此應用程式。', + rule_user_roles: '用戶角色', + rule_user_roles_description: '擁有所選用戶角色的用戶可以訪問此應用程式。', + rule_organizations: '組織', + rule_organizations_description: '所選組織中的現有和未來成員都可以訪問此應用程式。', + rule_organization_roles: '組織角色', + rule_organization_roles_description: '在所選組織中擁有所選組織角色的成員可以訪問此應用程式。', + }, branding: { name: '品牌推廣', description: '在同意屏幕上自訂您應用程式的顯示名稱和標誌。', diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/application-details.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/application-details.ts index 3f8798bbc6a..25c4b460717 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/application-details.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/application-details.ts @@ -113,6 +113,30 @@ const application_details = { field_custom_data: '自定義資料', field_custom_data_tip: '額外的自定義應用資訊,不在預定義的應用屬性中,例如業務特定的設置和配置。', custom_data_invalid: '自定義資料必須是有效的 JSON 對象', + access_control: { + name: '規則', + title: '應用程式層級存取控制', + description: '透過配置存取規則,限制哪些使用者可以登入此應用程式。', + enable: '啟用存取控制', + enable_description: '僅允許符合至少一條已配置規則的使用者存取此應用程式。', + enable_without_rules_notice: '請先新增至少一條存取規則,再啟用存取控制。', + enabled_notice: '存取控制已開啟。只有符合至少一條規則的使用者可以存取此應用程式。', + disabled_notice: '存取控制已關閉。所有已註冊使用者都可以存取此應用程式。', + load_error: '載入存取控制規則失敗。', + rules: '存取規則', + rules_description: '使用者符合任一條已配置規則時即可存取此應用程式。', + empty_rules_description: '尚未配置任何規則。', + rule_count: '{{count}} 條規則', + rule_count_other: '{{count}} 條規則', + rule_users: '使用者', + rule_users_description: '指定使用者可以存取此應用程式。', + rule_user_roles: '使用者角色', + rule_user_roles_description: '擁有所選使用者角色的使用者可以存取此應用程式。', + rule_organizations: '組織', + rule_organizations_description: '所選組織中的目前與未來成員都可以存取此應用程式。', + rule_organization_roles: '組織角色', + rule_organization_roles_description: '在所選組織中擁有所選組織角色的成員可以存取此應用程式。', + }, branding: { name: '品牌', description: '在同意畫面上自訂應用程式的顯示名稱和標誌。',