diff --git a/packages/cli/src/commands/translate/sync-keys/utils.ts b/packages/cli/src/commands/translate/sync-keys/utils.ts index f253864e1..8ee581bc2 100644 --- a/packages/cli/src/commands/translate/sync-keys/utils.ts +++ b/packages/cli/src/commands/translate/sync-keys/utils.ts @@ -271,18 +271,11 @@ const traverseNode = async ( if (Array.isArray(value)) { const [phrase] = value; - // If the key exists in the target language and the value is a string, - // use the value of the target language and inherit the untranslated - // mark; otherwise, use the value of the baseline language and add a - // comment to indicate that the phrase is untranslated to help identify - // missing translations. - if (Array.isArray(existingValue)) { - if (!existingValue[1]) { - await fs.appendFile( - targetFilePath, - `${' '.repeat(tabSize)}/** ${untranslatedMark} */\n` - ); - } + // If the key exists in the target language and the value is a translated + // string, use the value of the target language; otherwise, use the value + // of the baseline language and add a comment to indicate that the phrase + // is untranslated to help identify missing translations. + if (Array.isArray(existingValue) && existingValue[1]) { await fs.appendFile( targetFilePath, `${' '.repeat(tabSize)}${key}: ${existingValue[0]},\n` diff --git a/packages/console/src/pages/SignInExperience/tabs/PasswordPolicy/index.tsx b/packages/console/src/pages/SignInExperience/tabs/PasswordPolicy/index.tsx index eb735d80b..9c30accd8 100644 --- a/packages/console/src/pages/SignInExperience/tabs/PasswordPolicy/index.tsx +++ b/packages/console/src/pages/SignInExperience/tabs/PasswordPolicy/index.tsx @@ -2,7 +2,7 @@ import { PasswordPolicyChecker } from '@logto/core-kit'; import { cond } from '@silverhand/essentials'; import { type ChangeEvent, type ReactNode } from 'react'; import { Controller, type FieldPath, useFormContext } from 'react-hook-form'; -import { useTranslation } from 'react-i18next'; +import { Trans, useTranslation } from 'react-i18next'; import PageMeta from '@/components/PageMeta'; import Card from '@/ds-components/Card'; @@ -11,6 +11,7 @@ import FormField from '@/ds-components/FormField'; import RadioGroup, { Radio } from '@/ds-components/RadioGroup'; import TabWrapper from '@/ds-components/TabWrapper'; import NumericInput from '@/ds-components/TextInput/NumericInput'; +import TextLink from '@/ds-components/TextLink'; import Textarea from '@/ds-components/Textarea'; import { type SignInExperienceForm } from '../../types'; @@ -76,7 +77,13 @@ function PasswordPolicy({ isActive }: Props) {
{t('password_requirements')}
- {t('minimum_length_description', { max })} + , + }} + > + {t('minimum_length_description', { max })} +
{t('password_rejection')}
- + - + & { // Use for displaying a list of restricted issues diff --git a/packages/phrases-ui/src/locales/es/description.ts b/packages/phrases-ui/src/locales/es/description.ts index 1291e5944..a4c92acc7 100644 --- a/packages/phrases-ui/src/locales/es/description.ts +++ b/packages/phrases-ui/src/locales/es/description.ts @@ -61,10 +61,17 @@ const description = { verify_email: 'Verificar su correo electrónico', verify_phone: 'Verificar su número de teléfono', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/es/error/password-rejected.ts b/packages/phrases-ui/src/locales/es/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/es/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/es/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/fr/description.ts b/packages/phrases-ui/src/locales/fr/description.ts index 05da0d36a..b0e36b20c 100644 --- a/packages/phrases-ui/src/locales/fr/description.ts +++ b/packages/phrases-ui/src/locales/fr/description.ts @@ -63,10 +63,17 @@ const description = { verify_email: 'Vérifiez votre e-mail', verify_phone: 'Vérifiez votre numéro de téléphone', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/fr/error/password-rejected.ts b/packages/phrases-ui/src/locales/fr/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/fr/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/fr/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/it/description.ts b/packages/phrases-ui/src/locales/it/description.ts index d26586c3e..6c6823305 100644 --- a/packages/phrases-ui/src/locales/it/description.ts +++ b/packages/phrases-ui/src/locales/it/description.ts @@ -59,10 +59,17 @@ const description = { verify_email: 'Verifica la tua email', verify_phone: 'Verifica il tuo numero di telefono', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/it/error/password-rejected.ts b/packages/phrases-ui/src/locales/it/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/it/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/it/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/ja/description.ts b/packages/phrases-ui/src/locales/ja/description.ts index 9f9825071..669bf59f0 100644 --- a/packages/phrases-ui/src/locales/ja/description.ts +++ b/packages/phrases-ui/src/locales/ja/description.ts @@ -61,10 +61,17 @@ const description = { verify_email: 'Eメールを確認する', verify_phone: '電話番号を確認する', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/ja/error/password-rejected.ts b/packages/phrases-ui/src/locales/ja/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/ja/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/ja/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/ko/description.ts b/packages/phrases-ui/src/locales/ko/description.ts index f263d388f..b47400d70 100644 --- a/packages/phrases-ui/src/locales/ko/description.ts +++ b/packages/phrases-ui/src/locales/ko/description.ts @@ -56,10 +56,17 @@ const description = { verify_email: '이메일 인증', verify_phone: '휴대전화번호 인증', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/ko/error/password-rejected.ts b/packages/phrases-ui/src/locales/ko/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/ko/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/ko/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/pl-pl/description.ts b/packages/phrases-ui/src/locales/pl-pl/description.ts index 2665195af..d35628e64 100644 --- a/packages/phrases-ui/src/locales/pl-pl/description.ts +++ b/packages/phrases-ui/src/locales/pl-pl/description.ts @@ -59,10 +59,17 @@ const description = { verify_email: 'Potwierdź swój email', verify_phone: 'Potwierdź swój numer telefonu', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/pl-pl/error/password-rejected.ts b/packages/phrases-ui/src/locales/pl-pl/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/pl-pl/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/pl-pl/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/pt-br/description.ts b/packages/phrases-ui/src/locales/pt-br/description.ts index 25d9e7043..472523097 100644 --- a/packages/phrases-ui/src/locales/pt-br/description.ts +++ b/packages/phrases-ui/src/locales/pt-br/description.ts @@ -58,10 +58,17 @@ const description = { verify_email: 'Verificar e-mail', verify_phone: 'Verificar número de telefone', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/pt-br/error/password-rejected.ts b/packages/phrases-ui/src/locales/pt-br/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/pt-br/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/pt-br/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/pt-pt/description.ts b/packages/phrases-ui/src/locales/pt-pt/description.ts index 229d2bc83..1d3c6591c 100644 --- a/packages/phrases-ui/src/locales/pt-pt/description.ts +++ b/packages/phrases-ui/src/locales/pt-pt/description.ts @@ -58,10 +58,17 @@ const description = { verify_email: 'Verifique o seu email', verify_phone: 'Verifique o seu número de telefone', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/pt-pt/error/password-rejected.ts b/packages/phrases-ui/src/locales/pt-pt/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/pt-pt/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/pt-pt/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/ru/description.ts b/packages/phrases-ui/src/locales/ru/description.ts index 103c9a65f..e5d40e7d7 100644 --- a/packages/phrases-ui/src/locales/ru/description.ts +++ b/packages/phrases-ui/src/locales/ru/description.ts @@ -62,10 +62,17 @@ const description = { verify_email: 'Подтвердите Ваш электронный адрес', verify_phone: 'Подтвердите свой номер телефона', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/ru/error/password-rejected.ts b/packages/phrases-ui/src/locales/ru/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/ru/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/ru/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/tr-tr/description.ts b/packages/phrases-ui/src/locales/tr-tr/description.ts index ebfefb5fb..9776a2900 100644 --- a/packages/phrases-ui/src/locales/tr-tr/description.ts +++ b/packages/phrases-ui/src/locales/tr-tr/description.ts @@ -59,10 +59,17 @@ const description = { verify_email: 'E-postanızın doğrulanması', verify_phone: 'Telefon numaranızın doğrulanması', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/tr-tr/error/password-rejected.ts b/packages/phrases-ui/src/locales/tr-tr/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/tr-tr/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/tr-tr/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/zh-cn/description.ts b/packages/phrases-ui/src/locales/zh-cn/description.ts index 94ad2c6e2..4f06131c3 100644 --- a/packages/phrases-ui/src/locales/zh-cn/description.ts +++ b/packages/phrases-ui/src/locales/zh-cn/description.ts @@ -52,10 +52,17 @@ const description = { verify_email: '验证你的邮箱', verify_phone: '验证你的手机号', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/zh-cn/error/password-rejected.ts b/packages/phrases-ui/src/locales/zh-cn/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/zh-cn/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/zh-cn/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/zh-hk/description.ts b/packages/phrases-ui/src/locales/zh-hk/description.ts index 8f55b8689..4dcbabe30 100644 --- a/packages/phrases-ui/src/locales/zh-hk/description.ts +++ b/packages/phrases-ui/src/locales/zh-hk/description.ts @@ -52,10 +52,17 @@ const description = { verify_email: '驗證你的郵箱', verify_phone: '驗證你的手機號', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/zh-hk/error/password-rejected.ts b/packages/phrases-ui/src/locales/zh-hk/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/zh-hk/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/zh-hk/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases-ui/src/locales/zh-tw/description.ts b/packages/phrases-ui/src/locales/zh-tw/description.ts index d6bf2206b..9f352a069 100644 --- a/packages/phrases-ui/src/locales/zh-tw/description.ts +++ b/packages/phrases-ui/src/locales/zh-tw/description.ts @@ -52,10 +52,17 @@ const description = { verify_email: '驗證你的郵箱', verify_phone: '驗證你的手機號碼', /** UNTRANSLATED */ - password_requirements_with_type_one: 'Password requires a minimum of {{min}} characters.', + password_requirements: 'Password {{items, list}}.', /** UNTRANSLATED */ - password_requirements_with_type_other: - 'Password requires a minimum of {{min}} characters, and contains {{count}} of the following: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), and symbols.', + 'password_requirement.length_one': 'requires a minimum of {{count}} character', + /** UNTRANSLATED */ + 'password_requirement.length_other': 'requires a minimum of {{count}} characters', + /** UNTRANSLATED */ + 'password_requirement.character_types_one': + 'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols', + /** UNTRANSLATED */ + 'password_requirement.character_types_other': + 'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols', }; export default Object.freeze(description); diff --git a/packages/phrases-ui/src/locales/zh-tw/error/password-rejected.ts b/packages/phrases-ui/src/locales/zh-tw/error/password-rejected.ts index 7fad17fe3..076cecd67 100644 --- a/packages/phrases-ui/src/locales/zh-tw/error/password-rejected.ts +++ b/packages/phrases-ui/src/locales/zh-tw/error/password-rejected.ts @@ -16,7 +16,7 @@ const password_rejected = { /** UNTRANSLATED */ 'restricted.sequence': 'sequential characters', /** UNTRANSLATED */ - 'restricted.personal_info': 'your personal information', + 'restricted.user_info': 'your personal information', /** UNTRANSLATED */ 'restricted.words': 'product context', }; diff --git a/packages/phrases/src/locales/de/errors/password.ts b/packages/phrases/src/locales/de/errors/password.ts index 4f8abdc4d..999c7e524 100644 --- a/packages/phrases/src/locales/de/errors/password.ts +++ b/packages/phrases/src/locales/de/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'Die Verschlüsselungsmethode {{name}} wird nicht unterstützt.', pepper_not_found: 'Password pepper not found. Please check your core envs.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/en/errors/password.ts b/packages/phrases/src/locales/en/errors/password.ts index c6fa59e51..a0485c1d3 100644 --- a/packages/phrases/src/locales/en/errors/password.ts +++ b/packages/phrases/src/locales/en/errors/password.ts @@ -1,7 +1,7 @@ const password = { unsupported_encryption_method: 'The encryption method {{name}} is not supported.', pepper_not_found: 'Password pepper not found. Please check your core envs.', - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/password-policy.ts index d3424340a..be31791c7 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/password-policy.ts @@ -2,25 +2,25 @@ const password_policy = { password_requirements: 'Password requirements', minimum_length: 'Minimum length', minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', minimum_required_char_types: 'Minimum required character types', minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', password_rejection: 'Password rejection', - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', breached_passwords: 'Breached passwords', - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + breached_passwords_description: 'Reject passwords previously found in breach databases.', + restricted_phrases: 'Restrict low-security phrases', + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', repetitive_or_sequential_characters: 'Repetitive or sequential characters', - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", - personal_information: 'Personal information', - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', + user_information: 'User information', + user_information_description: 'E.g., email address, phone number, username, etc.', custom_words: 'Custom words', custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/es/errors/password.ts b/packages/phrases/src/locales/es/errors/password.ts index 4719c8119..1edd3ffc9 100644 --- a/packages/phrases/src/locales/es/errors/password.ts +++ b/packages/phrases/src/locales/es/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'El método de encriptación {{name}} no es compatible.', pepper_not_found: 'No se encontró el password pepper. Por favor revisa tus variables de entorno.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/fr/errors/password.ts b/packages/phrases/src/locales/fr/errors/password.ts index 1e4537f61..e88a76e89 100644 --- a/packages/phrases/src/locales/fr/errors/password.ts +++ b/packages/phrases/src/locales/fr/errors/password.ts @@ -3,7 +3,7 @@ const password = { pepper_not_found: 'Mot de passe pepper non trouvé. Veuillez vérifier votre environnement de base.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/it/errors/password.ts b/packages/phrases/src/locales/it/errors/password.ts index 3b65fc05d..2418b11ee 100644 --- a/packages/phrases/src/locales/it/errors/password.ts +++ b/packages/phrases/src/locales/it/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'Il metodo di crittografia {{name}} non è supportato.', pepper_not_found: 'Pepper password non trovato. Per favore controlla le tue env di core.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/ja/errors/password.ts b/packages/phrases/src/locales/ja/errors/password.ts index 75b5b032c..3b9a8385d 100644 --- a/packages/phrases/src/locales/ja/errors/password.ts +++ b/packages/phrases/src/locales/ja/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '暗号化方式 {{name}} はサポートされていません。', pepper_not_found: 'パスワードペッパーが見つかりません。コアの環境を確認してください。', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/ko/errors/password.ts b/packages/phrases/src/locales/ko/errors/password.ts index 4815312f5..8640a9538 100644 --- a/packages/phrases/src/locales/ko/errors/password.ts +++ b/packages/phrases/src/locales/ko/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '{{name}} 암호화 방법을 지원하지 않아요.', pepper_not_found: '비밀번호 Pepper를 찾을 수 없어요. Core 환경설정을 확인해 주세요.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/pl-pl/errors/password.ts b/packages/phrases/src/locales/pl-pl/errors/password.ts index c8b76f977..29a4cc8af 100644 --- a/packages/phrases/src/locales/pl-pl/errors/password.ts +++ b/packages/phrases/src/locales/pl-pl/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'Metoda szyfrowania {{name}} nie jest obsługiwana.', pepper_not_found: 'Nie znaleziono wartości pepper dla hasła. Sprawdź swoje zmienne środowiskowe.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/pt-br/errors/password.ts b/packages/phrases/src/locales/pt-br/errors/password.ts index 1d697c4e4..9374bce49 100644 --- a/packages/phrases/src/locales/pt-br/errors/password.ts +++ b/packages/phrases/src/locales/pt-br/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'O método de criptografia {{name}} não é suportado.', pepper_not_found: 'Password pepper não encontrada. Por favor, verifique seus envs principais.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/pt-pt/errors/password.ts b/packages/phrases/src/locales/pt-pt/errors/password.ts index 9be391522..cc0230a3d 100644 --- a/packages/phrases/src/locales/pt-pt/errors/password.ts +++ b/packages/phrases/src/locales/pt-pt/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'O método de enncriptação {{name}} não é suportado.', pepper_not_found: 'pepper da Password não encontrada. Por favor, verifique os envs.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/ru/errors/password.ts b/packages/phrases/src/locales/ru/errors/password.ts index 1a9436f25..6230d7599 100644 --- a/packages/phrases/src/locales/ru/errors/password.ts +++ b/packages/phrases/src/locales/ru/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: 'Метод шифрования {{name}} не поддерживается.', pepper_not_found: 'Не найден пепер пароля. Пожалуйста, проверьте ваши основные envs.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/tr-tr/errors/password.ts b/packages/phrases/src/locales/tr-tr/errors/password.ts index cd3fe7ab8..adf26c608 100644 --- a/packages/phrases/src/locales/tr-tr/errors/password.ts +++ b/packages/phrases/src/locales/tr-tr/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '{{name}} şifreleme metodu desteklenmiyor.', pepper_not_found: 'Şifre pepperı bulunamadı. Lütfen core envs.i kontrol edin.', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/zh-cn/errors/password.ts b/packages/phrases/src/locales/zh-cn/errors/password.ts index 8afb9be27..f3c63dbbd 100644 --- a/packages/phrases/src/locales/zh-cn/errors/password.ts +++ b/packages/phrases/src/locales/zh-cn/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '不支持的加密方法 {{name}}', pepper_not_found: '密码 pepper 未找到。请检查 core 的环境变量。', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/zh-hk/errors/password.ts b/packages/phrases/src/locales/zh-hk/errors/password.ts index 6445b275b..9b55a84d1 100644 --- a/packages/phrases/src/locales/zh-hk/errors/password.ts +++ b/packages/phrases/src/locales/zh-hk/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '不支持的加密方法 {{name}}', pepper_not_found: '密碼 pepper 未找到。請檢查 core 的環境變量。', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/phrases/src/locales/zh-tw/errors/password.ts b/packages/phrases/src/locales/zh-tw/errors/password.ts index 718c2a82e..6e105bc52 100644 --- a/packages/phrases/src/locales/zh-tw/errors/password.ts +++ b/packages/phrases/src/locales/zh-tw/errors/password.ts @@ -2,7 +2,7 @@ const password = { unsupported_encryption_method: '不支持的加密方法 {{name}}', pepper_not_found: '密碼 pepper 未找到。請檢查 core 的環境變數。', /** UNTRANSLATED */ - rejected: 'Password rejected. Please check your password meets the requirements.', + rejected: 'Password rejected. Please check if your password meets the requirements.', }; export default Object.freeze(password); diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/password-policy.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/password-policy.ts index 5eedbc1b6..8b1b17117 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/password-policy.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/password-policy.ts @@ -5,39 +5,40 @@ const password_policy = { minimum_length: 'Minimum length', /** UNTRANSLATED */ minimum_length_description: - 'NIST recommends a minimum of 8 characters for web products. The maximum length is fixed at {{max}} characters.', + 'NIST suggests using at least 8 characters for web products. The maximum length is {{max}}.', /** UNTRANSLATED */ minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).', /** UNTRANSLATED */ minimum_required_char_types: 'Minimum required character types', /** UNTRANSLATED */ minimum_required_char_types_description: - 'The four character types are lowercase letters (a-z), uppercase letters (A-Z), numbers (0-9), and special characters ({{symbols}}).', + 'Lowercase letters (A-Z), uppercase letters (a-z), numbers (0-9), and special characters ({{symbols}}) are all.', /** UNTRANSLATED */ password_rejection: 'Password rejection', /** UNTRANSLATED */ - forbidden_passwords: 'Forbidden passwords', + compromised_passwords: 'Reject compromised password', /** UNTRANSLATED */ breached_passwords: 'Breached passwords', /** UNTRANSLATED */ - breached_passwords_description: - 'Prevent users from using passwords that have been breached in other systems.', + breached_passwords_description: 'Reject passwords previously found in breach databases.', /** UNTRANSLATED */ - restricted_phrases_in_passwords: 'Restricted phrases in passwords', + restricted_phrases: 'Restrict low-security phrases', + /** UNTRANSLATED */ + restricted_phrases_tooltip: + 'Users cannot use passwords that are exactly the same as or made up of the listed phrases below. The addition of 3 or more non-consecutive characters is allowed to increase password complexity.', /** UNTRANSLATED */ repetitive_or_sequential_characters: 'Repetitive or sequential characters', /** UNTRANSLATED */ - repetitive_or_sequential_characters_description: "For example, 'aaaaa' or '12345'", + repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".', /** UNTRANSLATED */ - personal_information: 'Personal information', + user_information: 'User information', /** UNTRANSLATED */ - personal_information_description: - 'Email address, phone number, username, first name, last name, etc.', + user_information_description: 'E.g., email address, phone number, username, etc.', /** UNTRANSLATED */ custom_words: 'Custom words', /** UNTRANSLATED */ custom_words_description: - 'Customize the list of words to reject. Enter one word per line. Words are case-insensitive.', + 'Personalize context-specific words, case-insensitive, and one per line.', /** UNTRANSLATED */ custom_words_placeholder: 'Your service name, company name, etc.', }; diff --git a/packages/toolkit/core-kit/src/password-policy.test.ts b/packages/toolkit/core-kit/src/password-policy.test.ts index f4c88aaf7..657a6d0e8 100644 --- a/packages/toolkit/core-kit/src/password-policy.test.ts +++ b/packages/toolkit/core-kit/src/password-policy.test.ts @@ -39,7 +39,7 @@ describe('PasswordPolicyChecker -> check()', () => { rejects: { pwned: true, repetitionAndSequence: true, - personalInfo: true, + userInfo: true, words: ['test', 'aaaa'], }, }); @@ -60,7 +60,7 @@ describe('PasswordPolicyChecker -> check()', () => { { code: 'password_rejected.character_types', interpolation: { min: 2 } }, { code: 'password_rejected.pwned' }, { code: 'password_rejected.restricted.sequence' }, - { code: 'password_rejected.restricted.personal_info' }, + { code: 'password_rejected.restricted.user_info' }, ]); expect(await checker.check('aaaaaatest😀', {})).toEqual([ @@ -79,12 +79,12 @@ describe('PasswordPolicyChecker -> checkCharTypes()', () => { const checker1 = new PasswordPolicyChecker({ length: { min: 1, max: 256 }, characterTypes: { min: 2 }, - rejects: { pwned: false, repetitionAndSequence: false, personalInfo: false, words: [] }, + rejects: { pwned: false, repetitionAndSequence: false, userInfo: false, words: [] }, }); const checker2 = new PasswordPolicyChecker({ length: { min: 1, max: 256 }, characterTypes: { min: 4 }, - rejects: { pwned: false, repetitionAndSequence: false, personalInfo: false, words: [] }, + rejects: { pwned: false, repetitionAndSequence: false, userInfo: false, words: [] }, }); it('should reject unsupported characters', () => { @@ -108,7 +108,7 @@ describe('PasswordPolicyChecker -> hasBeenPwned()', () => { const checker = new PasswordPolicyChecker({ length: { min: 1, max: 256 }, characterTypes: { min: 2 }, - rejects: { pwned: true, repetitionAndSequence: false, personalInfo: false, words: [] }, + rejects: { pwned: true, repetitionAndSequence: false, userInfo: false, words: [] }, }); mockPwnResponse(); @@ -141,33 +141,33 @@ describe('PasswordPolicyChecker -> hasRepetition()', () => { }); }); -describe('PasswordPolicyChecker -> hasPersonalInfo()', () => { +describe('PasswordPolicyChecker -> hasUserInfo()', () => { const checker = new PasswordPolicyChecker({ - rejects: { pwned: false, repetitionAndSequence: false, personalInfo: true, words: [] }, + rejects: { pwned: false, repetitionAndSequence: false, userInfo: true, words: [] }, }); it('should reject password with name', () => { - expect(checker.hasPersonalInfo('test', { name: 'test' })).toBe(true); - expect(checker.hasPersonalInfo('test', { name: 'test2' })).toBe(false); - expect(checker.hasPersonalInfo('FOO', { name: 'Foo bar' })).toBe(true); - expect(checker.hasPersonalInfo('Foo', { name: 'bar fOo' })).toBe(true); + expect(checker.hasUserInfo('test', { name: 'test' })).toBe(true); + expect(checker.hasUserInfo('test', { name: 'test2' })).toBe(false); + expect(checker.hasUserInfo('FOO', { name: 'Foo bar' })).toBe(true); + expect(checker.hasUserInfo('Foo', { name: 'bar fOo' })).toBe(true); }); it('should reject password with username', () => { - expect(checker.hasPersonalInfo('123.456!test', { username: 'teST' })).toBe(true); - expect(checker.hasPersonalInfo('test', { username: 'test2' })).toBe(false); + expect(checker.hasUserInfo('123.456!test', { username: 'teST' })).toBe(true); + expect(checker.hasUserInfo('test', { username: 'test2' })).toBe(false); }); it('should reject password with email', () => { - expect(checker.hasPersonalInfo('teST', { email: 'test@foo.com' })).toBe(true); - expect(checker.hasPersonalInfo('TEST', { email: 'test1@foo.com' })).toBe(false); - expect(checker.hasPersonalInfo('FOO', { email: 'test@foo.com' })).toBe(false); - expect(checker.hasPersonalInfo('Foo', { email: 'fOO@foo.com' })).toBe(true); + expect(checker.hasUserInfo('teST', { email: 'test@foo.com' })).toBe(true); + expect(checker.hasUserInfo('TEST', { email: 'test1@foo.com' })).toBe(false); + expect(checker.hasUserInfo('FOO', { email: 'test@foo.com' })).toBe(false); + expect(checker.hasUserInfo('Foo', { email: 'fOO@foo.com' })).toBe(true); }); it('should reject password with phone number', () => { - expect(checker.hasPersonalInfo('teST1234567890.', { phoneNumber: '123456789' })).toBe(true); - expect(checker.hasPersonalInfo('TEST12345678', { phoneNumber: '123456789' })).toBe(false); + expect(checker.hasUserInfo('teST1234567890.', { phoneNumber: '123456789' })).toBe(true); + expect(checker.hasUserInfo('TEST12345678', { phoneNumber: '123456789' })).toBe(false); }); }); @@ -178,7 +178,7 @@ describe('PasswordPolicyChecker -> hasWords()', () => { rejects: { pwned: false, repetitionAndSequence: false, - personalInfo: false, + userInfo: false, words: ['test', 'teSt2', 'TesT3'], }, }); @@ -199,7 +199,7 @@ describe('PasswordPolicyChecker -> hasSequentialChars()', () => { const checker = new PasswordPolicyChecker({ length: { min: 1, max: 256 }, characterTypes: { min: 2 }, - rejects: { pwned: false, repetitionAndSequence: true, personalInfo: false, words: [] }, + rejects: { pwned: false, repetitionAndSequence: true, userInfo: false, words: [] }, }); it('should reject password with too many sequential characters', () => { diff --git a/packages/toolkit/core-kit/src/password-policy.ts b/packages/toolkit/core-kit/src/password-policy.ts index cb0a6dcc4..e8063155b 100644 --- a/packages/toolkit/core-kit/src/password-policy.ts +++ b/packages/toolkit/core-kit/src/password-policy.ts @@ -28,8 +28,8 @@ export type PasswordPolicy = { pwned: boolean; /** Whether to reject passwords that like '123456' or 'aaaaaa'. */ repetitionAndSequence: boolean; - /** Whether to reject passwords that include personal information. */ - personalInfo: boolean; + /** Whether to reject passwords that include current user information. */ + userInfo: boolean; /** Whether to reject passwords that include specific words. */ words: string[]; }; @@ -52,7 +52,7 @@ export const passwordPolicyGuard = z.object({ .object({ pwned: z.boolean().default(true), repetitionAndSequence: z.boolean().default(true), - personalInfo: z.boolean().default(true), + userInfo: z.boolean().default(true), words: z.string().array().default([]), }) .default({}), @@ -67,7 +67,7 @@ export type PasswordRejectionCode = | 'pwned' | 'restricted.repetition' | 'restricted.sequence' - | 'restricted.personal_info' + | 'restricted.user_info' | 'restricted.words'; /** A password issue that does not meet the policy. */ @@ -78,8 +78,8 @@ export type PasswordIssue; }; -/** Personal information to check. */ -export type PersonalInfo = Partial<{ +/** User information to check. */ +export type UserInfo = Partial<{ name: string; username: string; email: string; @@ -125,15 +125,15 @@ export class PasswordPolicyChecker { * Check if a password meets all the policy requirements. * * @param password - Password to check. - * @param personalInfo - Personal information to check. Required if the policy - * requires to reject passwords that include personal information. + * @param userInfo - User information to check. Required if the policy + * requires to reject passwords that include user information. * @returns An array of issues. If the password meets the policy, an empty array will be returned. - * @throws TypeError - If the policy requires to reject passwords that include personal information - * but the personal information is not provided. + * @throws TypeError - If the policy requires to reject passwords that include user information + * but the user information is not provided. */ /* eslint-disable @silverhand/fp/no-mutating-methods */ - async check(password: string, personalInfo?: PersonalInfo): Promise { + async check(password: string, userInfo?: UserInfo): Promise { const issues: PasswordIssue[] = this.fastCheck(password); if (this.policy.rejects.pwned && (await this.hasBeenPwned(password))) { @@ -165,14 +165,14 @@ export class PasswordPolicyChecker { }); } - if (this.policy.rejects.personalInfo) { - if (!personalInfo) { - throw new TypeError('Personal information is required to check personal information.'); + if (this.policy.rejects.userInfo) { + if (!userInfo) { + throw new TypeError('User information is required to check user information.'); } - if (this.hasPersonalInfo(password, personalInfo)) { + if (this.hasUserInfo(password, userInfo)) { issues.push({ - code: 'password_rejected.restricted.personal_info', + code: 'password_rejected.restricted.user_info', }); } } @@ -283,15 +283,15 @@ export class PasswordPolicyChecker { } /** - * Check if the given password contains personal information. + * Check if the given password contains user information. * * @param password - Password to check. - * @param personalInfo - Personal information to check. - * @returns Whether the password contains personal information. + * @param userInfo - User information to check. + * @returns Whether the password contains user information. */ - hasPersonalInfo(password: string, personalInfo: PersonalInfo): boolean { + hasUserInfo(password: string, userInfo: UserInfo): boolean { const lowercasedPassword = password.toLowerCase(); - const { name, username, email, phoneNumber } = personalInfo; + const { name, username, email, phoneNumber } = userInfo; if ( name diff --git a/packages/ui/src/Layout/SecondaryPageLayout/index.tsx b/packages/ui/src/Layout/SecondaryPageLayout/index.tsx index e009bb808..978a8ac25 100644 --- a/packages/ui/src/Layout/SecondaryPageLayout/index.tsx +++ b/packages/ui/src/Layout/SecondaryPageLayout/index.tsx @@ -1,4 +1,5 @@ import type { TFuncKey } from 'i18next'; +import { type ReactElement } from 'react'; import DynamicT from '@/components/DynamicT'; import NavBar from '@/components/NavBar'; @@ -11,7 +12,7 @@ import * as styles from './index.module.scss'; type Props = { title: TFuncKey; - description?: TFuncKey; + description?: TFuncKey | ReactElement; titleProps?: Record; descriptionProps?: Record; notification?: TFuncKey; @@ -42,7 +43,11 @@ const SecondaryPageLayout = ({ {description && (
- + {typeof description === 'string' ? ( + + ) : ( + description + )}
)} diff --git a/packages/ui/src/hooks/use-sie.ts b/packages/ui/src/hooks/use-sie.ts index f4b7c4ceb..8beb39adb 100644 --- a/packages/ui/src/hooks/use-sie.ts +++ b/packages/ui/src/hooks/use-sie.ts @@ -1,5 +1,6 @@ import { PasswordPolicyChecker, passwordPolicyGuard } from '@logto/core-kit'; import { SignInIdentifier } from '@logto/schemas'; +import { condArray } from '@silverhand/essentials'; import { useContext, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -39,9 +40,30 @@ export const usePasswordPolicy = () => { ); const policyChecker = useMemo(() => new PasswordPolicyChecker(policy), [policy]); + const requirementsDescription = useMemo( + () => + t('description.password_requirements', { + items: condArray( + // There's no need to show the length requirement if it can be satisfied by the character types + policy.length.min > policy.characterTypes.min && + t('description.password_requirement.length', { count: policy.length.min }), + // Show the character types requirement if: + // - It's greater than 1, or; + // - The length requirement is equal to or less than 1 (since the length requirement will be hidden in this case) + (policy.characterTypes.min > 1 || policy.length.min <= 1) && + t('description.password_requirement.character_types', { + count: policy.characterTypes.min, + }) + ), + }), + [t, policy.length.min, policy.characterTypes.min] + ); + return { policy, policyChecker, + /** The localized description of the password policy. */ + requirementsDescription, }; }; diff --git a/packages/ui/src/pages/Continue/SetPassword/index.tsx b/packages/ui/src/pages/Continue/SetPassword/index.tsx index a6131dd89..2020399be 100644 --- a/packages/ui/src/pages/Continue/SetPassword/index.tsx +++ b/packages/ui/src/pages/Continue/SetPassword/index.tsx @@ -47,12 +47,13 @@ const SetPassword = () => { length: { min }, characterTypes: { min: count }, }, + requirementsDescription, } = usePasswordPolicy(); return ( {requirementsDescription}} descriptionProps={{ min, count }} > { length: { min }, characterTypes: { min: count }, }, + requirementsDescription, } = usePasswordPolicy(); if (!signUpMethods.includes(SignInIdentifier.Username)) { @@ -58,7 +59,7 @@ const RegisterPassword = () => { return ( {requirementsDescription}} descriptionProps={{ min, count }} > { length: { min }, characterTypes: { min: count }, }, + requirementsDescription, } = usePasswordPolicy(); return ( {requirementsDescription}} descriptionProps={{ min, count }} >