0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-03-24 22:41:28 -05:00

fix(cli): translate command (#4459)

* fix(cli): translate command

* refactor(cli): add lint util method
This commit is contained in:
Charles Zhao 2023-09-13 16:12:43 +08:00 committed by GitHub
parent fcacbbbcc8
commit 98bf0da8ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
190 changed files with 2215 additions and 2707 deletions

View file

@ -1,8 +1,8 @@
import type { CommandModule } from 'yargs';
import { consoleLog } from '../../utils.js';
import { consoleLog, inquireInstancePath } from '../../utils.js';
import { addConnectors, addOfficialConnectors, inquireInstancePath } from './utils.js';
import { addConnectors, addOfficialConnectors } from './utils.js';
const add: CommandModule<
{ path?: string },

View file

@ -3,9 +3,9 @@ import path from 'node:path';
import type { CommandModule } from 'yargs';
import { consoleLog } from '../../utils.js';
import { consoleLog, inquireInstancePath } from '../../utils.js';
import { getConnectorDirectory, getLocalConnectorPackages, inquireInstancePath } from './utils.js';
import { getConnectorDirectory, getLocalConnectorPackages } from './utils.js';
const link: CommandModule<{ path?: string }, { path?: string; cloud: boolean; mock: boolean }> = {
command: ['link', 'ln'],

View file

@ -4,20 +4,22 @@ import fs from 'node:fs/promises';
import path from 'node:path';
import { promisify } from 'node:util';
import { assert, conditionalArray, conditionalString, trySafe } from '@silverhand/essentials';
import { conditionalArray, conditionalString, trySafe } from '@silverhand/essentials';
import chalk from 'chalk';
import { got } from 'got';
import inquirer from 'inquirer';
import pLimit from 'p-limit';
import pRetry from 'p-retry';
import tar from 'tar';
import { z } from 'zod';
import { connectorDirectory } from '../../constants.js';
import { consoleLog, getConnectorPackagesFromDirectory, isTty, oraPromise } from '../../utils.js';
import { defaultPath } from '../install/utils.js';
import { connectorDirectory, coreDirectory } from '../../constants.js';
import {
consoleLog,
getConnectorPackagesFromDirectory,
inquireInstancePath,
oraPromise,
} from '../../utils.js';
const coreDirectory = 'packages/core';
const execPromise = promisify(exec);
export const npmPackResultGuard = z
.object({
@ -27,67 +29,6 @@ export const npmPackResultGuard = z
})
.array();
const buildPathErrorMessage = (value: string) =>
`The path ${chalk.green(value)} does not contain a Logto instance, please try another.`;
const validatePath = async (value: string) => {
const corePackageJsonPath = path.resolve(path.join(value, coreDirectory, 'package.json'));
if (!existsSync(corePackageJsonPath)) {
return buildPathErrorMessage(value);
}
const packageJson = await fs.readFile(corePackageJsonPath, { encoding: 'utf8' });
const packageName = await z
.object({ name: z.string() })
.parseAsync(JSON.parse(packageJson))
.then(({ name }) => name)
.catch(() => '');
if (packageName !== '@logto/core') {
return buildPathErrorMessage(value);
}
return true;
};
export const inquireInstancePath = async (initialPath?: string) => {
const inquire = async () => {
if (!initialPath && (await validatePath('.')) === true) {
return path.resolve('.');
}
if (!isTty()) {
assert(initialPath, new Error('Path is missing'));
return initialPath;
}
const { instancePath } = await inquirer.prompt<{ instancePath: string }>(
{
name: 'instancePath',
message: 'Where is your Logto instance?',
type: 'input',
default: defaultPath,
filter: (value: string) => value.trim(),
validate: validatePath,
},
{ instancePath: initialPath }
);
return instancePath;
};
const instancePath = await inquire();
const validated = await validatePath(instancePath);
if (validated !== true) {
consoleLog.fatal(validated);
}
return instancePath;
};
const packagePrefix = 'connector-';
export const normalizePackageName = (name: string) =>

View file

@ -6,7 +6,7 @@ import { consoleLog } from '../../utils.js';
import {
validateNodeVersion,
inquireInstancePath,
inquireInstallPath,
validateDatabase,
downloadRelease,
seedDatabase,
@ -26,8 +26,8 @@ export type InstallArgs = {
const installLogto = async ({ path, skipSeed, downloadUrl, cloud }: InstallArgs) => {
validateNodeVersion();
// Get instance path
const instancePath = await inquireInstancePath(path);
// Get install location path
const installPath = await inquireInstallPath(path);
// Validate if user has a valid database
await validateDatabase();
@ -35,7 +35,7 @@ const installLogto = async ({ path, skipSeed, downloadUrl, cloud }: InstallArgs)
// Download and decompress
const tarPath =
!downloadUrl || isUrl(downloadUrl) ? await downloadRelease(downloadUrl) : downloadUrl;
await decompress(instancePath, tarPath);
await decompress(installPath, tarPath);
// Seed database
if (skipSeed) {
@ -45,14 +45,14 @@ const installLogto = async ({ path, skipSeed, downloadUrl, cloud }: InstallArgs)
)} command to seed database when ready.\n`
);
} else {
await seedDatabase(instancePath, cloud);
await seedDatabase(installPath, cloud);
}
// Save to dot env
await createEnv(instancePath, await getDatabaseUrlFromConfig());
await createEnv(installPath, await getDatabaseUrlFromConfig());
// Finale
logFinale(instancePath);
logFinale(installPath);
};
const install: CommandModule<

View file

@ -11,6 +11,7 @@ import inquirer from 'inquirer';
import * as semver from 'semver';
import tar from 'tar';
import { defaultPath } from '../../constants.js';
import { createPoolAndDatabaseIfNeeded } from '../../database.js';
import { packageJson } from '../../package-json.js';
import {
@ -24,7 +25,6 @@ import {
} from '../../utils.js';
import { seedByPool } from '../database/seed/index.js';
export const defaultPath = path.join(os.homedir(), 'logto');
const pgRequired = new semver.SemVer('14.0.0');
export const validateNodeVersion = () => {
@ -50,7 +50,7 @@ const validatePath = (value: string) =>
? `The path ${chalk.green(value)} already exists, please try another.`
: true;
export const inquireInstancePath = async (initialPath?: string) => {
export const inquireInstallPath = async (initialPath?: string) => {
if (!isTty()) {
assert(initialPath, new Error('Path is missing'));
@ -178,14 +178,14 @@ export const seedDatabase = async (instancePath: string, cloud: boolean) => {
}
};
export const createEnv = async (instancePath: string, databaseUrl: string) => {
const dotEnvPath = path.resolve(instancePath, '.env');
export const createEnv = async (installPath: string, databaseUrl: string) => {
const dotEnvPath = path.resolve(installPath, '.env');
await fs.writeFile(dotEnvPath, `DB_URL=${databaseUrl}`, 'utf8');
consoleLog.info(`Saved database URL to ${chalk.blue(dotEnvPath)}`);
};
export const logFinale = (instancePath: string) => {
const startCommand = `cd ${instancePath} && npm start`;
export const logFinale = (installPath: string) => {
const startCommand = `cd ${installPath} && npm start`;
consoleLog.info(
`Use the command below to start Logto. Happy hacking!\n\n ${chalk.green(startCommand)}`
);

View file

@ -3,8 +3,7 @@ import { isBuiltInLanguageTag as isPhrasesBuiltInLanguageTag } from '@logto/phra
import { isBuiltInLanguageTag as isPhrasesUiBuiltInLanguageTag } from '@logto/phrases-ui';
import type { CommandModule } from 'yargs';
import { consoleLog } from '../../utils.js';
import { inquireInstancePath } from '../connector/utils.js';
import { consoleLog, inquireInstancePath } from '../../utils.js';
import { createFullTranslation } from './utils.js';

View file

@ -7,9 +7,11 @@ type GetTranslationPromptProperties = {
extraPrompt?: string;
};
export const untranslatedMark = '/** UNTRANSLATED */';
/**
* Note:
* The input token limit of GPT 3.5 is 2048, the following prompt tokens with sourceFileContent is about 1200.
* The input token limit of GPT 3.5 is 2048, the following prompt tokens with sourceFileContent is about 1600.
* Remember to check the token limit before adding more prompt.
* Tokens can be counted in https://platform.openai.com/tokenizer
*/
@ -20,30 +22,32 @@ export const getTranslationPromptMessages = ({
}: GetTranslationPromptProperties) => [
{
role: 'assistant',
content: `You are a translate assistant of a Typescript engineer, when you receive a code snippet that contains an object, translate and ONLY translate those values that are marked with comment "// UNTRANSLATED" into the language ${
content: `You are a assistant translator and will receive a TypeScript object. Traverse and find object values with "${untranslatedMark}" annotation on the top, then translate these values to target locale "${
languages[targetLanguage]
}, remove the "// UNTRANSLATED" mark, keep all object keys original, output ts code only, the code format should be strictly consistent, and should not contain the given code snippet. ${conditionalString(
}". Remove the "${untranslatedMark}" annotations from output. Escape the single quotes (if any) in translated results by prepending a backslash. Keep the interpolation double curly brackets and their inner values intact. Make sure there is a space between the CJK and non-CJK characters. Prefer using "" instead of "" in Chinese. Do not include sample code snippet below in the final output. ${conditionalString(
extraPrompt
)}
Take Chinese as an example, if the input is:
Take translating to zh-CN as an example, if the input is:
\`\`\`ts
import others from './others.js';
const translation = {
hello: '你好',
world: 'world', // UNTRANSLATED
hello: 'Hello',
${untranslatedMark}
world: 'world',
others,
};
export default translation;
\`\`\`
the output should be:
Then the output should be:
\`\`\`ts
import others from './others.js';
const translation = {
hello: '你好',
hello: 'Hello',
world: '世界',
others,
};

View file

@ -1,18 +1,13 @@
import { execFile } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { promisify } from 'node:util';
import { isLanguageTag } from '@logto/language-kit';
import ora from 'ora';
import { type CommandModule } from 'yargs';
import { consoleLog } from '../../../utils.js';
import { inquireInstancePath } from '../../connector/utils.js';
import { consoleLog, inquireInstancePath, lintLocaleFiles } from '../../../utils.js';
import { praseLocaleFiles, syncPhraseKeysAndFileStructure } from './utils.js';
const execPromise = promisify(execFile);
import { parseLocaleFiles, syncPhraseKeysAndFileStructure } from './utils.js';
const syncKeys: CommandModule<
{ path?: string },
@ -77,7 +72,7 @@ const syncKeys: CommandModule<
const phrasesPath = path.join(instancePath, 'packages', packageName);
const localesPath = path.join(phrasesPath, 'src/locales');
const entrypoint = path.join(localesPath, baselineTag.toLowerCase(), 'index.ts');
const baseline = praseLocaleFiles(entrypoint);
const baseline = parseLocaleFiles(entrypoint);
const targetLocales =
targetTag === 'all' ? fs.readdirSync(localesPath) : [targetTag.toLowerCase()];
@ -99,15 +94,7 @@ const syncKeys: CommandModule<
/* eslint-enable no-await-in-loop */
if (!skipLint) {
const spinner = ora({
text: 'Running `eslint --fix` for locales',
}).start();
await execPromise(
'pnpm',
['eslint', '--ext', '.ts', path.relative(phrasesPath, localesPath), '--fix'],
{ cwd: phrasesPath }
);
spinner.succeed('Ran `eslint --fix` for locales');
void lintLocaleFiles(instancePath, packageName);
}
},
};

View file

@ -63,7 +63,7 @@ type ParsedTuple = readonly [NestedPhraseObject, FileStructure];
* @returns A tuple of the nested object of phrases and the file structure
*
*/
export const praseLocaleFiles = (filePath: string): ParsedTuple => {
export const parseLocaleFiles = (filePath: string): ParsedTuple => {
const content = readFileSync(filePath, 'utf8');
const ast = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
const importIdentifierPath = new Map<string, string>();
@ -97,7 +97,7 @@ export const praseLocaleFiles = (filePath: string): ParsedTuple => {
const resolvedPath = path.resolve(path.dirname(filePath), importPath);
// Recursively parse the nested object from the imported file
const [phrases, structure] = praseLocaleFiles(resolvedPath);
const [phrases, structure] = parseLocaleFiles(resolvedPath);
/* eslint-disable @silverhand/fp/no-mutation */
nestedObject[key] = phrases;
@ -329,7 +329,7 @@ export const syncPhraseKeysAndFileStructure = async (
) => {
const targetEntrypoint = path.join(targetDirectory, 'index.ts');
const isTargetLocaleExist = existsSync(targetEntrypoint);
const targetObject = isTargetLocaleExist ? praseLocaleFiles(targetEntrypoint)[0] : {};
const targetObject = isTargetLocaleExist ? parseLocaleFiles(targetEntrypoint)[0] : {};
const backupDirectory = targetDirectory + '.bak';
if (isTargetLocaleExist) {

View file

@ -4,7 +4,7 @@ import { isBuiltInLanguageTag as isPhrasesUiBuiltInLanguageTag } from '@logto/ph
import PQueue from 'p-queue';
import type { CommandModule } from 'yargs';
import { inquireInstancePath } from '../connector/utils.js';
import { inquireInstancePath, lintLocaleFiles } from '../../utils.js';
import { type TranslationOptions, baseLanguage, syncTranslation } from './utils.js';
@ -27,8 +27,9 @@ const sync: CommandModule<{ path?: string }, { path?: string }> = {
queue,
} satisfies Partial<TranslationOptions>;
/* eslint-disable no-await-in-loop */
if (isPhrasesBuiltInLanguageTag(languageTag)) {
void syncTranslation({
await syncTranslation({
...baseOptions,
packageName: 'phrases',
languageTag,
@ -36,15 +37,18 @@ const sync: CommandModule<{ path?: string }, { path?: string }> = {
}
if (isPhrasesUiBuiltInLanguageTag(languageTag)) {
void syncTranslation({
await syncTranslation({
...baseOptions,
packageName: 'phrases-ui',
languageTag,
});
}
/* eslint-enable no-await-in-loop */
}
await queue.onIdle();
void lintLocaleFiles(instancePath);
},
};

View file

@ -10,11 +10,10 @@ import PQueue from 'p-queue';
import { consoleLog } from '../../utils.js';
import { createOpenaiApi, translate } from './openai.js';
import { untranslatedMark } from './prompts.js';
export const baseLanguage = 'en' satisfies LanguageTag;
const untranslatedMark = '// UNTRANSLATED';
export const readLocaleFiles = async (directory: string): Promise<string[]> => {
const entities = await fs.readdir(directory, { withFileTypes: true });
@ -148,7 +147,6 @@ export const syncTranslation = async ({
api: openai,
sourceFilePath: targetLocaleFile,
targetLanguage: languageTag,
extraPrompt: `Object values without an "${untranslatedMark}" mark should be skipped and keep its original value. Remember to remove the "${untranslatedMark}" mark with the spaces before and after it in the output content.`,
});
if (!result) {

View file

@ -1 +1,6 @@
import os from 'node:os';
import path from 'node:path';
export const defaultPath = path.join(os.homedir(), 'logto');
export const coreDirectory = 'packages/core';
export const connectorDirectory = 'connectors';

View file

@ -1,12 +1,13 @@
import { execSync } from 'node:child_process';
import { execSync, execFile } from 'node:child_process';
import { createWriteStream, existsSync } from 'node:fs';
import { readdir, readFile } from 'node:fs/promises';
import { createRequire } from 'node:module';
import path from 'node:path';
import { promisify } from 'node:util';
import { ConsoleLog } from '@logto/shared';
import type { Optional } from '@silverhand/essentials';
import { conditionalString } from '@silverhand/essentials';
import { assert, conditionalString } from '@silverhand/essentials';
import chalk from 'chalk';
import type { Progress } from 'got';
import { got } from 'got';
@ -16,6 +17,8 @@ import type { Options } from 'ora';
import ora from 'ora';
import { z } from 'zod';
import { coreDirectory, defaultPath } from './constants.js';
export const safeExecSync = (command: string) => {
try {
return execSync(command, { encoding: 'utf8', stdio: 'pipe' });
@ -170,6 +173,67 @@ export function findLastIndex<T>(
return -1;
}
const buildPathErrorMessage = (value: string) =>
`The path ${chalk.green(value)} does not contain a Logto instance. Please try another.`;
const validatePath = async (value: string) => {
const corePackageJsonPath = path.resolve(path.join(value, coreDirectory, 'package.json'));
if (!existsSync(corePackageJsonPath)) {
return buildPathErrorMessage(value);
}
const packageJson = await readFile(corePackageJsonPath, { encoding: 'utf8' });
const packageName = await z
.object({ name: z.string() })
.parseAsync(JSON.parse(packageJson))
.then(({ name }) => name)
.catch(() => '');
if (packageName !== '@logto/core') {
return buildPathErrorMessage(value);
}
return true;
};
export const inquireInstancePath = async (initialPath?: string) => {
const inquire = async () => {
if (!initialPath && (await validatePath('.')) === true) {
return path.resolve('.');
}
if (!isTty()) {
assert(initialPath, new Error('Path is missing'));
return initialPath;
}
const { instancePath } = await inquirer.prompt<{ instancePath: string }>(
{
name: 'instancePath',
message: 'Where is your Logto instance?',
type: 'input',
default: defaultPath,
filter: (value: string) => value.trim(),
validate: validatePath,
},
{ instancePath: initialPath }
);
return instancePath;
};
const instancePath = await inquire();
const validated = await validatePath(instancePath);
if (validated !== true) {
consoleLog.fatal(validated);
}
return instancePath;
};
const getConnectorPackageName = async (directory: string) => {
const filePath = path.join(directory, 'package.json');
@ -204,3 +268,32 @@ export const getConnectorPackagesFromDirectory = async (directory: string) => {
(packageInfo): packageInfo is ConnectorPackage => typeof packageInfo.name === 'string'
);
};
const execPromise = promisify(execFile);
export const lintLocaleFiles = async (
/** Logto instance path */
instancePath: string,
/** Target package name, ignore to lint both packages */
packageName?: 'phrases' | 'phrases-ui'
) => {
const spinner = ora({
text: 'Running `eslint --fix` for locales',
}).start();
const targetPackages = packageName ? [packageName] : ['phrases', 'phrases-ui'];
await Promise.all(
targetPackages.map(async (packageName) => {
const phrasesPath = path.join(instancePath, 'packages', packageName);
const localesPath = path.join(phrasesPath, 'src/locales');
await execPromise(
'pnpm',
['eslint', '--ext', '.ts', path.relative(phrasesPath, localesPath), '--fix'],
{ cwd: phrasesPath }
);
})
);
spinner.succeed('Ran `eslint --fix` for locales');
};

View file

@ -19,8 +19,8 @@ export const defaultMetadata: ConnectorMetadata = {
description: {
en: 'Microsoft Azure Active Directory is a leading AD provider.',
'zh-CN': 'Microsoft Azure Active Directory 是领先的 AD 服务提供商。',
'tr-TR': 'Microsoft Azure Active Directory en büyük AD servisidir.', // UNTRANSLATED
ko: 'Microsoft Azure Active Directory is the biggest AD provider.', // UNTRANSLATED
'tr-TR': 'Microsoft Azure Active Directory en büyük AD servisidir.',
ko: 'Microsoft Azure Active Directory is the biggest AD provider.',
},
readme: './README.md',
formItems: [

View file

@ -30,8 +30,8 @@ export const defaultMetadata: ConnectorMetadata = {
description: {
en: 'Facebook is a worldwide social media platform with billions of users.',
'zh-CN': 'Facebook 是有数十亿用户的社交平台。',
'tr-TR': 'Facebook, en aktif kullanıcılara sahip dünya çapında bir sosyal medya platformudur.', // UNTRANSLATED
ko: '페이스북은 가장 활동적인 사용자를 가진 세계적인 소셜 미디어 플랫폼입니다.', // UNTRANSLATED
'tr-TR': 'Facebook, en aktif kullanıcılara sahip dünya çapında bir sosyal medya platformudur.',
ko: '페이스북은 가장 활동적인 사용자를 가진 세계적인 소셜 미디어 플랫폼입니다.',
},
readme: './README.md',
formItems: [

View file

@ -21,8 +21,8 @@ export const defaultMetadata: ConnectorMetadata = {
description: {
en: 'Google is a principal search engine technology and email service provider.',
'zh-CN': 'Google 是全球性的搜索引擎和邮件服务提供商。',
'tr-TR': 'Google, en büyük arama motoru teknolojisi ve e-posta servis sağlayıcısıdır.', // UNTRANSLATED
ko: 'Google은 가장 큰 검색 엔진 기술과 이메일 서비스 제공자입니다.', // UNTRANSLATED
'tr-TR': 'Google, en büyük arama motoru teknolojisi ve e-posta servis sağlayıcısıdır.',
ko: 'Google은 가장 큰 검색 엔진 기술과 이메일 서비스 제공자입니다.',
},
readme: './README.md',
formItems: [

View file

@ -20,8 +20,8 @@ export const defaultMetadata: ConnectorMetadata = {
description: {
en: 'Kakao is a famous social network service provider in South Korea',
'zh-CN': 'Kakao 是韩国著名的社交网络服务提供商。',
'tr-TR': 'Kakao is a famous social network service provider in South Korea', // UNTRANSLATED
ko: '카카오는 한국에서 가장 유명한 SNS 서비스 제공자 입니다.', // UNTRANSLATED
'tr-TR': 'Kakao is a famous social network service provider in South Korea',
ko: '카카오는 한국에서 가장 유명한 SNS 서비스 제공자 입니다.',
},
readme: './README.md',
formItems: [

View file

@ -62,18 +62,13 @@ const description = {
no_region_code_found: 'Kein Regionencode gefunden',
verify_email: 'Bestätige deine E-Mail-Adresse',
verify_phone: 'Bestätige deine Telefonnummer',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Passwort {{items, list}}.',
'password_requirement.length_one': 'erfordert mindestens {{count}} Zeichen',
'password_requirement.length_other': 'erfordert mindestens {{count}} Zeichen',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'sollte mindestens {{count}} Kategorie der folgenden Zeichenarten enthalten: Großbuchstaben, Kleinbuchstaben, Zahlen und Symbole',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'sollte mindestens {{count}} Kategorien der folgenden Zeichenarten enthalten: Großbuchstaben, Kleinbuchstaben, Zahlen und Symbole',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'Die minimale Länge beträgt {{min}}.',
too_long: 'Die maximale Länge beträgt {{max}}.',
character_types: 'Mindestens {{min}} Arten von Zeichen sind erforderlich.',
unsupported_characters: 'Nicht unterstütztes Zeichen gefunden.',
pwned: 'Verwenden Sie keine einfachen Passwörter, die leicht zu erraten sind.',
restricted_found: 'Vermeiden Sie übermäßigen Gebrauch von {{list, list}}.',
'restricted.repetition': 'wiederholte Zeichen',
'restricted.sequence': 'sequenzielle Zeichen',
'restricted.user_info': 'Ihre persönlichen Informationen',
'restricted.words': 'Produktkontext',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'oder',
and: 'und',
separator: ',',
};

View file

@ -60,18 +60,13 @@ const description = {
no_region_code_found: 'No se encontró código de región',
verify_email: 'Verificar su correo electrónico',
verify_phone: 'Verificar su número de teléfono',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Contraseña {{items, lista}}.',
'password_requirement.length_one': 'requiere un mínimo de {{count}} carácter',
'password_requirement.length_other': 'requiere un mínimo de {{count}} caracteres',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'debe contener al menos {{count}} tipo de letras mayúsculas, letras minúsculas, dígitos y símbolos',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'debe contener al menos {{count}} tipos de letras mayúsculas, letras minúsculas, dígitos y símbolos',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'La longitud mínima es {{min}}.',
too_long: 'La longitud máxima es {{max}}.',
character_types: 'Se necesitan al menos {{min}} tipos de caracteres.',
unsupported_characters: 'Se encontró un carácter no admitido.',
pwned: 'Evite usar contraseñas simples que sean fáciles de adivinar.',
restricted_found: 'Evite utilizar en exceso {{list, list}}.',
'restricted.repetition': 'caracteres repetidos',
'restricted.sequence': 'caracteres secuenciales',
'restricted.user_info': 'su información personal',
'restricted.words': 'contexto del producto',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'o',
and: 'y',
separator: ',',
};

View file

@ -62,18 +62,13 @@ const description = {
no_region_code_found: 'Aucun code de région trouvé',
verify_email: 'Vérifiez votre e-mail',
verify_phone: 'Vérifiez votre numéro de téléphone',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Mot de passe {{items, list}}.',
'password_requirement.length_one': 'doit contenir au minimum {{count}} caractère',
'password_requirement.length_other': 'doit contenir au minimum {{count}} caractères',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'doit contenir au moins {{count}} type de lettres majuscules, lettres minuscules, chiffres et symboles',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'doit contenir au moins {{count}} types de lettres majuscules, lettres minuscules, chiffres et symboles',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'La longueur minimale est {{min}}.',
too_long: 'La longueur maximale est {{max}}.',
character_types: 'Au moins {{min}} types de caractères sont requis.',
unsupported_characters: 'Caractère non supporté trouvé.',
pwned: "Évitez d'utiliser des mots de passe simples faciles à deviner.",
restricted_found: "Évitez d'utiliser de manière excessive {{list, list}}.",
'restricted.repetition': 'caractères répétés',
'restricted.sequence': 'caractères séquentiels',
'restricted.user_info': 'vos informations personnelles',
'restricted.words': 'contexte produit',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'ou',
and: 'et',
separator: ',',
};

View file

@ -58,18 +58,13 @@ const description = {
no_region_code_found: 'Nessun codice di regione trovato',
verify_email: 'Verifica la tua email',
verify_phone: 'Verifica il tuo numero di telefono',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
'password_requirement.length_one': 'richiede almeno {{count}} carattere',
'password_requirement.length_other': 'richiede almeno {{count}} caratteri',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'dovrebbe contenere almeno {{count}} tipo di lettere maiuscole, lettere minuscole, numeri e simboli',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'dovrebbe contenere almeno {{count}} tipi di lettere maiuscole, lettere minuscole, numeri e simboli',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'La lunghezza minima è {{min}}.',
too_long: 'La lunghezza massima è {{max}}.',
character_types: 'Sono richiesti almeno {{min}} tipi di caratteri.',
unsupported_characters: 'Carattere non supportato trovato.',
pwned: 'Evita di utilizzare password semplici facili da indovinare.',
restricted_found: 'Evita di utilizzare in eccesso {{list, list}}.',
'restricted.repetition': 'caratteri ripetuti',
'restricted.sequence': 'caratteri sequenziali',
'restricted.user_info': 'le tue informazioni personali',
'restricted.words': 'contesto del prodotto',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'o',
and: 'e',
separator: ',',
};

View file

@ -60,18 +60,13 @@ const description = {
no_region_code_found: '地域コードが見つかりません',
verify_email: 'Eメールを確認する',
verify_phone: '電話番号を確認する',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'パスワード {{items, list}}。',
'password_requirement.length_one': '最低{{count}}文字',
'password_requirement.length_other': '最低{{count}}文字',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'大文字、小文字、数字、記号のうち{{count}}種類を含む必要があります',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'大文字、小文字、数字、記号のうち{{count}}種類を含む必要があります',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: '最小の長さは{{min}}です。',
too_long: '最大の長さは{{max}}です。',
character_types: '少なくとも{{min}}種類の文字が必要です。',
unsupported_characters: 'サポートされていない文字が見つかりました。',
pwned: '簡単に推測できる簡単なパスワードの使用を避けてください。',
restricted_found: '{{list, list}}の過度な使用を避けてください。',
'restricted.repetition': '繰り返された文字',
'restricted.sequence': '連続する文字',
'restricted.user_info': '個人情報',
'restricted.words': '製品のコンテキスト',
};
export default Object.freeze(password_rejected);

View file

@ -1,10 +1,9 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'または',
and: 'そして',
separator: ',',
};
export default Object.freeze(list);
Object.freeze(list);
export default list;

View file

@ -55,18 +55,13 @@ const description = {
no_region_code_found: '지역 코드를 찾을 수 없습니다.',
verify_email: '이메일 인증',
verify_phone: '휴대전화번호 인증',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: '비밀번호는 {{items, list}}로 이루어져야 합니다.',
'password_requirement.length_one': '최소 {{count}}자 이상이어야 함',
'password_requirement.length_other': '최소 {{count}} 문자 이상이어야 함',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'최소 {{count}}개의 대문자, 소문자, 숫자, 특수 기호를 포함해야 함',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'최소 {{count}}개의 대문자, 소문자, 숫자, 특수 기호를 포함해야 함',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: '최소 길이는 {{min}}입니다.',
too_long: '최대 길이는 {{max}}입니다.',
character_types: '최소 {{min}}개의 문자 유형이 필요합니다.',
unsupported_characters: '지원되지 않는 문자가 발견되었습니다.',
pwned: '추측하기 쉬운 간단한 암호 사용을 피하십시오.',
restricted_found: '{{list, list}}을(를) 과도하게 사용하지 마십시오.',
'restricted.repetition': '반복된 문자',
'restricted.sequence': '연속된 문자',
'restricted.user_info': '개인 정보',
'restricted.words': '품질 가능성',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: '또는',
and: '및',
separator: ',',
};

View file

@ -58,18 +58,13 @@ const description = {
no_region_code_found: 'Nie znaleziono kodu regionu',
verify_email: 'Potwierdź swój email',
verify_phone: 'Potwierdź swój numer telefonu',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Wymagania dotyczące hasła {{items, list}}.',
'password_requirement.length_one': 'wymaga co najmniej {{count}} znaku',
'password_requirement.length_other': 'wymaga co najmniej {{count}} znaków',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'powinno zawierać co najmniej {{count}} rodzaj liter wielkich, małych liter, cyfr i symboli',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'powinno zawierać co najmniej {{count}} rodzaje liter wielkich, małych liter, cyfr i symboli',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'Minimalna długość to {{min}}.',
too_long: 'Maksymalna długość to {{max}}.',
character_types: 'Wymagane są przynajmniej {{min}} rodzaje znaków.',
unsupported_characters: 'Znaleziono niedozwolony znak.',
pwned: 'Unikaj używania prostych haseł, które są łatwe do odgadnięcia.',
restricted_found: 'Unikaj nadużywania {{list, list}}.',
'restricted.repetition': 'powtarzających się znaków',
'restricted.sequence': 'sekwencyjnych znaków',
'restricted.user_info': 'twoich informacji osobistych',
'restricted.words': 'kontekstu produktu',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'lub',
and: 'i',
separator: ',',
};

View file

@ -57,18 +57,13 @@ const description = {
no_region_code_found: 'Não foi possível encontrar o código de região do seu telefone.',
verify_email: 'Verificar e-mail',
verify_phone: 'Verificar número de telefone',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Senha {{items, list}}.',
'password_requirement.length_one': 'requer no mínimo 1 caractere.',
'password_requirement.length_other': 'requer no mínimo {{count}} caracteres.',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'deve conter pelo menos 1 tipo de letra maiúscula, letra minúscula, dígito e símbolo.',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'deve conter pelo menos {{count}} tipos de letra maiúscula, letra minúscula, dígito e símbolo.',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'O comprimento mínimo é {{min}}.',
too_long: 'O comprimento máximo é {{max}}.',
character_types: 'Pelo menos {{min}} tipos de caracteres são necessários.',
unsupported_characters: 'Caractere não suportado encontrado.',
pwned: 'Evite o uso de senhas simples que são fáceis de adivinhar.',
restricted_found: 'Evite usar em excesso {{list, list}}.',
'restricted.repetition': 'caracteres repetidos',
'restricted.sequence': 'caracteres sequenciais',
'restricted.user_info': 'suas informações pessoais',
'restricted.words': 'contexto do produto',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'ou',
and: 'e',
separator: ',',
};

View file

@ -57,18 +57,13 @@ const description = {
no_region_code_found: 'Não foi possível encontrar o código de região do seu telefone.',
verify_email: 'Verifique o seu email',
verify_phone: 'Verifique o seu número de telefone',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Requisitos de senha {{items, list}}.',
'password_requirement.length_one': 'requer um mínimo de {{count}} caracter',
'password_requirement.length_other': 'requer um mínimo de {{count}} caracteres',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'deve conter pelo menos {{count}} tipo de letras maiúsculas, letras minúsculas, dígitos e símbolos',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'deve conter pelo menos {{count}} tipos de letras maiúsculas, letras minúsculas, dígitos e símbolos',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'Mínimo de comprimento é {{min}}.',
too_long: 'Máximo de comprimento é {{max}}.',
character_types: 'São necessários pelo menos {{min}} tipos de caracteres.',
unsupported_characters: 'Caractere não suportado encontrado.',
pwned: 'Evite o uso de senhas simples que são fáceis de adivinhar.',
restricted_found: 'Evite o uso excessivo de {{list, list}}.',
'restricted.repetition': 'caracteres repetidos',
'restricted.sequence': 'caracteres sequenciais',
'restricted.user_info': 'suas informações pessoais',
'restricted.words': 'contexto do produto',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'ou',
and: 'e',
separator: ',',
};

View file

@ -61,18 +61,13 @@ const description = {
no_region_code_found: 'Не удалось определить код региона',
verify_email: 'Подтвердите Ваш электронный адрес',
verify_phone: 'Подтвердите свой номер телефона',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Требования к паролю {{items, list}}.',
'password_requirement.length_one': 'требуется минимум {{count}} символ',
'password_requirement.length_other': 'требуется минимум {{count}} символов',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'должен содержать по крайней мере {{count}} тип прописных букв, строчных букв, цифр и символов',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'должен содержать по крайней мере {{count}} типа прописных букв, строчных букв, цифр и символов',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: 'Минимальная длина {{min}} символов.',
too_long: 'Максимальная длина {{max}} символов.',
character_types: 'Требуется как минимум {{min}} типов символов.',
unsupported_characters: 'Найден неподдерживаемый символ.',
pwned: 'Избегайте использования простых паролей, которые легко угадать.',
restricted_found: 'Избегайте чрезмерного использования {{list,list}}.',
'restricted.repetition': 'повторяющиеся символы',
'restricted.sequence': 'последовательные символы',
'restricted.user_info': 'ваши личные данные',
'restricted.words': 'контекст продукта',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'или',
and: 'и',
separator: ',',
};

View file

@ -58,18 +58,13 @@ const description = {
no_region_code_found: 'Bölge kodu bulunamadı',
verify_email: 'E-postanızın doğrulanması',
verify_phone: 'Telefon numaranızın doğrulanması',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: 'Şifre {{items, list}}.',
'password_requirement.length_one': 'en az {{count}} karakter gerektirir',
'password_requirement.length_other': 'en az {{count}} karakter gerektirir',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'en az {{count}} tane büyük harf, küçük harf, rakam ve sembol içermelidir',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'en az {{count}} tane büyük harf, küçük harf, rakam ve sembol içermelidir',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
character_types: 'En az {{min}} türde karakter gereklidir.',
unsupported_characters: 'Desteklenmeyen karakter bulundu.',
pwned: 'Kolayca tahmin edilebilen basit şifreleri kullanmaktan kaçının.',
restricted_found: '{{list, list}} fazla kullanımdan kaçının.',
'restricted.repetition': 'tekrarlanan karakterler',
'restricted.sequence': 'dizisel karakterler',
'restricted.user_info': 'kişisel bilgileriniz',
'restricted.words': 'ürünle ilgili terimler',
};
export default Object.freeze(password_rejected);

View file

@ -1,9 +1,6 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
or: 'veya',
and: 've',
separator: ',',
};

View file

@ -51,18 +51,12 @@ const description = {
no_region_code_found: '没有找到区域码',
verify_email: '验证你的邮箱',
verify_phone: '验证你的手机号',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'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_requirements: '密码 {{items, list}}。',
'password_requirement.length_one': '应至少有{{count}}个字符',
'password_requirement.length_other': '应至少有{{count}}个字符',
'password_requirement.character_types_one': '应包含至少{{count}}种大写字母、小写字母、数字和符号',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'应包含至少{{count}}种大写字母、小写字母、数字和符号',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: '最短长度为{{min}}。',
too_long: '最长长度为{{max}}。',
character_types: '需要至少{{min}}种字符类型。',
unsupported_characters: '发现不支持的字符。',
pwned: '避免使用容易被猜到的简单密码。',
restricted_found: '避免过度使用{{list, list}}。',
'restricted.repetition': '重复字符',
'restricted.sequence': '连续字符',
'restricted.user_info': '您的个人信息',
'restricted.words': '产品上下文',
};
export default Object.freeze(password_rejected);

View file

@ -1,10 +1,7 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
separator: ',',
or: '或者',
and: '和',
separator: '',
};
export default Object.freeze(list);

View file

@ -51,18 +51,13 @@ const description = {
no_region_code_found: '沒有找到區域碼',
verify_email: '驗證你的郵箱',
verify_phone: '驗證你的手機號',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'password_requirement.length_one': 'requires a minimum of {{count}} character',
/** UNTRANSLATED */
'password_requirement.length_other': 'requires a minimum of {{count}} characters',
/** UNTRANSLATED */
password_requirements: '要求密碼 {{items, list}}。',
'password_requirement.length_one': '要求至少{{count}}個字符',
'password_requirement.length_other': '要求至少{{count}}個字符',
'password_requirement.character_types_one':
'should contain at least {{count}} type of uppercase letters, lowercase letters, digits, and symbols',
/** UNTRANSLATED */
'要求包含至少{{count}}類型的大寫字母,小寫字母,數字和符號',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'要求包含至少{{count}}類型的大寫字母,小寫字母,數字和符號',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: '最少長度為{{min}}。',
too_long: '最大長度為{{max}}。',
character_types: '至少需要{{min}}種類的字符。',
unsupported_characters: '發現不支援的字符。',
pwned: '避免使用容易猜測的簡單密碼。',
restricted_found: '避免過度使用{{list, list}}。',
'restricted.repetition': '重複的字符',
'restricted.sequence': '連續的字符',
'restricted.user_info': '個人資訊',
'restricted.words': '產品上下文',
};
export default Object.freeze(password_rejected);

View file

@ -1,10 +1,7 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
separator: ',',
or: '或',
and: '和',
separator: '',
};
export default Object.freeze(list);

View file

@ -51,18 +51,12 @@ const description = {
no_region_code_found: '沒有找到區域碼',
verify_email: '驗證你的郵箱',
verify_phone: '驗證你的手機號碼',
/** UNTRANSLATED */
password_requirements: 'Password {{items, list}}.',
/** UNTRANSLATED */
'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_requirements: '密碼{{items, list}}。',
'password_requirement.length_one': '長度至少為{{count}}個字符',
'password_requirement.length_other': '長度至少為{{count}}個字符',
'password_requirement.character_types_one': '需包含{{count}}類型的大寫字母、小寫字母、數字和符號',
'password_requirement.character_types_other':
'should contain at least {{count}} types of uppercase letters, lowercase letters, digits, and symbols',
'需包含{{count}}類型的大寫字母、小寫字母、數字和符號',
};
export default Object.freeze(description);

View file

@ -1,24 +1,14 @@
const password_rejected = {
/** UNTRANSLATED */
too_short: 'Minimum length is {{min}}.',
/** UNTRANSLATED */
too_long: 'Maximum length is {{max}}.',
/** UNTRANSLATED */
character_types: 'At least {{min}} types of characters are required.',
/** UNTRANSLATED */
unsupported_characters: 'Unsupported character found.',
/** UNTRANSLATED */
pwned: 'Avoid using simple passwords that are easy to guess.',
/** UNTRANSLATED */
restricted_found: 'Avoid overusing {{list, list}}.',
/** UNTRANSLATED */
'restricted.repetition': 'repeated characters',
/** UNTRANSLATED */
'restricted.sequence': 'sequential characters',
/** UNTRANSLATED */
'restricted.user_info': 'your personal information',
/** UNTRANSLATED */
'restricted.words': 'product context',
too_short: '最少需要 {{min}} 位字元。',
too_long: '最多只能有 {{max}} 位字元。',
character_types: '至少需要 {{min}} 種不同的字元類型。',
unsupported_characters: '發現不支援的字元。',
pwned: '請避免使用容易被猜中的簡單密碼。',
restricted_found: '請避免過度使用 {{list, list}}。',
'restricted.repetition': '連續重複的字元',
'restricted.sequence': '連續的字元',
'restricted.user_info': '個人資訊',
'restricted.words': '使用產品相關的字詞',
};
export default Object.freeze(password_rejected);

View file

@ -1,10 +1,7 @@
const list = {
/** UNTRANSLATED */
or: 'or',
/** UNTRANSLATED */
and: 'and',
/** UNTRANSLATED */
separator: ',',
or: '或',
and: '和',
separator: '',
};
export default Object.freeze(list);

View file

@ -1,8 +1,8 @@
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 if your password meets the requirements.',
rejected:
'Das Passwort wurde abgelehnt. Bitte überprüfen Sie, ob Ihr Passwort den Anforderungen entspricht.',
};
export default Object.freeze(password);

View file

@ -19,10 +19,8 @@ const sign_in_experiences = {
unsupported_default_language: 'Die Sprache - {{language}} wird momentan nicht unterstützt.',
at_least_one_authentication_factor:
'Sie müssen mindestens einen Authentifizierungsfaktor auswählen.',
/** UNTRANSLATED */
backup_code_cannot_be_enabled_alone: 'Backup code cannot be enabled alone.',
/** UNTRANSLATED */
duplicated_mfa_factors: 'Duplicated MFA factors.',
backup_code_cannot_be_enabled_alone: 'Backup-Code kann nicht alleine aktiviert werden.',
duplicated_mfa_factors: 'Duplizierte MFA-Faktoren.',
};
export default Object.freeze(sign_in_experiences);

View file

@ -28,7 +28,7 @@ import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import tenants from './tenants.js';
import topbar from './topbar.js';
import upsell from './upsell.js';
import upsell from './upsell/index.js';
import user_details from './user-details.js';
import users from './users.js';
import webhook_details from './webhook-details.js';

View file

@ -11,8 +11,7 @@ const sign_in_exp = {
branding: 'Branding',
sign_up_and_sign_in: 'Anmeldung und Registrierung',
content: 'Inhalt',
/** UNTRANSLATED */
password_policy: 'Password policy',
password_policy: 'Passwortrichtlinie',
},
welcome: {
title: 'Anmeldungs-Erlebnis anpassen',

View file

@ -1,45 +1,28 @@
const password_policy = {
/** UNTRANSLATED */
password_requirements: 'Password requirements',
/** UNTRANSLATED */
minimum_length: 'Minimum length',
/** UNTRANSLATED */
minimum_length_description: 'NIST suggests using <a>at least 8 characters</a> for web products.',
/** UNTRANSLATED */
minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).',
/** UNTRANSLATED */
minimum_required_char_types: 'Minimum required character types',
/** UNTRANSLATED */
password_requirements: 'Passwortanforderungen',
minimum_length: 'Mindestlänge',
minimum_length_description:
'NIST schlägt vor, <a>mindestens 8 Zeichen</a> für Webprodukte zu verwenden.',
minimum_length_error: 'Die Mindestlänge muss zwischen {{min}} und {{max}} (einschließlich) sein.',
minimum_required_char_types: 'Mindestanzahl erforderlicher Zeichentypen',
minimum_required_char_types_description:
'Character types: uppercase (A-Z), lowercase (a-z), numbers (0-9), and special symbols ({{symbols}}).',
/** UNTRANSLATED */
password_rejection: 'Password rejection',
/** UNTRANSLATED */
compromised_passwords: 'Reject compromised password',
/** UNTRANSLATED */
breached_passwords: 'Breached passwords',
/** UNTRANSLATED */
breached_passwords_description: 'Reject passwords previously found in breach databases.',
/** UNTRANSLATED */
restricted_phrases: 'Restrict low-security phrases',
/** UNTRANSLATED */
'Zeichentypen: Großbuchstaben (A-Z), Kleinbuchstaben (a-z), Zahlen (0-9) und Sonderzeichen ({{symbols}}).',
password_rejection: 'Passwortablehnung',
compromised_passwords: 'Abgelehnte Passwörter',
breached_passwords: 'Verletzte Passwörter',
breached_passwords_description:
'Ablehnung von zuvor in den Verletzungsdatenbanken gefundenen Passwörtern.',
restricted_phrases: 'Einschränkung niedrigsicherer Phrasen',
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: 'E.g., "AAAA", "1234", and "abcd".',
/** UNTRANSLATED */
user_information: 'User information',
/** UNTRANSLATED */
user_information_description: 'E.g., email address, phone number, username, etc.',
/** UNTRANSLATED */
custom_words: 'Custom words',
/** UNTRANSLATED */
'Ihr Passwort sollte diese Phrasen vermeiden, es sei denn, Sie kombinieren sie mit 3 oder mehr zusätzlichen Zeichen.',
repetitive_or_sequential_characters: 'Wiederholte oder aufeinanderfolgende Zeichen',
repetitive_or_sequential_characters_description: 'Zum Beispiel "AAAA", "1234" und "abcd".',
user_information: 'Benutzerinformationen',
user_information_description: 'Zum Beispiel E-Mail-Adresse, Telefonnummer, Benutzername, etc.',
custom_words: 'Benutzerdefinierte Wörter',
custom_words_description:
'Personalize context-specific words, case-insensitive, and one per line.',
/** UNTRANSLATED */
custom_words_placeholder: 'Your service name, company name, etc.',
'Personalisierte kontextspezifische Wörter, Groß-/Kleinschreibung wird nicht beachtet, ein Wort pro Zeile.',
custom_words_placeholder: 'Name Ihres Dienstes, Firmenname, etc.',
};
export default Object.freeze(password_policy);

View file

@ -54,13 +54,10 @@ const sign_up_and_sign_in = {
'Dies ist unerlässlich, da Sie {{identifier}} als obligatorischen Identifier ausgewählt haben.',
},
advanced_options: {
/** UNTRANSLATED */
title: 'ADVANCED OPTIONS',
/** UNTRANSLATED */
enable_user_registration: 'Enable user registration',
/** UNTRANSLATED */
title: 'ERWEITERTE OPTIONEN',
enable_user_registration: 'Benutzerregistrierung aktivieren',
enable_user_registration_description:
'Enable or disallow user registration. Once disabled, users can still be added in the admin console but users can no longer establish accounts through the sign-in UI.',
'Aktivieren oder deaktivieren Sie die Benutzerregistrierung. Sobald deaktiviert, können Benutzer immer noch über die Admin-Konsole hinzugefügt werden, aber Benutzer können keine Konten mehr über die Anmelde-Benutzeroberfläche einrichten.',
},
};

View file

@ -1,87 +0,0 @@
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Upgrade-Plan',
compare_plans: 'Pläne vergleichen',
get_started: {
title: 'Starten Sie Ihre nahtlose Identitätsreise mit einem kostenlosen Plan!',
description:
'Der kostenlose Plan eignet sich perfekt, um Logto in Ihren eigenen Projekten oder Tests auszuprobieren. Um die volle Leistungsfähigkeit von Logto für Ihr Team zu nutzen, können Sie ein Upgrade durchführen, um uneingeschränkten Zugriff auf Premium-Funktionen zu erhalten: unbegrenzte MAU-Nutzung, Maschine-zu-Maschine-Integration, RBAC-Verwaltung, Langzeit-Audit-Protokolle, usw. <a>Alle Pläne anzeigen</a>',
},
create_tenant: {
title: 'Wählen Sie Ihren Tenant-Plan aus',
description:
'Logto bietet wettbewerbsfähige Planoptionen mit innovativer und erschwinglicher Preisgestaltung, die für wachsende Unternehmen entwickelt wurden. <a>Erfahren Sie mehr</a>',
base_price: 'Grundpreis',
monthly_price: '{{value, number}}/Monat',
mau_unit_price: 'MAU-Einheitspreis',
view_all_features: 'Alle Funktionen anzeigen',
select_plan: '<name/> auswählen',
free_tenants_limit: 'Bis zu {{count, number}} kostenlose Tenant',
free_tenants_limit_other: 'Bis zu {{count, number}} kostenlose Tenants',
most_popular: 'Am beliebtesten',
upgrade_success: 'Erfolgreich auf <name/> upgegradet',
},
paywall: {
applications:
'{{count, number}} Anwendung von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
applications_other:
'{{count, number}} Anwendungen von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine_feature:
'Upgraden Sie auf einen kostenpflichtigen Tarif, um eine Maschinen-zu-Maschinen-Anwendung zu erstellen und Zugriff auf alle Premium-Funktionen zu erhalten. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine:
'{{count, number}} Maschine-zu-Maschine-Anwendung von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine_other:
'{{count, number}} Maschine-zu-Maschine-Anwendungen von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
resources:
'Sie haben das Limit von {{count, number}} <planName/>-API-Ressourcen erreicht. Upgraden Sie Ihren Plan, um den Anforderungen Ihres Teams gerecht zu werden. <a>Kontaktieren Sie uns</a> bei Bedarf.',
resources_other:
'Sie haben das Limit von {{count, number}} <planName/>-API-Ressourcen erreicht. Upgraden Sie Ihren Plan, um den Anforderungen Ihres Teams gerecht zu werden. <a>Kontaktieren Sie uns</a> bei Bedarf.',
scopes_per_resource:
'Sie haben das Limit von {{count, number}} Berechtigungen pro API-Ressource von <planName/> erreicht. Upgraden Sie jetzt, um zu erweitern. <a>Kontaktieren Sie uns</a> bei Bedarf.',
scopes_per_resource_other:
'Sie haben das Limit von {{count, number}} Berechtigungen pro API-Ressource von <planName/> erreicht. Upgraden Sie jetzt, um zu erweitern. <a>Kontaktieren Sie uns</a> bei Bedarf.',
custom_domain:
'Schalten Sie die Funktion für individuelle Domains frei und profitieren Sie von einer Reihe von Premium-Vorteilen, indem Sie auf einen kostenpflichtigen Plan upgraden. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
social_connectors:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
social_connectors_other:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_feature:
'Upgraden Sie auf einen kostenpflichtigen Plan, um eigene Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erstellen, sowie unbegrenzte Sozialconnectoren und alle Premium-Funktionen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_other:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_pro:
'Sie haben das Limit von {{count, number}} <planName/>-Standardconnectoren erreicht. Upgraden Sie auf den Enterprise-Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_pro_other:
'Sie haben das Limit von {{count, number}} <planName/>-Standardconnectoren erreicht. Upgraden Sie auf den Enterprise-Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
roles:
'Sie haben das Limit von {{count, number}} <planName/>-Rollen erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
roles_other:
'Sie haben das Limit von {{count, number}} <planName/>-Rollen erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
scopes_per_role:
'Sie haben das Limit von {{count, number}} Berechtigungen pro Rolle von <planName/> erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Bei Fragen stehen wir Ihnen gerne zur Verfügung. <a>Kontaktieren Sie uns</a>.',
scopes_per_role_other:
'Sie haben das Limit von {{count, number}} Berechtigungen pro Rolle von <planName/> erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Bei Fragen stehen wir Ihnen gerne zur Verfügung. <a>Kontaktieren Sie uns</a>.',
hooks:
'Sie haben das Limit von {{count, number}} <planName/>-Webhooks erreicht. Upgraden Sie Ihren Plan, um mehr Webhooks zu erstellen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
hooks_other:
'Sie haben das Limit von {{count, number}} <planName/>-Webhooks erreicht. Upgraden Sie Ihren Plan, um mehr Webhooks zu erstellen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
},
mau_exceeded_modal: {
title: 'MAU-Limit überschritten. Upgraden Sie Ihren Plan.',
notification:
'Ihr aktueller MAU hat das Limit von <planName/> überschritten. Bitte upgraden Sie umgehend auf den Premium-Plan, um die Aussetzung des Logto-Dienstes zu vermeiden.',
update_plan: 'Plan aktualisieren',
},
payment_overdue_modal: {
title: 'Zahlungsrückstand für Rechnung',
notification:
'Hoppla! Die Zahlung für die Rechnung des Mieters <span>{{name}}</span> ist fehlgeschlagen. Bitte zahlen Sie die Rechnung umgehend, um eine Sperrung des Logto-Dienstes zu vermeiden.',
unpaid_bills: 'Ausstehende Rechnungen',
update_payment: 'Zahlung aktualisieren',
},
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,42 @@
import paywall from './paywall.js';
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Upgrade Plan',
compare_plans: 'Pläne vergleichen',
get_started: {
title: 'Starten Sie Ihre nahtlose Identitätsreise mit einem kostenlosen Plan!',
description:
'Der kostenlose Plan eignet sich perfekt, um Logto in Ihren eigenen Projekten oder Tests auszuprobieren. Um die volle Leistungsfähigkeit von Logto für Ihr Team zu nutzen, können Sie ein Upgrade durchführen, um uneingeschränkten Zugriff auf Premium-Funktionen zu erhalten: unbegrenzte MAU-Nutzung, Maschine-zu-Maschine-Integration, RBAC-Verwaltung, Langzeit-Audit-Protokolle, usw. <a>Alle Pläne anzeigen</a>',
},
create_tenant: {
title: 'Wählen Sie Ihren Tenant-Plan aus',
description:
'Logto bietet wettbewerbsfähige Planoptionen mit innovativer und erschwinglicher Preisgestaltung, die für wachsende Unternehmen entwickelt wurden. <a>Erfahren Sie mehr</a>',
base_price: 'Grundpreis',
monthly_price: '{{value, number}}/Monat',
mau_unit_price: 'MAU-Einheitspreis',
view_all_features: 'Alle Funktionen anzeigen',
select_plan: '<name/> auswählen',
free_tenants_limit: 'Bis zu {{count, number}} kostenlose Tenant',
free_tenants_limit_other: 'Bis zu {{count, number}} kostenlose Tenants',
most_popular: 'Am beliebtesten',
upgrade_success: 'Erfolgreich auf <name/> upgegradet',
},
mau_exceeded_modal: {
title: 'MAU-Limit überschritten. Upgraden Sie Ihren Plan.',
notification:
'Ihr aktueller MAU hat das Limit von <planName/> überschritten. Bitte upgraden Sie umgehend auf den Premium-Plan, um die Aussetzung des Logto-Dienstes zu vermeiden.',
update_plan: 'Plan aktualisieren',
},
payment_overdue_modal: {
title: 'Zahlungsrückstand für Rechnung',
notification:
'Hoppla! Die Zahlung für die Rechnung des Mieters <span>{{name}}</span> ist fehlgeschlagen. Bitte zahlen Sie die Rechnung umgehend, um eine Sperrung des Logto-Dienstes zu vermeiden.',
unpaid_bills: 'Ausstehende Rechnungen',
update_payment: 'Zahlung aktualisieren',
},
paywall,
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,50 @@
const paywall = {
applications:
'{{count, number}} Anwendung von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
applications_other:
'{{count, number}} Anwendungen von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine_feature:
'Upgraden Sie auf einen kostenpflichtigen Tarif, um eine Maschinen-zu-Maschinen-Anwendung zu erstellen und Zugriff auf alle Premium-Funktionen zu erhalten. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine:
'{{count, number}} Maschine-zu-Maschine-Anwendung von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
machine_to_machine_other:
'{{count, number}} Maschine-zu-Maschine-Anwendungen von <planName/> erreicht. Plan upgraden, um den Bedürfnissen Ihres Teams gerecht zu werden. Für Unterstützung können Sie uns gerne <a>kontaktieren</a>.',
resources:
'Sie haben das Limit von {{count, number}} <planName/>-API-Ressourcen erreicht. Upgraden Sie Ihren Plan, um den Anforderungen Ihres Teams gerecht zu werden. <a>Kontaktieren Sie uns</a> bei Bedarf.',
resources_other:
'Sie haben das Limit von {{count, number}} <planName/>-API-Ressourcen erreicht. Upgraden Sie Ihren Plan, um den Anforderungen Ihres Teams gerecht zu werden. <a>Kontaktieren Sie uns</a> bei Bedarf.',
scopes_per_resource:
'Sie haben das Limit von {{count, number}} Berechtigungen pro API-Ressource von <planName/> erreicht. Upgraden Sie jetzt, um zu erweitern. <a>Kontaktieren Sie uns</a> bei Bedarf.',
scopes_per_resource_other:
'Sie haben das Limit von {{count, number}} Berechtigungen pro API-Ressource von <planName/> erreicht. Upgraden Sie jetzt, um zu erweitern. <a>Kontaktieren Sie uns</a> bei Bedarf.',
custom_domain:
'Schalten Sie die Funktion für individuelle Domains frei und profitieren Sie von einer Reihe von Premium-Vorteilen, indem Sie auf einen kostenpflichtigen Plan upgraden. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
social_connectors:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
social_connectors_other:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_feature:
'Upgraden Sie auf einen kostenpflichtigen Plan, um eigene Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erstellen, sowie unbegrenzte Sozialconnectoren und alle Premium-Funktionen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_other:
'Sie haben das Limit von {{count, number}} <planName/>-Sozialconnectoren erreicht. Upgraden Sie Ihren Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_pro:
'Sie haben das Limit von {{count, number}} <planName/>-Standardconnectoren erreicht. Upgraden Sie auf den Enterprise-Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
standard_connectors_pro_other:
'Sie haben das Limit von {{count, number}} <planName/>-Standardconnectoren erreicht. Upgraden Sie auf den Enterprise-Plan, um zusätzliche Sozialconnectoren und die Möglichkeit zur Erstellung eigener Connectoren mit OIDC, OAuth 2.0 und SAML-Protokollen zu erhalten. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
roles:
'Sie haben das Limit von {{count, number}} <planName/>-Rollen erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
roles_other:
'Sie haben das Limit von {{count, number}} <planName/>-Rollen erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
scopes_per_role:
'Sie haben das Limit von {{count, number}} Berechtigungen pro Rolle von <planName/> erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Bei Fragen stehen wir Ihnen gerne zur Verfügung. <a>Kontaktieren Sie uns</a>.',
scopes_per_role_other:
'Sie haben das Limit von {{count, number}} Berechtigungen pro Rolle von <planName/> erreicht. Upgraden Sie Ihren Plan, um zusätzliche Rollen und Berechtigungen hinzuzufügen. Bei Fragen stehen wir Ihnen gerne zur Verfügung. <a>Kontaktieren Sie uns</a>.',
hooks:
'Sie haben das Limit von {{count, number}} <planName/>-Webhooks erreicht. Upgraden Sie Ihren Plan, um mehr Webhooks zu erstellen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
hooks_other:
'Sie haben das Limit von {{count, number}} <planName/>-Webhooks erreicht. Upgraden Sie Ihren Plan, um mehr Webhooks zu erstellen. Zögern Sie nicht, <a>Kontaktieren Sie uns</a>, wenn Sie Hilfe benötigen.',
};
export default Object.freeze(paywall);

View file

@ -28,7 +28,7 @@ import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import tenants from './tenants.js';
import topbar from './topbar.js';
import upsell from './upsell.js';
import upsell from './upsell/index.js';
import user_details from './user-details.js';
import users from './users.js';
import webhook_details from './webhook-details.js';

View file

@ -12,7 +12,7 @@ const password_policy = {
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.',
'Your password should avoid these phrases unless you combine with 3 or more extra characters.',
repetitive_or_sequential_characters: 'Repetitive or sequential characters',
repetitive_or_sequential_characters_description: 'E.g., "AAAA", "1234", and "abcd".',
user_information: 'User information',

View file

@ -1,87 +0,0 @@
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Upgrade Plan',
compare_plans: 'Compare plans',
get_started: {
title: 'Begin your seamless identity journey with a free plan!',
description:
'Free plan is perfect for trying out Logto on your side projects or trials. To fully leverage Logtos capabilities for your team, upgrade to gain unlimited access to premium features: unlimited MAU usage, Machine-to-Machine integration, RBAC management, long-term audit logs, etc. <a>View all plans</a>',
},
create_tenant: {
title: 'Select your tenant plan',
description:
'Logto provides competitive plan options with innovative and affordable pricing designed for growing companies. <a>Learn more</a>',
base_price: 'Base price',
monthly_price: '{{value, number}}/mo',
mau_unit_price: 'MAU unit price',
view_all_features: 'View all features',
select_plan: 'Select <name/>',
free_tenants_limit: 'Up to {{count, number}} free tenant',
free_tenants_limit_other: 'Up to {{count, number}} free tenants',
most_popular: 'Most popular',
upgrade_success: 'Successfully upgraded to <name/>',
},
paywall: {
applications:
'{{count, number}} application of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
applications_other:
'{{count, number}} applications of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine_feature:
'Upgrade to a paid plan to create machine-to-machine application, along with access to all the premium features. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine:
'{{count, number}} machine-to-machine application of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine_other:
'{{count, number}} machine-to-machine applications of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
resources:
'{{count, number}} API resource of <planName/> limit reached. Upgrade plan to meet your teams needs. <a>Contact us</a> for any assistant.',
resources_other:
'{{count, number}} API resources of <planName/> limit reached. Upgrade plan to meet your teams needs. <a>Contact us</a> for any assistant.',
scopes_per_resource:
'{{count, number}} permission per API resource of <planName/> limit reached. Upgrade now to expand. <a>Contact us</a> for any assistant.',
scopes_per_resource_other:
'{{count, number}} permissions per API resource of <planName/> limit reached. Upgrade now to expand. <a>Contact us</a> for any assistant.',
custom_domain:
'Unlock custom domain functionality and a range of premium benefits by upgrading to a paid plan. Dont hesitate to <a>contact us</a> if you need any assistance.',
social_connectors:
'{{count, number}} social connector of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
social_connectors_other:
'{{count, number}} social connectors of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_feature:
'Upgrade to a paid plan to create your own connectors using OIDC, OAuth 2.0, and SAML protocols, plus unlimited social connectors and all the premium features. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors:
'{{count, number}} social connector of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_other:
'{{count, number}} social connectors of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_pro:
'{{count, number}} standard connector of <planName/> limit reached. To meet your teams needs, upgrade to the Enterprise plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_pro_other:
'{{count, number}} standard connectors of <planName/> limit reached. To meet your teams needs, upgrade to the Enterprise plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
roles:
'{{count, number}} role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. Feel free to <a>contact us</a> if you need any assistance.',
roles_other:
'{{count, number}} roles of <planName/> limit reached. Upgrade plan to add additional roles and permissions. Feel free to <a>contact us</a> if you need any assistance.',
scopes_per_role:
'{{count, number}} permission per role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. For any assistance, feel free to <a>contact us</a>.',
scopes_per_role_other:
'{{count, number}} permissions per role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. For any assistance, feel free to <a>contact us</a>.',
hooks:
'{{count, number}} webhook of <planName/> limit reached. Upgrade plan to create more webhooks. Feel free to <a>contact us</a> if you need any assistance.',
hooks_other:
'{{count, number}} webhooks of <planName/> limit reached. Upgrade plan to create more webhooks. Feel free to <a>contact us</a> if you need any assistance.',
},
mau_exceeded_modal: {
title: 'MAU has exceeded the limit. Upgrade your plan.',
notification:
'Your current MAU has exceeded the limit of <planName/>. Please upgrade your plan to premium promptly to avoid suspension of Logto service. ',
update_plan: 'Update Plan',
},
payment_overdue_modal: {
title: 'Bill payment overdue',
notification:
'Oops! Payment for tenant <span>{{name}}</span> bill failed. Please pay the bill promptly to avoid suspension of Logto service.',
unpaid_bills: 'Unpaid bills',
update_payment: 'Update Payment',
},
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,42 @@
import paywall from './paywall.js';
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Upgrade Plan',
compare_plans: 'Compare plans',
get_started: {
title: 'Begin your seamless identity journey with a free plan!',
description:
'Free plan is perfect for trying out Logto on your side projects or trials. To fully leverage Logtos capabilities for your team, upgrade to gain unlimited access to premium features: unlimited MAU usage, Machine-to-Machine integration, RBAC management, long-term audit logs, etc. <a>View all plans</a>',
},
create_tenant: {
title: 'Select your tenant plan',
description:
'Logto provides competitive plan options with innovative and affordable pricing designed for growing companies. <a>Learn more</a>',
base_price: 'Base price',
monthly_price: '{{value, number}}/mo',
mau_unit_price: 'MAU unit price',
view_all_features: 'View all features',
select_plan: 'Select <name/>',
free_tenants_limit: 'Up to {{count, number}} free tenant',
free_tenants_limit_other: 'Up to {{count, number}} free tenants',
most_popular: 'Most popular',
upgrade_success: 'Successfully upgraded to <name/>',
},
mau_exceeded_modal: {
title: 'MAU has exceeded the limit. Upgrade your plan.',
notification:
'Your current MAU has exceeded the limit of <planName/>. Please upgrade your plan to premium promptly to avoid suspension of Logto service. ',
update_plan: 'Update Plan',
},
payment_overdue_modal: {
title: 'Bill payment overdue',
notification:
'Oops! Payment for tenant <span>{{name}}</span> bill failed. Please pay the bill promptly to avoid suspension of Logto service.',
unpaid_bills: 'Unpaid bills',
update_payment: 'Update Payment',
},
paywall,
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,50 @@
const paywall = {
applications:
'{{count, number}} application of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
applications_other:
'{{count, number}} applications of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine_feature:
'Upgrade to a paid plan to create machine-to-machine application, along with access to all the premium features. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine:
'{{count, number}} machine-to-machine application of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
machine_to_machine_other:
'{{count, number}} machine-to-machine applications of <planName/> limit reached. Upgrade plan to meet your teams needs. For any assistance, feel free to <a>contact us</a>.',
resources:
'{{count, number}} API resource of <planName/> limit reached. Upgrade plan to meet your teams needs. <a>Contact us</a> for any assistant.',
resources_other:
'{{count, number}} API resources of <planName/> limit reached. Upgrade plan to meet your teams needs. <a>Contact us</a> for any assistant.',
scopes_per_resource:
'{{count, number}} permission per API resource of <planName/> limit reached. Upgrade now to expand. <a>Contact us</a> for any assistant.',
scopes_per_resource_other:
'{{count, number}} permissions per API resource of <planName/> limit reached. Upgrade now to expand. <a>Contact us</a> for any assistant.',
custom_domain:
'Unlock custom domain functionality and a range of premium benefits by upgrading to a paid plan. Dont hesitate to <a>contact us</a> if you need any assistance.',
social_connectors:
'{{count, number}} social connector of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
social_connectors_other:
'{{count, number}} social connectors of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_feature:
'Upgrade to a paid plan to create your own connectors using OIDC, OAuth 2.0, and SAML protocols, plus unlimited social connectors and all the premium features. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors:
'{{count, number}} social connector of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_other:
'{{count, number}} social connectors of <planName/> limit reached. To meet your teams needs, upgrade plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_pro:
'{{count, number}} standard connector of <planName/> limit reached. To meet your teams needs, upgrade to the Enterprise plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
standard_connectors_pro_other:
'{{count, number}} standard connectors of <planName/> limit reached. To meet your teams needs, upgrade to the Enterprise plan for additional social connectors and the ability to create your own connectors using OIDC, OAuth 2.0, and SAML protocols. Feel free to <a>contact us</a> if you need any assistance.',
roles:
'{{count, number}} role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. Feel free to <a>contact us</a> if you need any assistance.',
roles_other:
'{{count, number}} roles of <planName/> limit reached. Upgrade plan to add additional roles and permissions. Feel free to <a>contact us</a> if you need any assistance.',
scopes_per_role:
'{{count, number}} permission per role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. For any assistance, feel free to <a>contact us</a>.',
scopes_per_role_other:
'{{count, number}} permissions per role of <planName/> limit reached. Upgrade plan to add additional roles and permissions. For any assistance, feel free to <a>contact us</a>.',
hooks:
'{{count, number}} webhook of <planName/> limit reached. Upgrade plan to create more webhooks. Feel free to <a>contact us</a> if you need any assistance.',
hooks_other:
'{{count, number}} webhooks of <planName/> limit reached. Upgrade plan to create more webhooks. Feel free to <a>contact us</a> if you need any assistance.',
};
export default Object.freeze(paywall);

View file

@ -1,8 +1,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 if your password meets the requirements.',
rejected: 'Contraseña rechazada. Por favor verifica que tu contraseña cumpla con los requisitos.',
};
export default Object.freeze(password);

View file

@ -18,10 +18,8 @@ const sign_in_experiences = {
'La firma de código de verificación debe estar habilitada cuando no se requiere contraseña en el registro.',
unsupported_default_language: 'Este lenguaje - {{language}} no es compatible en este momento.',
at_least_one_authentication_factor: 'Debe seleccionar al menos un factor de autenticación.',
/** UNTRANSLATED */
backup_code_cannot_be_enabled_alone: 'Backup code cannot be enabled alone.',
/** UNTRANSLATED */
duplicated_mfa_factors: 'Duplicated MFA factors.',
backup_code_cannot_be_enabled_alone: 'El código de respaldo no se puede habilitar solo.',
duplicated_mfa_factors: 'Factores MFA duplicados.',
};
export default Object.freeze(sign_in_experiences);

View file

@ -28,7 +28,7 @@ import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import tenants from './tenants.js';
import topbar from './topbar.js';
import upsell from './upsell.js';
import upsell from './upsell/index.js';
import user_details from './user-details.js';
import users from './users.js';
import webhook_details from './webhook-details.js';

View file

@ -11,8 +11,7 @@ const sign_in_exp = {
branding: 'Branding',
sign_up_and_sign_in: 'Registro e inicio de sesión',
content: 'Contenido',
/** UNTRANSLATED */
password_policy: 'Password policy',
password_policy: 'Política de contraseña',
},
welcome: {
title: 'Personalice la experiencia de inicio de sesión',

View file

@ -1,45 +1,28 @@
const password_policy = {
/** UNTRANSLATED */
password_requirements: 'Password requirements',
/** UNTRANSLATED */
minimum_length: 'Minimum length',
/** UNTRANSLATED */
minimum_length_description: 'NIST suggests using <a>at least 8 characters</a> for web products.',
/** UNTRANSLATED */
minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).',
/** UNTRANSLATED */
minimum_required_char_types: 'Minimum required character types',
/** UNTRANSLATED */
password_requirements: 'Requisitos de contraseña',
minimum_length: 'Longitud mínima',
minimum_length_description: 'NIST sugiere usar <a>al menos 8 caracteres</a> para productos web.',
minimum_length_error: 'La longitud mínima debe estar entre {{min}} y {{max}} (inclusive).',
minimum_required_char_types: 'Tipos de caracteres requeridos mínimos',
minimum_required_char_types_description:
'Character types: uppercase (A-Z), lowercase (a-z), numbers (0-9), and special symbols ({{symbols}}).',
/** UNTRANSLATED */
password_rejection: 'Password rejection',
/** UNTRANSLATED */
compromised_passwords: 'Reject compromised password',
/** UNTRANSLATED */
breached_passwords: 'Breached passwords',
/** UNTRANSLATED */
breached_passwords_description: 'Reject passwords previously found in breach databases.',
/** UNTRANSLATED */
restricted_phrases: 'Restrict low-security phrases',
/** UNTRANSLATED */
'Tipos de caracteres: mayúsculas (A-Z), minúsculas (a-z), números (0-9) y símbolos especiales ({{symbols}}).',
password_rejection: 'Rechazo de contraseña',
compromised_passwords: 'Contraseñas comprometidas',
breached_passwords: 'Contraseñas vulneradas',
breached_passwords_description:
'Rechazar contraseñas encontradas previamente en bases de datos de vulnerabilidad.',
restricted_phrases: 'Restringir frases de baja seguridad',
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: 'E.g., "AAAA", "1234", and "abcd".',
/** UNTRANSLATED */
user_information: 'User information',
/** UNTRANSLATED */
user_information_description: 'E.g., email address, phone number, username, etc.',
/** UNTRANSLATED */
custom_words: 'Custom words',
/** UNTRANSLATED */
'Su contraseña debe evitar estas frases a menos que combine con 3 o más caracteres adicionales.',
repetitive_or_sequential_characters: 'Caracteres repetitivos o secuenciales',
repetitive_or_sequential_characters_description: 'Por ejemplo, "AAAA", "1234" y "abcd".',
user_information: 'Información de usuario',
user_information_description:
'Por ejemplo, dirección de correo electrónico, número de teléfono, nombre de usuario, etc.',
custom_words: 'Palabras personalizadas',
custom_words_description:
'Personalize context-specific words, case-insensitive, and one per line.',
/** UNTRANSLATED */
custom_words_placeholder: 'Your service name, company name, etc.',
'Personaliza las palabras específicas del contexto, sin importar las mayúsculas y minúsculas, y una por línea.',
custom_words_placeholder: 'Nombre de su servicio, nombre de la empresa, etc.',
};
export default Object.freeze(password_policy);

View file

@ -14,7 +14,7 @@ const sign_up_and_sign_in = {
sign_up_authentication: 'Configuración de autenticación para el registro',
authentication_description:
'Todas las acciones seleccionadas serán obligatorias para que los usuarios completen el proceso.',
set_a_password_option: 'Crea una contraseña',
set_a_password_option: 'Crear una contraseña',
verify_at_sign_up_option: 'Verificar al registrarse',
social_only_creation_description:
'(Esto se aplica solo a la creación de cuentas mediante redes sociales)',
@ -57,13 +57,10 @@ const sign_up_and_sign_in = {
'Es esencial ya que has seleccionado {{identifier}} como identificador obligatorio.',
},
advanced_options: {
/** UNTRANSLATED */
title: 'ADVANCED OPTIONS',
/** UNTRANSLATED */
enable_user_registration: 'Enable user registration',
/** UNTRANSLATED */
title: 'OPCIONES AVANZADAS',
enable_user_registration: 'Habilitar registro de usuario',
enable_user_registration_description:
'Enable or disallow user registration. Once disabled, users can still be added in the admin console but users can no longer establish accounts through the sign-in UI.',
'Habilitar o deshabilitar el registro de usuarios. Una vez deshabilitado, los usuarios aún se pueden agregar en la consola de administración, pero los usuarios ya no pueden establecer cuentas a través de la interfaz de inicio de sesión.',
},
};

View file

@ -1,87 +0,0 @@
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Plan de actualización',
compare_plans: 'Comparar planes',
get_started: {
title: '¡Comience su viaje de identidad sin problemas con un plan gratuito!',
description:
'El plan gratuito es perfecto para probar Logto en sus proyectos personales o pruebas. Para aprovechar al máximo las capacidades de Logto para su equipo, actualice para obtener acceso ilimitado a las características premium: uso ilimitado de MAU, integración de Máquina a Máquina, gestión de RBAC, registros de auditoría a largo plazo, etc. <a>Ver todos los planes</a>',
},
create_tenant: {
title: 'Selecciona tu plan de tenant',
description:
'Logto ofrece opciones de planes competitivos con una innovadora y asequible estructura de precios diseñada para empresas en crecimiento. <a>Más información</a>',
base_price: 'Precio base',
monthly_price: '{{value, number}}/mes',
mau_unit_price: 'Precio unitario de MAU',
view_all_features: 'Ver todas las características',
select_plan: 'Seleccionar <name/>',
free_tenants_limit: 'Hasta {{count, number}} tenant gratuito',
free_tenants_limit_other: 'Hasta {{count, number}} tenants gratuitos',
most_popular: 'Más popular',
upgrade_success: 'Actualización a <name/> realizada con éxito',
},
paywall: {
applications:
'Se ha alcanzado el límite de {{count, number}} aplicación de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
applications_other:
'Se ha alcanzado el límite de {{count, number}} aplicaciones de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine_feature:
'Actualiza a un plan de pago para crear aplicaciones de máquina a máquina, junto con acceso a todas las funciones premium. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine:
'Se ha alcanzado el límite de {{count, number}} aplicación de máquina a máquina de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine_other:
'Se ha alcanzado el límite de {{count, number}} aplicaciones de máquina a máquina de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
resources:
'Has alcanzado el límite de {{count, number}} recursos de API de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. <a>Contáctanos</a> si necesitas asistencia.',
resources_other:
'Has alcanzado el límite de {{count, number}} recursos de API de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. <a>Contáctanos</a> si necesitas asistencia.',
scopes_per_resource:
'Has alcanzado el límite de {{count, number}} permisos por recurso de API de <planName/>. Actualiza ahora para expandirlo. <a>Contáctanos</a> si necesitas asistencia.',
scopes_per_resource_other:
'Has alcanzado el límite de {{count, number}} permisos por recurso de API de <planName/>. Actualiza ahora para expandirlo. <a>Contáctanos</a> si necesitas asistencia.',
custom_domain:
'Desbloquea la funcionalidad de dominio personalizado y una variedad de beneficios premium al actualizar a un plan de pago. No dudes en <a>contactarnos</a> si necesitas ayuda.',
social_connectors:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
social_connectors_other:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_feature:
'Actualiza a un plan de pago para crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML, además de obtener conectores sociales ilimitados y todas las funciones premium. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_other:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_pro:
'Has alcanzado el límite de {{count, number}} conectores estándar de <planName/>. Actualiza al plan Enterprise para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_pro_other:
'Has alcanzado el límite de {{count, number}} conectores estándar de <planName/>. Actualiza al plan Enterprise para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
roles:
'Has alcanzado el límite de {{count, number}} roles de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
roles_other:
'Has alcanzado el límite de {{count, number}} roles de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
scopes_per_role:
'Has alcanzado el límite de {{count, number}} permisos por rol de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
scopes_per_role_other:
'Has alcanzado el límite de {{count, number}} permisos por rol de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
hooks:
'Has alcanzado el límite de {{count, number}} webhooks de <planName/>. Actualiza el plan para crear más webhooks. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
hooks_other:
'Has alcanzado el límite de {{count, number}} webhooks de <planName/>. Actualiza el plan para crear más webhooks. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
},
mau_exceeded_modal: {
title: 'Se ha superado el límite de MAU. Actualiza tu plan.',
notification:
'Tu MAU actual ha superado el límite de <planName/>. Por favor, actualiza tu plan a premium a tiempo para evitar la suspensión del servicio de Logto.',
update_plan: 'Actualizar plan',
},
payment_overdue_modal: {
title: 'Factura con pagos atrasados',
notification:
'¡Ups! El pago de la factura del inquilino <span>{{name}}</span> ha fallado. Por favor, pague la factura a tiempo para evitar la suspensión del servicio de Logto.',
unpaid_bills: 'Facturas impagas',
update_payment: 'Actualizar pago',
},
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,42 @@
import paywall from './paywall.js';
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Plan de actualización',
compare_plans: 'Comparar planes',
get_started: {
title: '¡Comience su viaje de identidad sin problemas con un plan gratuito!',
description:
'El plan gratuito es perfecto para probar Logto en sus proyectos personales o pruebas. Para aprovechar al máximo las capacidades de Logto para su equipo, actualice para obtener acceso ilimitado a las características premium: uso ilimitado de MAU, integración de Máquina a Máquina, gestión de RBAC, registros de auditoría a largo plazo, etc. <a>Ver todos los planes</a>',
},
create_tenant: {
title: 'Selecciona tu plan de tenant',
description:
'Logto ofrece opciones de planes competitivos con una innovadora y asequible estructura de precios diseñada para empresas en crecimiento. <a>Más información</a>',
base_price: 'Precio base',
monthly_price: '{{value, number}}/mes',
mau_unit_price: 'Precio unitario de MAU',
view_all_features: 'Ver todas las características',
select_plan: 'Seleccionar <name/>',
free_tenants_limit: 'Hasta {{count, number}} tenant gratuito',
free_tenants_limit_other: 'Hasta {{count, number}} tenants gratuitos',
most_popular: 'Más popular',
upgrade_success: 'Actualización a <name/> realizada con éxito',
},
mau_exceeded_modal: {
title: 'Se ha superado el límite de MAU. Actualiza tu plan.',
notification:
'Tu MAU actual ha superado el límite de <planName/>. Por favor, actualiza tu plan a premium a tiempo para evitar la suspensión del servicio de Logto.',
update_plan: 'Actualizar plan',
},
payment_overdue_modal: {
title: 'Factura con pagos atrasados',
notification:
'¡Ups! El pago de la factura del inquilino <span>{{name}}</span> ha fallado. Por favor, pague la factura a tiempo para evitar la suspensión del servicio de Logto.',
unpaid_bills: 'Facturas impagas',
update_payment: 'Actualizar pago',
},
paywall,
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,50 @@
const paywall = {
applications:
'Se ha alcanzado el límite de {{count, number}} aplicación de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
applications_other:
'Se ha alcanzado el límite de {{count, number}} aplicaciones de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine_feature:
'Actualiza a un plan de pago para crear aplicaciones de máquina a máquina, junto con acceso a todas las funciones premium. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine:
'Se ha alcanzado el límite de {{count, number}} aplicación de máquina a máquina de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
machine_to_machine_other:
'Se ha alcanzado el límite de {{count, number}} aplicaciones de máquina a máquina de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. Para cualquier ayuda, no dudes en <a>contactarnos</a>.',
resources:
'Has alcanzado el límite de {{count, number}} recursos de API de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. <a>Contáctanos</a> si necesitas asistencia.',
resources_other:
'Has alcanzado el límite de {{count, number}} recursos de API de <planName/>. Actualiza el plan para satisfacer las necesidades de tu equipo. <a>Contáctanos</a> si necesitas asistencia.',
scopes_per_resource:
'Has alcanzado el límite de {{count, number}} permisos por recurso de API de <planName/>. Actualiza ahora para expandirlo. <a>Contáctanos</a> si necesitas asistencia.',
scopes_per_resource_other:
'Has alcanzado el límite de {{count, number}} permisos por recurso de API de <planName/>. Actualiza ahora para expandirlo. <a>Contáctanos</a> si necesitas asistencia.',
custom_domain:
'Desbloquea la funcionalidad de dominio personalizado y una variedad de beneficios premium al actualizar a un plan de pago. No dudes en <a>contactarnos</a> si necesitas ayuda.',
social_connectors:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
social_connectors_other:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_feature:
'Actualiza a un plan de pago para crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML, además de obtener conectores sociales ilimitados y todas las funciones premium. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_other:
'Has alcanzado el límite de {{count, number}} conectores sociales de <planName/>. Actualiza el plan para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_pro:
'Has alcanzado el límite de {{count, number}} conectores estándar de <planName/>. Actualiza al plan Enterprise para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
standard_connectors_pro_other:
'Has alcanzado el límite de {{count, number}} conectores estándar de <planName/>. Actualiza al plan Enterprise para obtener conectores sociales adicionales y la capacidad de crear tus propios conectores usando los protocolos OIDC, OAuth 2.0 y SAML. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
roles:
'Has alcanzado el límite de {{count, number}} roles de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
roles_other:
'Has alcanzado el límite de {{count, number}} roles de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
scopes_per_role:
'Has alcanzado el límite de {{count, number}} permisos por rol de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
scopes_per_role_other:
'Has alcanzado el límite de {{count, number}} permisos por rol de <planName/>. Actualiza el plan para agregar roles y permisos adicionales. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
hooks:
'Has alcanzado el límite de {{count, number}} webhooks de <planName/>. Actualiza el plan para crear más webhooks. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
hooks_other:
'Has alcanzado el límite de {{count, number}} webhooks de <planName/>. Actualiza el plan para crear más webhooks. Si necesitas ayuda, no dudes en <a>contactarnos</a>.',
};
export default Object.freeze(paywall);

View file

@ -2,8 +2,7 @@ const password = {
unsupported_encryption_method: "La méthode de cryptage {{name}} n'est pas prise en charge.",
pepper_not_found:
'Mot de passe pepper non trouvé. Veuillez vérifier votre environnement de base.',
/** UNTRANSLATED */
rejected: 'Password rejected. Please check if your password meets the requirements.',
rejected: 'Mot de passe rejeté. Veuillez vérifier si votre mot de passe répond aux exigences.',
};
export default Object.freeze(password);

View file

@ -20,10 +20,8 @@ const sign_in_experiences = {
"Cette langue - {{language}} n'est pas prise en charge pour le moment.",
at_least_one_authentication_factor:
"Vous devez sélectionner au moins un facteur d'authentification.",
/** UNTRANSLATED */
backup_code_cannot_be_enabled_alone: 'Backup code cannot be enabled alone.',
/** UNTRANSLATED */
duplicated_mfa_factors: 'Duplicated MFA factors.',
backup_code_cannot_be_enabled_alone: 'Le code de sauvegarde ne peut être activé seul.',
duplicated_mfa_factors: 'Facteurs de MFA en double.',
};
export default Object.freeze(sign_in_experiences);

View file

@ -28,7 +28,7 @@ import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import tenants from './tenants.js';
import topbar from './topbar.js';
import upsell from './upsell.js';
import upsell from './upsell/index.js';
import user_details from './user-details.js';
import users from './users.js';
import webhook_details from './webhook-details.js';

View file

@ -11,8 +11,7 @@ const sign_in_exp = {
branding: 'Image de marque',
sign_up_and_sign_in: 'Inscription et connexion',
content: 'Contenu',
/** UNTRANSLATED */
password_policy: 'Password policy',
password_policy: 'Politique de mot de passe',
},
welcome: {
title: "Personnaliser l'expérience de connexion",
@ -60,9 +59,9 @@ const sign_in_exp = {
password_policy,
setup_warning: {
no_connector_sms:
'Aucun connecteur SMS n\'a été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas se connecter avec cette méthode. <a>{{link}}</a> dans "Connectors"',
'Aucun connecteur SMS n\'a été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas se connecter avec cette méthode. <a>{{link}}</a> dans "Connecteurs"',
no_connector_email:
'Aucun connecteur d\'email n\'a été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas se connecter avec cette méthode. <a>{{link}}</a>dans"Connectors"',
'Aucun connecteur d\'email n\'a été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas se connecter avec cette méthode. <a>{{link}}</a> dans "Connecteurs"',
no_connector_social:
'Vous navez pas encore configuré de connecteur social. Ajoutez dabord des connecteurs pour appliquer des méthodes de connexion sociale. <a>{{link}}</a> dans "Connecteurs".',
setup_link: 'Configurer',

View file

@ -1,45 +1,30 @@
const password_policy = {
/** UNTRANSLATED */
password_requirements: 'Password requirements',
/** UNTRANSLATED */
minimum_length: 'Minimum length',
/** UNTRANSLATED */
minimum_length_description: 'NIST suggests using <a>at least 8 characters</a> for web products.',
/** UNTRANSLATED */
minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).',
/** UNTRANSLATED */
minimum_required_char_types: 'Minimum required character types',
/** UNTRANSLATED */
password_requirements: 'Exigences relatives au mot de passe',
minimum_length: 'Longueur minimale',
minimum_length_description:
"NIST suggère d'utiliser <a>au moins 8 caractères</a> pour les produits web.",
minimum_length_error:
'La longueur minimale doit être comprise entre {{min}} et {{max}} (inclus).',
minimum_required_char_types: 'Nombre minimum de types de caractères requis',
minimum_required_char_types_description:
'Character types: uppercase (A-Z), lowercase (a-z), numbers (0-9), and special symbols ({{symbols}}).',
/** UNTRANSLATED */
password_rejection: 'Password rejection',
/** UNTRANSLATED */
compromised_passwords: 'Reject compromised password',
/** UNTRANSLATED */
breached_passwords: 'Breached passwords',
/** UNTRANSLATED */
breached_passwords_description: 'Reject passwords previously found in breach databases.',
/** UNTRANSLATED */
restricted_phrases: 'Restrict low-security phrases',
/** UNTRANSLATED */
'Types de caractères : majuscules (A-Z), minuscules (a-z), chiffres (0-9) et symboles spéciaux ({{symbols}}).',
password_rejection: 'Rejet du mot de passe',
compromised_passwords: 'Mots de passe compromis',
breached_passwords: 'Mots de passe compromis',
breached_passwords_description:
'Rejeter les mots de passe précédemment trouvés dans les bases de données de violation.',
restricted_phrases: 'Restreindre les phrases à faible sécurité',
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: 'E.g., "AAAA", "1234", and "abcd".',
/** UNTRANSLATED */
user_information: 'User information',
/** UNTRANSLATED */
user_information_description: 'E.g., email address, phone number, username, etc.',
/** UNTRANSLATED */
custom_words: 'Custom words',
/** UNTRANSLATED */
'Votre mot de passe devrait éviter ces phrases à moins que vous ne les combiniez avec 3 caractères supplémentaires ou plus.',
repetitive_or_sequential_characters: 'Caractères répétitifs ou séquentiels',
repetitive_or_sequential_characters_description: 'Par exemple, "AAAA", "1234" et "abcd".',
user_information: 'Informations utilisateur',
user_information_description:
"Par exemple, adresse e-mail, numéro de téléphone, nom d'utilisateur, etc.",
custom_words: 'Mots personnalisés',
custom_words_description:
'Personalize context-specific words, case-insensitive, and one per line.',
/** UNTRANSLATED */
custom_words_placeholder: 'Your service name, company name, etc.',
'Personnalisez les mots spécifiques au contexte, sans distinction de casse, un par ligne.',
custom_words_placeholder: 'Nom de votre service, nom de votre entreprise, etc.',
};
export default Object.freeze(password_policy);

View file

@ -8,62 +8,59 @@ const sign_up_and_sign_in = {
or: 'ou',
sign_up: {
title: 'INSCRIPTION',
sign_up_identifier: 'Identificateur dinscription',
sign_up_identifier: "Identificateur d'inscription",
identifier_description:
'Lidentificateur dinscription est nécessaire pour la création de compte et doit être inclus dans vote écran de connexion.',
sign_up_authentication: 'Paramètres dauthentification pour linscription',
"L'identificateur d'inscription est nécessaire pour la création de compte et doit être inclus dans vote écran de connexion.",
sign_up_authentication: "Paramètres d'authentification pour l'inscription",
authentication_description:
'Toutes les actions sélectionnées seront obligatoires pour que les utilisateurs terminent le processus dinscription.',
"Toutes les actions sélectionnées seront obligatoires pour que les utilisateurs terminent le processus d'inscription.",
set_a_password_option: 'Créer votre mot de passe',
verify_at_sign_up_option: 'Vérifier lors de linscription',
verify_at_sign_up_option: "Vérifier lors de l'inscription",
social_only_creation_description:
'(Ceci sapplique à la création de compte uniquement via un réseau social)',
"(Ceci s'applique à la création de compte uniquement via un réseau social)",
},
sign_in: {
title: 'CONNEXION',
sign_in_identifier_and_auth:
'Identificateurs et paramètres dauthentification pour la connexion',
"Identificateurs et paramètres d'authentification pour la connexion",
description:
'Les utilisateurs peuvent se connecter en utilisant nimporte quelle option disponible. Ajustez la mise en page en faisant glisser et en déposant les options ci-dessous.',
"Les utilisateurs peuvent se connecter en utilisant n'importe quelle option disponible. Ajustez la mise en page en faisant glisser et en déposant les options ci-dessous.",
add_sign_in_method: 'Ajouter une méthode de connexion',
password_auth: 'Mot de passe',
verification_code_auth: 'Code de vérification',
auth_swap_tip:
'Echangez les options ci-dessous pour déterminer celle qui apparait en premier dans le processus.',
require_auth_factor: 'Vous devez sélectionner au moins un élément dauthentification.',
require_auth_factor: "Vous devez sélectionner au moins un élément d'authentification.",
},
social_sign_in: {
title: 'CONNEXION VIA RÉSEAU SOCIAL',
social_sign_in: 'Connexion via réseau social',
description:
'Selon lidentificateur obligatoire que vous avez mis en place, votre utilisateur peut être invité à fournir un identificateur lors de linscription via un réseau social.',
"Selon l'identificateur obligatoire que vous avez mis en place, votre utilisateur peut être invité à fournir un identificateur lors de l'inscription via un réseau social.",
add_social_connector: 'Ajouter un connecteur social',
set_up_hint: {
not_in_list: 'Pas dans la liste?',
set_up_more: 'Configurer',
go_to: 'dautres connecteurs sociaux maintenant.',
go_to: "d'autres connecteurs sociaux maintenant.",
},
},
tip: {
set_a_password:
'Un ensemble unique de mot de passe pour votre nom dutilisateur est essentiel.',
"Un ensemble unique de mot de passe pour votre nom d'utilisateur est essentiel.",
verify_at_sign_up:
'Nous ne prenons actuellement en charge que les adresses e-mail vérifiée. Votre base utilisateur peut contenir un grand nombre dadresses e-mail de mauvaise qualité sil ny a pas de validation.',
"Nous ne prenons actuellement en charge que les adresses e-mail vérifiée. Votre base utilisateur peut contenir un grand nombre d'adresses e-mail de mauvaise qualité s'il n'y a pas de validation.",
password_auth:
'Ceci est essentiel car vous avez activé loption de configuration dun mot de passe au cours du processus dinscription.',
"Ceci est essentiel car vous avez activé l'option de configuration d'un mot de passe au cours du processus d'inscription.",
verification_code_auth:
'Ceci est essentiel car vous avez uniquement activé loption de fourniture dun code de vérification lors de linscription. Vous pouvez décocher la case lorsque la configuration dun mot de passe est autorisée lors du processus dinscription.',
"Ceci est essentiel car vous avez uniquement activé l'option de fourniture d'un code de vérification lors de l'inscription. Vous pouvez décocher la case lorsque la configuration d'un mot de passe est autorisée lors du processus d'inscription.",
delete_sign_in_method:
'Ceci est essentiel car vous avez sélectionné {{identifier}} comme identificateur requis.',
},
advanced_options: {
/** UNTRANSLATED */
title: 'ADVANCED OPTIONS',
/** UNTRANSLATED */
enable_user_registration: 'Enable user registration',
/** UNTRANSLATED */
title: 'OPTIONS AVANCÉES',
enable_user_registration: "Activer l'inscription des utilisateurs",
enable_user_registration_description:
'Enable or disallow user registration. Once disabled, users can still be added in the admin console but users can no longer establish accounts through the sign-in UI.',
"Activer ou interdire l'inscription des utilisateurs. Une fois désactivée, les utilisateurs peuvent toujours être ajoutés à la console d'administration mais ne peuvent plus créer de compte via l'interface de connexion.",
},
};

View file

@ -1,87 +0,0 @@
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Mettre à niveau le plan',
compare_plans: 'Comparer les plans',
get_started: {
title: "Commencez votre parcours d'identité fluide avec un plan gratuit!",
description:
"Le plan gratuit est parfait pour essayer Logto sur vos projets personnels ou vos essais. Pour tirer pleinement parti des fonctionnalités de Logto pour votre équipe, passez à un abonnement payant pour bénéficier d'un accès illimité aux fonctionnalités premium : utilisation illimitée des MAU, intégration machine à machine, gestion des RBAC, journaux d'audit à long terme, etc. <a>Voir tous les plans</a>",
},
create_tenant: {
title: 'Sélectionnez votre plan pour le locataire',
description:
'Logto propose des options de plan compétitives avec une tarification innovante et abordable conçue pour les entreprises en croissance. <a>En savoir plus</a>',
base_price: 'Prix de base',
monthly_price: '{{value, number}}/mois',
mau_unit_price: 'Prix unitaire MAU',
view_all_features: 'Voir toutes les fonctionnalités',
select_plan: 'Sélectionnez <name/>',
free_tenants_limit: "Jusqu'à {{count, number}} locataire gratuit",
free_tenants_limit_other: "Jusqu'à {{count, number}} locataires gratuits",
most_popular: 'Le plus populaire',
upgrade_success: 'Passage réussi à <name/>',
},
paywall: {
applications:
"Limite de {{count, number}} application de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
applications_other:
"Limite de {{count, number}} applications de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine_feature:
"Passez à un abonnement payant pour créer des applications de machine à machine, ainsi que pour accéder à toutes les fonctionnalités premium. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine:
"Limite de {{count, number}} application de machine à machine de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine_other:
"Limite de {{count, number}} applications de machine à machine de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
resources:
'Vous avez atteint la limite de {{count, number}} ressource API de <planName/>. Mettez à niveau votre plan pour répondre aux besoins de votre équipe. <a>Contactez-nous</a> pour toute assistance.',
resources_other:
'Vous avez atteint la limite de {{count, number}} ressources API de <planName/>. Mettez à niveau votre plan pour répondre aux besoins de votre équipe. <a>Contactez-nous</a> pour toute assistance.',
scopes_per_resource:
'Vous avez atteint la limite de {{count, number}} permission par ressource API de <planName/>. Mettez à niveau maintenant pour étendre. <a>Contactez-nous</a> pour toute assistance.',
scopes_per_resource_other:
'Vous avez atteint la limite de {{count, number}} permissions par ressource API de <planName/>. Mettez à niveau maintenant pour étendre. <a>Contactez-nous</a> pour toute assistance.',
custom_domain:
"Déverrouillez la fonctionnalité de domaine personnalisé et une gamme d'avantages premium en passant à un plan payant. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
social_connectors:
"Vous avez atteint la limite de {{count, number}} connecteur social de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
social_connectors_other:
"Vous avez atteint la limite de {{count, number}} connecteurs sociaux de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_feature:
"Mettez à niveau vers un plan payant pour créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML, ainsi qu'un accès illimité aux connecteurs sociaux et à toutes les fonctionnalités premium. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors:
"Vous avez atteint la limite de {{count, number}} connecteur social de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_other:
"Vous avez atteint la limite de {{count, number}} connecteurs sociaux de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_pro:
"Vous avez atteint la limite de {{count, number}} connecteur standard de <planName/>. Pour répondre aux besoins de votre équipe, passez au plan Entreprise pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_pro_other:
"Vous avez atteint la limite de {{count, number}} connecteurs standard de <planName/>. Pour répondre aux besoins de votre équipe, passez au plan Entreprise pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
roles:
"Vous avez atteint la limite de {{count, number}} rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
roles_other:
"Vous avez atteint la limite de {{count, number}} rôles de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
scopes_per_role:
"Vous avez atteint la limite de {{count, number}} permission par rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
scopes_per_role_other:
"Vous avez atteint la limite de {{count, number}} permissions par rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
hooks:
"Vous avez atteint la limite de {{count, number}} webhook de <planName/>. Mettez à niveau votre plan pour créer plus de webhooks. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
hooks_other:
"Vous avez atteint la limite de {{count, number}} webhooks de <planName/>. Mettez à niveau votre plan pour créer plus de webhooks. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
},
mau_exceeded_modal: {
title: 'La limite de MAU a été dépassée. Mettez à niveau votre plan.',
notification:
'Votre MAU actuel a dépassé la limite de <planName/>. Veuillez mettre à niveau votre plan pour passer à la version premium rapidement et éviter la suspension du service Logto.',
update_plan: 'Mettre à jour le plan',
},
payment_overdue_modal: {
title: 'Paiement de facture en retard',
notification:
'Oups ! Le paiement de la facture du locataire <span>{{name}}</span> a échoué. Veuillez payer la facture rapidement pour éviter la suspension du service Logto.',
unpaid_bills: 'Factures impayées',
update_payment: 'Mettre à jour le paiement',
},
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,42 @@
import paywall from './paywall.js';
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Mettre à niveau le plan',
compare_plans: 'Comparer les plans',
get_started: {
title: "Commencez votre parcours d'identité fluide avec un plan gratuit!",
description:
"Le plan gratuit est parfait pour essayer Logto sur vos projets personnels ou vos essais. Pour tirer pleinement parti des fonctionnalités de Logto pour votre équipe, passez à un abonnement payant pour bénéficier d'un accès illimité aux fonctionnalités premium : utilisation illimitée des MAU, intégration machine à machine, gestion des RBAC, journaux d'audit à long terme, etc. <a>Voir tous les plans</a>",
},
create_tenant: {
title: 'Sélectionnez votre plan pour le locataire',
description:
'Logto propose des options de plan compétitives avec une tarification innovante et abordable conçue pour les entreprises en croissance. <a>En savoir plus</a>',
base_price: 'Prix de base',
monthly_price: '{{value, number}}/mois',
mau_unit_price: 'Prix unitaire MAU',
view_all_features: 'Voir toutes les fonctionnalités',
select_plan: 'Sélectionnez <name/>',
free_tenants_limit: "Jusqu'à {{count, number}} locataire gratuit",
free_tenants_limit_other: "Jusqu'à {{count, number}} locataires gratuits",
most_popular: 'Le plus populaire',
upgrade_success: 'Passage réussi à <name/>',
},
mau_exceeded_modal: {
title: 'La limite de MAU a été dépassée. Mettez à niveau votre plan.',
notification:
'Votre MAU actuel a dépassé la limite de <planName/>. Veuillez mettre à niveau votre plan pour passer à la version premium rapidement et éviter la suspension du service Logto.',
update_plan: 'Mettre à jour le plan',
},
payment_overdue_modal: {
title: 'Paiement de facture en retard',
notification:
'Oups ! Le paiement de la facture du locataire <span>{{name}}</span> a échoué. Veuillez payer la facture rapidement pour éviter la suspension du service Logto.',
unpaid_bills: 'Factures impayées',
update_payment: 'Mettre à jour le paiement',
},
paywall,
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,50 @@
const paywall = {
applications:
"Limite de {{count, number}} application de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
applications_other:
"Limite de {{count, number}} applications de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine_feature:
"Passez à un abonnement payant pour créer des applications de machine à machine, ainsi que pour accéder à toutes les fonctionnalités premium. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine:
"Limite de {{count, number}} application de machine à machine de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
machine_to_machine_other:
"Limite de {{count, number}} applications de machine à machine de <planName/> atteinte. Mettez à niveau le plan pour répondre aux besoins de votre équipe. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
resources:
'Vous avez atteint la limite de {{count, number}} ressource API de <planName/>. Mettez à niveau votre plan pour répondre aux besoins de votre équipe. <a>Contactez-nous</a> pour toute assistance.',
resources_other:
'Vous avez atteint la limite de {{count, number}} ressources API de <planName/>. Mettez à niveau votre plan pour répondre aux besoins de votre équipe. <a>Contactez-nous</a> pour toute assistance.',
scopes_per_resource:
'Vous avez atteint la limite de {{count, number}} permission par ressource API de <planName/>. Mettez à niveau maintenant pour étendre. <a>Contactez-nous</a> pour toute assistance.',
scopes_per_resource_other:
'Vous avez atteint la limite de {{count, number}} permissions par ressource API de <planName/>. Mettez à niveau maintenant pour étendre. <a>Contactez-nous</a> pour toute assistance.',
custom_domain:
"Déverrouillez la fonctionnalité de domaine personnalisé et une gamme d'avantages premium en passant à un plan payant. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
social_connectors:
"Vous avez atteint la limite de {{count, number}} connecteur social de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
social_connectors_other:
"Vous avez atteint la limite de {{count, number}} connecteurs sociaux de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_feature:
"Mettez à niveau vers un plan payant pour créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML, ainsi qu'un accès illimité aux connecteurs sociaux et à toutes les fonctionnalités premium. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors:
"Vous avez atteint la limite de {{count, number}} connecteur social de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_other:
"Vous avez atteint la limite de {{count, number}} connecteurs sociaux de <planName/>. Pour répondre aux besoins de votre équipe, passez à un plan supérieur pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_pro:
"Vous avez atteint la limite de {{count, number}} connecteur standard de <planName/>. Pour répondre aux besoins de votre équipe, passez au plan Entreprise pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
standard_connectors_pro_other:
"Vous avez atteint la limite de {{count, number}} connecteurs standard de <planName/>. Pour répondre aux besoins de votre équipe, passez au plan Entreprise pour obtenir des connecteurs sociaux supplémentaires et la possibilité de créer vos propres connecteurs en utilisant les protocoles OIDC, OAuth 2.0 et SAML. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
roles:
"Vous avez atteint la limite de {{count, number}} rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
roles_other:
"Vous avez atteint la limite de {{count, number}} rôles de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
scopes_per_role:
"Vous avez atteint la limite de {{count, number}} permission par rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
scopes_per_role_other:
"Vous avez atteint la limite de {{count, number}} permissions par rôle de <planName/>. Mettez à niveau votre plan pour ajouter des rôles et des permissions supplémentaires. Pour toute assistance, n'hésitez pas à <a>nous contacter</a>.",
hooks:
"Vous avez atteint la limite de {{count, number}} webhook de <planName/>. Mettez à niveau votre plan pour créer plus de webhooks. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
hooks_other:
"Vous avez atteint la limite de {{count, number}} webhooks de <planName/>. Mettez à niveau votre plan pour créer plus de webhooks. N'hésitez pas à <a>nous contacter</a> si vous avez besoin d'aide.",
};
export default Object.freeze(paywall);

View file

@ -1,8 +1,8 @@
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 if your password meets the requirements.',
rejected:
'La password è stata rifiutata. Per favore verifica se la tua password soddisfa i requisiti.',
};
export default Object.freeze(password);

View file

@ -18,10 +18,8 @@ const sign_in_experiences = {
'Il metodo di accesso con codice di verifica deve essere abilitato quando non è richiesta una password nella registrazione.',
unsupported_default_language: 'Questa lingua - {{language}} non è supportata al momento.',
at_least_one_authentication_factor: 'Devi selezionare almeno un fattore di autenticazione.',
/** UNTRANSLATED */
backup_code_cannot_be_enabled_alone: 'Backup code cannot be enabled alone.',
/** UNTRANSLATED */
duplicated_mfa_factors: 'Duplicated MFA factors.',
backup_code_cannot_be_enabled_alone: 'Il codice di backup non può essere abilitato da solo.',
duplicated_mfa_factors: 'Fattori MFA duplicati.',
};
export default Object.freeze(sign_in_experiences);

View file

@ -28,7 +28,7 @@ import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import tenants from './tenants.js';
import topbar from './topbar.js';
import upsell from './upsell.js';
import upsell from './upsell/index.js';
import user_details from './user-details.js';
import users from './users.js';
import webhook_details from './webhook-details.js';

View file

@ -11,8 +11,7 @@ const sign_in_exp = {
branding: 'Marchio',
sign_up_and_sign_in: 'Registrazione e accesso',
content: 'Contenuto',
/** UNTRANSLATED */
password_policy: 'Password policy',
password_policy: 'Politica sulla password',
},
welcome: {
title: "Personalizza l'esperienza di accesso",

View file

@ -1,45 +1,28 @@
const password_policy = {
/** UNTRANSLATED */
password_requirements: 'Password requirements',
/** UNTRANSLATED */
minimum_length: 'Minimum length',
/** UNTRANSLATED */
minimum_length_description: 'NIST suggests using <a>at least 8 characters</a> for web products.',
/** UNTRANSLATED */
minimum_length_error: 'Minimum length must be between {{min}} and {{max}} (inclusive).',
/** UNTRANSLATED */
minimum_required_char_types: 'Minimum required character types',
/** UNTRANSLATED */
password_requirements: 'Requisiti per la password',
minimum_length: 'Lunghezza minima',
minimum_length_description: 'NIST consiglia di utilizzare almeno 8 caratteri per i prodotti web.',
minimum_length_error: 'La lunghezza minima deve essere compresa tra {{min}} e {{max}} (inclusi).',
minimum_required_char_types: 'Tipi di caratteri minimi richiesti',
minimum_required_char_types_description:
'Character types: uppercase (A-Z), lowercase (a-z), numbers (0-9), and special symbols ({{symbols}}).',
/** UNTRANSLATED */
password_rejection: 'Password rejection',
/** UNTRANSLATED */
compromised_passwords: 'Reject compromised password',
/** UNTRANSLATED */
breached_passwords: 'Breached passwords',
/** UNTRANSLATED */
breached_passwords_description: 'Reject passwords previously found in breach databases.',
/** UNTRANSLATED */
restricted_phrases: 'Restrict low-security phrases',
/** UNTRANSLATED */
'Tipi di caratteri: maiuscole (A-Z), minuscole (a-z), numeri (0-9) e simboli speciali ({{symbols}}).',
password_rejection: 'Rifiuto password',
compromised_passwords: 'Rifiuta password compromesse',
breached_passwords: 'Password violate',
breached_passwords_description:
'Rifiuta password trovate in precedenza nei database delle violazioni.',
restricted_phrases: 'Limita frasi poco sicure',
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: 'E.g., "AAAA", "1234", and "abcd".',
/** UNTRANSLATED */
user_information: 'User information',
/** UNTRANSLATED */
user_information_description: 'E.g., email address, phone number, username, etc.',
/** UNTRANSLATED */
custom_words: 'Custom words',
/** UNTRANSLATED */
'La tua password dovrebbe evitare queste frasi a meno che non le combiniate con 3 o più caratteri extra.',
repetitive_or_sequential_characters: 'Caratteri ripetitivi o sequenziali',
repetitive_or_sequential_characters_description: 'Ad esempio, "AAAA", "1234" e "abcd".',
user_information: 'Informazioni utente',
user_information_description:
'Ad esempio, indirizzo email, numero di telefono, nome utente, ecc.',
custom_words: 'Parole personalizzate',
custom_words_description:
'Personalize context-specific words, case-insensitive, and one per line.',
/** UNTRANSLATED */
custom_words_placeholder: 'Your service name, company name, etc.',
'Personalizza parole specifiche del contesto, non case-sensitive, una per riga.',
custom_words_placeholder: "Nome del tuo servizio, nome dell'azienda, ecc.",
};
export default Object.freeze(password_policy);

View file

@ -54,13 +54,10 @@ const sign_up_and_sign_in = {
'Questo è essenziale in quanto hai selezionato {{identifier}} come identificatore obbligatorio.',
},
advanced_options: {
/** UNTRANSLATED */
title: 'ADVANCED OPTIONS',
/** UNTRANSLATED */
enable_user_registration: 'Enable user registration',
/** UNTRANSLATED */
title: 'OPZIONI AVANZATE',
enable_user_registration: 'Abilita registrazione utente',
enable_user_registration_description:
'Enable or disallow user registration. Once disabled, users can still be added in the admin console but users can no longer establish accounts through the sign-in UI.',
"Abilita o disabilita la registrazione degli utenti. Una volta disabilitata, gli utenti possono comunque essere aggiunti nella console di amministrazione, ma gli utenti non possono più creare account tramite l'interfaccia di accesso.",
},
};

View file

@ -1,87 +0,0 @@
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Aggiorna piano',
compare_plans: 'Confronta i piani',
get_started: {
title: 'Inizia il tuo percorso di identità senza interruzioni con un piano gratuito!',
description:
"Il piano gratuito è perfetto per provare Logto nei tuoi progetti personali o test. Per sfruttare al massimo le capacità di Logto per il tuo team, esegui l'upgrade per ottenere l'accesso illimitato alle funzionalità premium: utilizzo illimitato di MAU, integrazione da macchina a macchina, gestione RBAC, registri di audit a lungo termine, ecc. <a>Visualizza tutti i piani</a>",
},
create_tenant: {
title: 'Seleziona il piano del tenant',
description:
'Logto offre opzioni competitive di piani con una struttura dei prezzi innovativa e conveniente progettata per le aziende in crescita. <a>Scopri di più</a>',
base_price: 'Prezzo base',
monthly_price: '{{value, number}}/mese',
mau_unit_price: 'Prezzo unitario MAU',
view_all_features: 'Visualizza tutte le funzionalità',
select_plan: 'Seleziona <name/>',
free_tenants_limit: 'Fino a {{count, number}} tenant gratuito',
free_tenants_limit_other: 'Fino a {{count, number}} tenant gratuiti',
most_popular: 'Più popolare',
upgrade_success: 'Aggiornamento a <name/> effettuato con successo',
},
paywall: {
applications:
'Limite di {{count, number}} applicazione di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
applications_other:
'Limite di {{count, number}} applicazioni di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine_feature:
'Aggiorna a un piano a pagamento per creare applicazioni machine-to-machine e accedere a tutte le funzionalità premium. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine:
'Limite di {{count, number}} applicazione machine-to-machine di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine_other:
'Limite di {{count, number}} applicazioni machine-to-machine di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
resources:
'Hai raggiunto il limite di {{count, number}} risorse API di <planName/>. Aggiorna il piano per soddisfare le esigenze del tuo team. <a>Contattaci</a> per qualsiasi assistenza.',
resources_other:
'Hai raggiunto il limite di {{count, number}} risorse API di <planName/>. Aggiorna il piano per soddisfare le esigenze del tuo team. <a>Contattaci</a> per qualsiasi assistenza.',
scopes_per_resource:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per risorsa API di <planName/>. Aggiorna ora per espanderlo. <a>Contattaci</a> per qualsiasi assistenza.',
scopes_per_resource_other:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per risorsa API di <planName/>. Aggiorna ora per espanderlo. <a>Contattaci</a> per qualsiasi assistenza.',
custom_domain:
'Sblocca la funzionalità di dominio personalizzato e una serie di vantaggi premium passando a un piano a pagamento. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
social_connectors:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
social_connectors_other:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_feature:
'Aggiorna a un piano a pagamento per creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML, oltre a ottenere connettori sociali illimitati e tutte le funzionalità premium. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_other:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_pro:
'Hai raggiunto il limite di {{count, number}} connettori standard di <planName/>. Passa al piano Enterprise per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_pro_other:
'Hai raggiunto il limite di {{count, number}} connettori standard di <planName/>. Passa al piano Enterprise per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
roles:
'Hai raggiunto il limite di {{count, number}} ruoli di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
roles_other:
'Hai raggiunto il limite di {{count, number}} ruoli di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
scopes_per_role:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per ruolo di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
scopes_per_role_other:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per ruolo di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
hooks:
'Hai raggiunto il limite di {{count, number}} webhook di <planName/>. Aggiorna il piano per creare altri webhook. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
hooks_other:
'Hai raggiunto il limite di {{count, number}} webhook di <planName/>. Aggiorna il piano per creare altri webhook. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
},
mau_exceeded_modal: {
title: 'MAU ha superato il limite. Aggiorna il tuo piano.',
notification:
'Il tuo MAU attuale ha superato il limite di <planName/>. Aggiorna al piano premium tempestivamente per evitare la sospensione del servizio Logto.',
update_plan: 'Aggiorna piano',
},
payment_overdue_modal: {
title: 'Pagamento della fattura in ritardo',
notification:
"Oops! Il pagamento della fattura dell'affittuario <span>{{name}}</span> è fallito. Si prega di pagare tempestivamente la fattura per evitare la sospensione del servizio Logto.",
unpaid_bills: 'Fatture non pagate',
update_payment: 'Aggiorna pagamento',
},
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,42 @@
import paywall from './paywall.js';
const upsell = {
pro_tag: 'PRO',
upgrade_plan: 'Aggiorna piano',
compare_plans: 'Confronta i piani',
get_started: {
title: 'Inizia il tuo percorso di identità senza interruzioni con un piano gratuito!',
description:
"Il piano gratuito è perfetto per provare Logto nei tuoi progetti personali o test. Per sfruttare al massimo le capacità di Logto per il tuo team, esegui l'upgrade per ottenere l'accesso illimitato alle funzionalità premium: utilizzo illimitato di MAU, integrazione da macchina a macchina, gestione RBAC, registri di audit a lungo termine, ecc. <a>Visualizza tutti i piani</a>",
},
create_tenant: {
title: 'Seleziona il piano del tenant',
description:
'Logto offre opzioni competitive di piani con una struttura dei prezzi innovativa e conveniente progettata per le aziende in crescita. <a>Scopri di più</a>',
base_price: 'Prezzo base',
monthly_price: '{{value, number}}/mese',
mau_unit_price: 'Prezzo unitario MAU',
view_all_features: 'Visualizza tutte le funzionalità',
select_plan: 'Seleziona <name/>',
free_tenants_limit: 'Fino a {{count, number}} tenant gratuito',
free_tenants_limit_other: 'Fino a {{count, number}} tenant gratuiti',
most_popular: 'Più popolare',
upgrade_success: 'Aggiornamento a <name/> effettuato con successo',
},
mau_exceeded_modal: {
title: 'MAU ha superato il limite. Aggiorna il tuo piano.',
notification:
'Il tuo MAU attuale ha superato il limite di <planName/>. Aggiorna al piano premium tempestivamente per evitare la sospensione del servizio Logto.',
update_plan: 'Aggiorna piano',
},
payment_overdue_modal: {
title: 'Pagamento della fattura in ritardo',
notification:
"Oops! Il pagamento della fattura dell'affittuario <span>{{name}}</span> è fallito. Si prega di pagare tempestivamente la fattura per evitare la sospensione del servizio Logto.",
unpaid_bills: 'Fatture non pagate',
update_payment: 'Aggiorna pagamento',
},
paywall,
};
export default Object.freeze(upsell);

View file

@ -0,0 +1,50 @@
const paywall = {
applications:
'Limite di {{count, number}} applicazione di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
applications_other:
'Limite di {{count, number}} applicazioni di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine_feature:
'Aggiorna a un piano a pagamento per creare applicazioni machine-to-machine e accedere a tutte le funzionalità premium. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine:
'Limite di {{count, number}} applicazione machine-to-machine di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
machine_to_machine_other:
'Limite di {{count, number}} applicazioni machine-to-machine di <planName/> raggiunto. Aggiorna il piano per soddisfare le esigenze del tuo team. Per qualsiasi assistenza, non esitare a <a>contattarci</a>.',
resources:
'Hai raggiunto il limite di {{count, number}} risorse API di <planName/>. Aggiorna il piano per soddisfare le esigenze del tuo team. <a>Contattaci</a> per qualsiasi assistenza.',
resources_other:
'Hai raggiunto il limite di {{count, number}} risorse API di <planName/>. Aggiorna il piano per soddisfare le esigenze del tuo team. <a>Contattaci</a> per qualsiasi assistenza.',
scopes_per_resource:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per risorsa API di <planName/>. Aggiorna ora per espanderlo. <a>Contattaci</a> per qualsiasi assistenza.',
scopes_per_resource_other:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per risorsa API di <planName/>. Aggiorna ora per espanderlo. <a>Contattaci</a> per qualsiasi assistenza.',
custom_domain:
'Sblocca la funzionalità di dominio personalizzato e una serie di vantaggi premium passando a un piano a pagamento. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
social_connectors:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
social_connectors_other:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_feature:
'Aggiorna a un piano a pagamento per creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML, oltre a ottenere connettori sociali illimitati e tutte le funzionalità premium. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_other:
'Hai raggiunto il limite di {{count, number}} connettori sociali di <planName/>. Passa al piano per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_pro:
'Hai raggiunto il limite di {{count, number}} connettori standard di <planName/>. Passa al piano Enterprise per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
standard_connectors_pro_other:
'Hai raggiunto il limite di {{count, number}} connettori standard di <planName/>. Passa al piano Enterprise per ottenere connettori sociali aggiuntivi e la possibilità di creare i tuoi connettori utilizzando i protocolli OIDC, OAuth 2.0 e SAML. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
roles:
'Hai raggiunto il limite di {{count, number}} ruoli di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
roles_other:
'Hai raggiunto il limite di {{count, number}} ruoli di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
scopes_per_role:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per ruolo di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
scopes_per_role_other:
'Hai raggiunto il limite di {{count, number}} autorizzazioni per ruolo di <planName/>. Aggiorna il piano per aggiungere ruoli e autorizzazioni aggiuntive. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
hooks:
'Hai raggiunto il limite di {{count, number}} webhook di <planName/>. Aggiorna il piano per creare altri webhook. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
hooks_other:
'Hai raggiunto il limite di {{count, number}} webhook di <planName/>. Aggiorna il piano per creare altri webhook. Non esitare a <a>contattarci</a> se hai bisogno di assistenza.',
};
export default Object.freeze(paywall);

Some files were not shown because too many files have changed in this diff Show more