Merge pull request #1 from sovetski/copilot/add-default-translations-i18n

feat(i18n): add built-in translations for 22 languages
This commit is contained in:
Ahliman HUSEYNOV
2026-04-13 21:13:48 +02:00
committed by GitHub
28 changed files with 1277 additions and 2 deletions

View File

@@ -1,6 +1,6 @@
# Better Auth i18n Plugin
Internationalization plugin for [Better Auth](https://www.better-auth.com) — translate error messages and UI strings.
Internationalization plugin for [Better Auth](https://www.better-auth.com) — translate error messages based on the detected locale.
## Installation
@@ -8,6 +8,109 @@ Internationalization plugin for [Better Auth](https://www.better-auth.com) — t
npm install @better-auth/i18n
```
## Built-in translations
The package ships with ready-to-use translations for 22 languages:
| Code | Language |
|------|-----------|
| `ar` | Arabic |
| `bn` | Bengali |
| `de` | German |
| `en` | English |
| `es` | Spanish |
| `fa` | Persian (Farsi) |
| `fr` | French |
| `hi` | Hindi |
| `id` | Indonesian |
| `it` | Italian |
| `ja` | Japanese |
| `ko` | Korean |
| `nl` | Dutch |
| `pl` | Polish |
| `pt` | Portuguese |
| `ru` | Russian |
| `sv` | Swedish |
| `th` | Thai |
| `tr` | Turkish |
| `uk` | Ukrainian |
| `vi` | Vietnamese |
| `zh` | Chinese (Simplified) |
### Use all built-in locales
```ts
import { betterAuth } from "better-auth";
import { i18n, locales } from "@better-auth/i18n";
export const auth = betterAuth({
plugins: [
i18n({ translations: locales }),
],
});
```
### Use a subset of locales
```ts
import { i18n, locales } from "@better-auth/i18n";
export const auth = betterAuth({
plugins: [
i18n({
translations: {
en: locales.en,
fr: locales.fr,
},
}),
],
});
```
### Override specific messages
```ts
import { i18n, locales } from "@better-auth/i18n";
export const auth = betterAuth({
plugins: [
i18n({
translations: {
...locales,
fr: {
...locales.fr,
USER_NOT_FOUND: "Membre introuvable",
},
},
}),
],
});
```
### Add a custom locale
```ts
import { i18n, locales } from "@better-auth/i18n";
import type { TranslationDictionary } from "@better-auth/i18n";
const myLocale: TranslationDictionary = {
USER_NOT_FOUND: "...",
INVALID_EMAIL_OR_PASSWORD: "...",
// ... other error codes
};
export const auth = betterAuth({
plugins: [
i18n({
translations: {
...locales,
xx: myLocale,
},
}),
],
});
```
## Documentation
For full documentation, visit [better-auth.com/docs/plugins/i18n](https://www.better-auth.com/docs/plugins/i18n).

View File

@@ -46,6 +46,11 @@
"dev-source": "./src/client.ts",
"types": "./dist/client.d.mts",
"default": "./dist/client.mjs"
},
"./locales": {
"dev-source": "./src/locales/index.ts",
"types": "./dist/locales/index.d.mts",
"default": "./dist/locales/index.mjs"
}
},
"typesVersions": {
@@ -55,6 +60,9 @@
],
"client": [
"./dist/client.d.mts"
],
"locales": [
"./dist/locales/index.d.mts"
]
}
},

View File

@@ -1,6 +1,7 @@
import { getTestInstance } from "better-auth/test";
import { describe, expect, it } from "vitest";
import { i18n } from ".";
import * as locales from "./locales";
const translations = {
en: {
@@ -374,4 +375,99 @@ describe("i18n plugin", async () => {
}).toThrow("i18n plugin: translations object is empty");
});
});
describe("built-in locales", () => {
it("should export all expected built-in locales", () => {
const expectedLocales = [
"ar",
"bn",
"de",
"en",
"es",
"fa",
"fr",
"hi",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"pt",
"ru",
"sv",
"th",
"tr",
"uk",
"vi",
"zh",
];
for (const locale of expectedLocales) {
expect(locales).toHaveProperty(locale);
expect(
typeof (locales as Record<string, unknown>)[locale],
).toBe("object");
}
});
it("should translate errors using built-in locales", async () => {
const { auth: authWithBuiltInLocales } = await getTestInstance({
plugins: [
i18n({
translations: locales,
defaultLocale: "en",
detection: ["header"],
}),
],
});
const response = await authWithBuiltInLocales.api.signInEmail({
body: {
email: "nonexistent@example.com",
password: "wrongpassword",
},
headers: {
"Accept-Language": "fr",
},
asResponse: true,
});
const body = await response.json();
expect(body.code).toBe("INVALID_EMAIL_OR_PASSWORD");
expect(body.message).toBe(locales.fr.INVALID_EMAIL_OR_PASSWORD);
});
it("should contain common error codes in every built-in locale", () => {
const requiredKeys = [
"USER_NOT_FOUND",
"INVALID_PASSWORD",
"INVALID_EMAIL",
"INVALID_EMAIL_OR_PASSWORD",
"EMAIL_NOT_VERIFIED",
"PASSWORD_TOO_SHORT",
"PASSWORD_TOO_LONG",
"USER_ALREADY_EXISTS",
"SESSION_EXPIRED",
"ACCOUNT_NOT_FOUND",
];
for (const [locale, dict] of Object.entries(locales)) {
for (const key of requiredKeys) {
expect(
dict,
`Locale "${locale}" is missing key "${key}"`,
).toHaveProperty(key);
expect(
typeof (dict as Record<string, unknown>)[key],
`Locale "${locale}" key "${key}" must be a non-empty string`,
).toBe("string");
expect(
(dict as Record<string, string>)[key].length,
`Locale "${locale}" key "${key}" must not be empty`,
).toBeGreaterThan(0);
}
}
});
});
});

View File

@@ -13,6 +13,8 @@ export type {
TranslationDictionary,
} from "./types";
export * as locales from "./locales";
declare module "@better-auth/core" {
interface BetterAuthPluginRegistry<AuthOptions, Options> {
i18n: {

View File

@@ -0,0 +1,43 @@
import type { TranslationDictionary } from "../types";
/**
* Arabic translations
*/
export const ar: TranslationDictionary = {
USER_NOT_FOUND: "المستخدم غير موجود",
FAILED_TO_CREATE_USER: "فشل في إنشاء المستخدم",
FAILED_TO_CREATE_SESSION: "فشل في إنشاء الجلسة",
FAILED_TO_UPDATE_USER: "فشل في تحديث المستخدم",
FAILED_TO_GET_SESSION: "فشل في الحصول على الجلسة",
INVALID_PASSWORD: "كلمة المرور غير صالحة",
INVALID_EMAIL: "البريد الإلكتروني غير صالح",
INVALID_EMAIL_OR_PASSWORD: "البريد الإلكتروني أو كلمة المرور غير صالحة",
INVALID_USER: "مستخدم غير صالح",
SOCIAL_ACCOUNT_ALREADY_LINKED: "الحساب الاجتماعي مرتبط بالفعل",
PROVIDER_NOT_FOUND: "مزود الخدمة غير موجود",
INVALID_TOKEN: "الرمز المميز غير صالح",
TOKEN_EXPIRED: "انتهت صلاحية الرمز المميز",
FAILED_TO_GET_USER_INFO: "فشل في الحصول على معلومات المستخدم",
USER_EMAIL_NOT_FOUND: "بريد المستخدم الإلكتروني غير موجود",
EMAIL_NOT_VERIFIED: "البريد الإلكتروني غير مُحقق",
PASSWORD_TOO_SHORT: "كلمة المرور قصيرة جداً",
PASSWORD_TOO_LONG: "كلمة المرور طويلة جداً",
USER_ALREADY_EXISTS: "المستخدم موجود بالفعل",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"المستخدم موجود بالفعل. استخدم بريداً إلكترونياً آخر.",
EMAIL_CAN_NOT_BE_UPDATED: "لا يمكن تحديث البريد الإلكتروني",
CREDENTIAL_ACCOUNT_NOT_FOUND: "حساب بيانات الاعتماد غير موجود",
SESSION_EXPIRED: "انتهت الجلسة. أعد المصادقة لتنفيذ هذا الإجراء.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "لا يمكنك إلغاء ربط حسابك الأخير",
ACCOUNT_NOT_FOUND: "الحساب غير موجود",
USER_ALREADY_HAS_PASSWORD:
"المستخدم لديه كلمة مرور بالفعل. قدمها لحذف الحساب.",
VERIFICATION_EMAIL_NOT_ENABLED: "بريد التحقق غير مفعّل",
EMAIL_ALREADY_VERIFIED: "البريد الإلكتروني مُحقق بالفعل",
EMAIL_MISMATCH: "البريد الإلكتروني غير متطابق",
SESSION_NOT_FRESH: "الجلسة ليست حديثة",
LINKED_ACCOUNT_ALREADY_EXISTS: "الحساب المرتبط موجود بالفعل",
VALIDATION_ERROR: "خطأ في التحقق",
MISSING_FIELD: "هذا الحقل مطلوب",
PASSWORD_ALREADY_SET: "المستخدم لديه كلمة مرور محددة بالفعل",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Bengali translations
*/
export const bn: TranslationDictionary = {
USER_NOT_FOUND: "ব্যবহারকারী পাওয়া যায়নি",
FAILED_TO_CREATE_USER: "ব্যবহারকারী তৈরি করতে ব্যর্থ",
FAILED_TO_CREATE_SESSION: "সেশন তৈরি করতে ব্যর্থ",
FAILED_TO_UPDATE_USER: "ব্যবহারকারী আপডেট করতে ব্যর্থ",
FAILED_TO_GET_SESSION: "সেশন পেতে ব্যর্থ",
INVALID_PASSWORD: "অবৈধ পাসওয়ার্ড",
INVALID_EMAIL: "অবৈধ ইমেইল ঠিকানা",
INVALID_EMAIL_OR_PASSWORD: "অবৈধ ইমেইল বা পাসওয়ার্ড",
INVALID_USER: "অবৈধ ব্যবহারকারী",
SOCIAL_ACCOUNT_ALREADY_LINKED: "সোশ্যাল অ্যাকাউন্ট ইতিমধ্যে লিঙ্ক করা আছে",
PROVIDER_NOT_FOUND: "প্রদানকারী পাওয়া যায়নি",
INVALID_TOKEN: "অবৈধ টোকেন",
TOKEN_EXPIRED: "টোকেনের মেয়াদ শেষ",
FAILED_TO_GET_USER_INFO: "ব্যবহারকারীর তথ্য পেতে ব্যর্থ",
USER_EMAIL_NOT_FOUND: "ব্যবহারকারীর ইমেইল পাওয়া যায়নি",
EMAIL_NOT_VERIFIED: "ইমেইল যাচাই করা হয়নি",
PASSWORD_TOO_SHORT: "পাসওয়ার্ড অনেক ছোট",
PASSWORD_TOO_LONG: "পাসওয়ার্ড অনেক বড়",
USER_ALREADY_EXISTS: "ব্যবহারকারী ইতিমধ্যে বিদ্যমান",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"ব্যবহারকারী ইতিমধ্যে বিদ্যমান। অন্য ইমেইল ব্যবহার করুন।",
EMAIL_CAN_NOT_BE_UPDATED: "ইমেইল আপডেট করা যাবে না",
CREDENTIAL_ACCOUNT_NOT_FOUND: "শংসাপত্র অ্যাকাউন্ট পাওয়া যায়নি",
SESSION_EXPIRED:
"সেশন শেষ হয়ে গেছে। এই কাজটি সম্পাদন করতে পুনরায় প্রমাণীকরণ করুন।",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"আপনি আপনার শেষ অ্যাকাউন্টের লিঙ্ক সরাতে পারবেন না",
ACCOUNT_NOT_FOUND: "অ্যাকাউন্ট পাওয়া যায়নি",
USER_ALREADY_HAS_PASSWORD:
"ব্যবহারকারীর ইতিমধ্যে একটি পাসওয়ার্ড আছে। অ্যাকাউন্ট মুছতে সেটি দিন।",
VERIFICATION_EMAIL_NOT_ENABLED: "যাচাইকরণ ইমেইল সক্রিয় নেই",
EMAIL_ALREADY_VERIFIED: "ইমেইল ইতিমধ্যে যাচাই করা হয়েছে",
EMAIL_MISMATCH: "ইমেইল মেলে না",
SESSION_NOT_FRESH: "সেশন সতেজ নয়",
LINKED_ACCOUNT_ALREADY_EXISTS: "লিঙ্ক করা অ্যাকাউন্ট ইতিমধ্যে বিদ্যমান",
VALIDATION_ERROR: "যাচাইকরণ ত্রুটি",
MISSING_FIELD: "এই ক্ষেত্রটি আবশ্যক",
PASSWORD_ALREADY_SET: "ব্যবহারকারীর পাসওয়ার্ড ইতিমধ্যে সেট করা আছে",
};

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* German translations
*/
export const de: TranslationDictionary = {
USER_NOT_FOUND: "Benutzer nicht gefunden",
FAILED_TO_CREATE_USER: "Benutzer konnte nicht erstellt werden",
FAILED_TO_CREATE_SESSION: "Sitzung konnte nicht erstellt werden",
FAILED_TO_UPDATE_USER: "Benutzer konnte nicht aktualisiert werden",
FAILED_TO_GET_SESSION: "Sitzung konnte nicht abgerufen werden",
INVALID_PASSWORD: "Ungültiges Passwort",
INVALID_EMAIL: "Ungültige E-Mail-Adresse",
INVALID_EMAIL_OR_PASSWORD: "Ungültige E-Mail-Adresse oder Passwort",
INVALID_USER: "Ungültiger Benutzer",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Social-Media-Konto bereits verknüpft",
PROVIDER_NOT_FOUND: "Anbieter nicht gefunden",
INVALID_TOKEN: "Ungültiges Token",
TOKEN_EXPIRED: "Token abgelaufen",
FAILED_TO_GET_USER_INFO:
"Benutzerinformationen konnten nicht abgerufen werden",
USER_EMAIL_NOT_FOUND: "Benutzer-E-Mail nicht gefunden",
EMAIL_NOT_VERIFIED: "E-Mail-Adresse nicht verifiziert",
PASSWORD_TOO_SHORT: "Passwort zu kurz",
PASSWORD_TOO_LONG: "Passwort zu lang",
USER_ALREADY_EXISTS: "Benutzer existiert bereits",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Benutzer existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse.",
EMAIL_CAN_NOT_BE_UPDATED: "E-Mail-Adresse kann nicht aktualisiert werden",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Anmeldekonto nicht gefunden",
SESSION_EXPIRED:
"Sitzung abgelaufen. Bitte authentifizieren Sie sich erneut, um diese Aktion durchzuführen.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Sie können Ihr letztes Konto nicht trennen",
ACCOUNT_NOT_FOUND: "Konto nicht gefunden",
USER_ALREADY_HAS_PASSWORD:
"Der Benutzer hat bereits ein Passwort. Geben Sie dieses an, um das Konto zu löschen.",
VERIFICATION_EMAIL_NOT_ENABLED: "Bestätigungs-E-Mail ist nicht aktiviert",
EMAIL_ALREADY_VERIFIED: "E-Mail-Adresse ist bereits verifiziert",
EMAIL_MISMATCH: "E-Mail-Adressen stimmen nicht überein",
SESSION_NOT_FRESH: "Sitzung ist nicht aktuell",
LINKED_ACCOUNT_ALREADY_EXISTS: "Verknüpftes Konto existiert bereits",
VALIDATION_ERROR: "Validierungsfehler",
MISSING_FIELD: "Dieses Feld ist erforderlich",
PASSWORD_ALREADY_SET: "Benutzer hat bereits ein Passwort festgelegt",
};

View File

@@ -0,0 +1,44 @@
import type { TranslationDictionary } from "../types";
/**
* English translations (default)
*/
export const en: TranslationDictionary = {
USER_NOT_FOUND: "User not found",
FAILED_TO_CREATE_USER: "Failed to create user",
FAILED_TO_CREATE_SESSION: "Failed to create session",
FAILED_TO_UPDATE_USER: "Failed to update user",
FAILED_TO_GET_SESSION: "Failed to get session",
INVALID_PASSWORD: "Invalid password",
INVALID_EMAIL: "Invalid email",
INVALID_EMAIL_OR_PASSWORD: "Invalid email or password",
INVALID_USER: "Invalid user",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Social account already linked",
PROVIDER_NOT_FOUND: "Provider not found",
INVALID_TOKEN: "Invalid token",
TOKEN_EXPIRED: "Token expired",
FAILED_TO_GET_USER_INFO: "Failed to get user info",
USER_EMAIL_NOT_FOUND: "User email not found",
EMAIL_NOT_VERIFIED: "Email not verified",
PASSWORD_TOO_SHORT: "Password too short",
PASSWORD_TOO_LONG: "Password too long",
USER_ALREADY_EXISTS: "User already exists",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"User already exists. Use another email.",
EMAIL_CAN_NOT_BE_UPDATED: "Email cannot be updated",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Credential account not found",
SESSION_EXPIRED:
"Session expired. Re-authenticate to perform this action.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "You can't unlink your last account",
ACCOUNT_NOT_FOUND: "Account not found",
USER_ALREADY_HAS_PASSWORD:
"User already has a password. Provide that to delete the account.",
VERIFICATION_EMAIL_NOT_ENABLED: "Verification email isn't enabled",
EMAIL_ALREADY_VERIFIED: "Email is already verified",
EMAIL_MISMATCH: "Email mismatch",
SESSION_NOT_FRESH: "Session is not fresh",
LINKED_ACCOUNT_ALREADY_EXISTS: "Linked account already exists",
VALIDATION_ERROR: "Validation error",
MISSING_FIELD: "Field is required",
PASSWORD_ALREADY_SET: "User already has a password set",
};

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* Spanish translations
*/
export const es: TranslationDictionary = {
USER_NOT_FOUND: "Usuario no encontrado",
FAILED_TO_CREATE_USER: "Error al crear el usuario",
FAILED_TO_CREATE_SESSION: "Error al crear la sesión",
FAILED_TO_UPDATE_USER: "Error al actualizar el usuario",
FAILED_TO_GET_SESSION: "Error al obtener la sesión",
INVALID_PASSWORD: "Contraseña inválida",
INVALID_EMAIL: "Correo electrónico inválido",
INVALID_EMAIL_OR_PASSWORD: "Correo electrónico o contraseña inválidos",
INVALID_USER: "Usuario inválido",
SOCIAL_ACCOUNT_ALREADY_LINKED: "La cuenta social ya está vinculada",
PROVIDER_NOT_FOUND: "Proveedor no encontrado",
INVALID_TOKEN: "Token inválido",
TOKEN_EXPIRED: "Token expirado",
FAILED_TO_GET_USER_INFO:
"Error al obtener la información del usuario",
USER_EMAIL_NOT_FOUND: "Correo electrónico del usuario no encontrado",
EMAIL_NOT_VERIFIED: "Correo electrónico no verificado",
PASSWORD_TOO_SHORT: "Contraseña demasiado corta",
PASSWORD_TOO_LONG: "Contraseña demasiado larga",
USER_ALREADY_EXISTS: "El usuario ya existe",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"El usuario ya existe. Usa otro correo electrónico.",
EMAIL_CAN_NOT_BE_UPDATED: "El correo electrónico no puede actualizarse",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Cuenta de credenciales no encontrada",
SESSION_EXPIRED:
"Sesión expirada. Vuelve a autenticarte para realizar esta acción.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "No puedes desvincular tu última cuenta",
ACCOUNT_NOT_FOUND: "Cuenta no encontrada",
USER_ALREADY_HAS_PASSWORD:
"El usuario ya tiene una contraseña. Proporciónala para eliminar la cuenta.",
VERIFICATION_EMAIL_NOT_ENABLED:
"El correo de verificación no está habilitado",
EMAIL_ALREADY_VERIFIED: "El correo electrónico ya está verificado",
EMAIL_MISMATCH: "Los correos electrónicos no coinciden",
SESSION_NOT_FRESH: "La sesión no es reciente",
LINKED_ACCOUNT_ALREADY_EXISTS: "La cuenta vinculada ya existe",
VALIDATION_ERROR: "Error de validación",
MISSING_FIELD: "Este campo es requerido",
PASSWORD_ALREADY_SET: "El usuario ya tiene una contraseña establecida",
};

View File

@@ -0,0 +1,44 @@
import type { TranslationDictionary } from "../types";
/**
* Persian (Farsi) translations
*/
export const fa: TranslationDictionary = {
USER_NOT_FOUND: "کاربر یافت نشد",
FAILED_TO_CREATE_USER: "ایجاد کاربر ناموفق بود",
FAILED_TO_CREATE_SESSION: "ایجاد نشست ناموفق بود",
FAILED_TO_UPDATE_USER: "به‌روزرسانی کاربر ناموفق بود",
FAILED_TO_GET_SESSION: "دریافت نشست ناموفق بود",
INVALID_PASSWORD: "رمز عبور نامعتبر است",
INVALID_EMAIL: "ایمیل نامعتبر است",
INVALID_EMAIL_OR_PASSWORD: "ایمیل یا رمز عبور نامعتبر است",
INVALID_USER: "کاربر نامعتبر است",
SOCIAL_ACCOUNT_ALREADY_LINKED: "حساب اجتماعی قبلاً لینک شده است",
PROVIDER_NOT_FOUND: "ارائه‌دهنده یافت نشد",
INVALID_TOKEN: "توکن نامعتبر است",
TOKEN_EXPIRED: "توکن منقضی شده است",
FAILED_TO_GET_USER_INFO: "دریافت اطلاعات کاربر ناموفق بود",
USER_EMAIL_NOT_FOUND: "ایمیل کاربر یافت نشد",
EMAIL_NOT_VERIFIED: "ایمیل تأیید نشده است",
PASSWORD_TOO_SHORT: "رمز عبور خیلی کوتاه است",
PASSWORD_TOO_LONG: "رمز عبور خیلی طولانی است",
USER_ALREADY_EXISTS: "کاربر از قبل وجود دارد",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"کاربر از قبل وجود دارد. از ایمیل دیگری استفاده کنید.",
EMAIL_CAN_NOT_BE_UPDATED: "ایمیل قابل به‌روزرسانی نیست",
CREDENTIAL_ACCOUNT_NOT_FOUND: "حساب اعتبارنامه یافت نشد",
SESSION_EXPIRED:
"نشست منقضی شده است. برای انجام این عملیات مجدداً احراز هویت کنید.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "نمی‌توانید آخرین حساب خود را جدا کنید",
ACCOUNT_NOT_FOUND: "حساب یافت نشد",
USER_ALREADY_HAS_PASSWORD:
"کاربر از قبل رمز عبور دارد. برای حذف حساب آن را وارد کنید.",
VERIFICATION_EMAIL_NOT_ENABLED: "ایمیل تأییدیه فعال نیست",
EMAIL_ALREADY_VERIFIED: "ایمیل قبلاً تأیید شده است",
EMAIL_MISMATCH: "ایمیل‌ها مطابقت ندارند",
SESSION_NOT_FRESH: "نشست تازه نیست",
LINKED_ACCOUNT_ALREADY_EXISTS: "حساب لینک شده از قبل وجود دارد",
VALIDATION_ERROR: "خطای اعتبارسنجی",
MISSING_FIELD: "این فیلد الزامی است",
PASSWORD_ALREADY_SET: "کاربر از قبل رمز عبور دارد",
};

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* French translations
*/
export const fr: TranslationDictionary = {
USER_NOT_FOUND: "Utilisateur non trouvé",
FAILED_TO_CREATE_USER: "Échec de la création de l'utilisateur",
FAILED_TO_CREATE_SESSION: "Échec de la création de la session",
FAILED_TO_UPDATE_USER: "Échec de la mise à jour de l'utilisateur",
FAILED_TO_GET_SESSION: "Échec de la récupération de la session",
INVALID_PASSWORD: "Mot de passe invalide",
INVALID_EMAIL: "Adresse e-mail invalide",
INVALID_EMAIL_OR_PASSWORD: "Email ou mot de passe invalide",
INVALID_USER: "Utilisateur invalide",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Compte social déjà lié",
PROVIDER_NOT_FOUND: "Fournisseur non trouvé",
INVALID_TOKEN: "Jeton invalide",
TOKEN_EXPIRED: "Jeton expiré",
FAILED_TO_GET_USER_INFO:
"Échec de la récupération des informations utilisateur",
USER_EMAIL_NOT_FOUND: "Adresse e-mail de l'utilisateur non trouvée",
EMAIL_NOT_VERIFIED: "Adresse e-mail non vérifiée",
PASSWORD_TOO_SHORT: "Mot de passe trop court",
PASSWORD_TOO_LONG: "Mot de passe trop long",
USER_ALREADY_EXISTS: "L'utilisateur existe déjà",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"L'utilisateur existe déjà. Utilisez une autre adresse e-mail.",
EMAIL_CAN_NOT_BE_UPDATED: "L'adresse e-mail ne peut pas être mise à jour",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Compte de connexion non trouvé",
SESSION_EXPIRED:
"Session expirée. Veuillez vous reconnecter pour effectuer cette action.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Vous ne pouvez pas dissocier votre dernier compte",
ACCOUNT_NOT_FOUND: "Compte non trouvé",
USER_ALREADY_HAS_PASSWORD:
"L'utilisateur a déjà un mot de passe. Fournissez-le pour supprimer le compte.",
VERIFICATION_EMAIL_NOT_ENABLED: "L'e-mail de vérification n'est pas activé",
EMAIL_ALREADY_VERIFIED: "L'adresse e-mail est déjà vérifiée",
EMAIL_MISMATCH: "Discordance d'adresses e-mail",
SESSION_NOT_FRESH: "La session n'est pas récente",
LINKED_ACCOUNT_ALREADY_EXISTS: "Le compte lié existe déjà",
VALIDATION_ERROR: "Erreur de validation",
MISSING_FIELD: "Ce champ est requis",
PASSWORD_ALREADY_SET: "L'utilisateur a déjà un mot de passe défini",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Hindi translations
*/
export const hi: TranslationDictionary = {
USER_NOT_FOUND: "उपयोगकर्ता नहीं मिला",
FAILED_TO_CREATE_USER: "उपयोगकर्ता बनाने में विफल",
FAILED_TO_CREATE_SESSION: "सत्र बनाने में विफल",
FAILED_TO_UPDATE_USER: "उपयोगकर्ता अपडेट करने में विफल",
FAILED_TO_GET_SESSION: "सत्र प्राप्त करने में विफल",
INVALID_PASSWORD: "अमान्य पासवर्ड",
INVALID_EMAIL: "अमान्य ईमेल",
INVALID_EMAIL_OR_PASSWORD: "अमान्य ईमेल या पासवर्ड",
INVALID_USER: "अमान्य उपयोगकर्ता",
SOCIAL_ACCOUNT_ALREADY_LINKED: "सोशल अकाउंट पहले से लिंक है",
PROVIDER_NOT_FOUND: "प्रदाता नहीं मिला",
INVALID_TOKEN: "अमान्य टोकन",
TOKEN_EXPIRED: "टोकन समाप्त हो गया",
FAILED_TO_GET_USER_INFO: "उपयोगकर्ता जानकारी प्राप्त करने में विफल",
USER_EMAIL_NOT_FOUND: "उपयोगकर्ता का ईमेल नहीं मिला",
EMAIL_NOT_VERIFIED: "ईमेल सत्यापित नहीं है",
PASSWORD_TOO_SHORT: "पासवर्ड बहुत छोटा है",
PASSWORD_TOO_LONG: "पासवर्ड बहुत लंबा है",
USER_ALREADY_EXISTS: "उपयोगकर्ता पहले से मौजूद है",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"उपयोगकर्ता पहले से मौजूद है। कोई अन्य ईमेल उपयोग करें।",
EMAIL_CAN_NOT_BE_UPDATED: "ईमेल अपडेट नहीं किया जा सकता",
CREDENTIAL_ACCOUNT_NOT_FOUND: "क्रेडेंशियल अकाउंट नहीं मिला",
SESSION_EXPIRED:
"सत्र समाप्त हो गया। इस क्रिया को करने के लिए पुनः प्रमाणित करें।",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"आप अपने अंतिम अकाउंट को अनलिंक नहीं कर सकते",
ACCOUNT_NOT_FOUND: "अकाउंट नहीं मिला",
USER_ALREADY_HAS_PASSWORD:
"उपयोगकर्ता के पास पहले से पासवर्ड है। अकाउंट हटाने के लिए वह दर्ज करें।",
VERIFICATION_EMAIL_NOT_ENABLED: "सत्यापन ईमेल सक्षम नहीं है",
EMAIL_ALREADY_VERIFIED: "ईमेल पहले से सत्यापित है",
EMAIL_MISMATCH: "ईमेल मेल नहीं खाता",
SESSION_NOT_FRESH: "सत्र ताजा नहीं है",
LINKED_ACCOUNT_ALREADY_EXISTS: "लिंक किया गया अकाउंट पहले से मौजूद है",
VALIDATION_ERROR: "सत्यापन त्रुटि",
MISSING_FIELD: "यह फ़ील्ड आवश्यक है",
PASSWORD_ALREADY_SET: "उपयोगकर्ता का पासवर्ड पहले से सेट है",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Indonesian translations
*/
export const id: TranslationDictionary = {
USER_NOT_FOUND: "Pengguna tidak ditemukan",
FAILED_TO_CREATE_USER: "Gagal membuat pengguna",
FAILED_TO_CREATE_SESSION: "Gagal membuat sesi",
FAILED_TO_UPDATE_USER: "Gagal memperbarui pengguna",
FAILED_TO_GET_SESSION: "Gagal mendapatkan sesi",
INVALID_PASSWORD: "Kata sandi tidak valid",
INVALID_EMAIL: "Alamat email tidak valid",
INVALID_EMAIL_OR_PASSWORD: "Email atau kata sandi tidak valid",
INVALID_USER: "Pengguna tidak valid",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Akun sosial sudah ditautkan",
PROVIDER_NOT_FOUND: "Penyedia tidak ditemukan",
INVALID_TOKEN: "Token tidak valid",
TOKEN_EXPIRED: "Token sudah kedaluwarsa",
FAILED_TO_GET_USER_INFO: "Gagal mendapatkan informasi pengguna",
USER_EMAIL_NOT_FOUND: "Email pengguna tidak ditemukan",
EMAIL_NOT_VERIFIED: "Email belum diverifikasi",
PASSWORD_TOO_SHORT: "Kata sandi terlalu pendek",
PASSWORD_TOO_LONG: "Kata sandi terlalu panjang",
USER_ALREADY_EXISTS: "Pengguna sudah ada",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Pengguna sudah ada. Gunakan email lain.",
EMAIL_CAN_NOT_BE_UPDATED: "Email tidak dapat diperbarui",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Akun kredensial tidak ditemukan",
SESSION_EXPIRED:
"Sesi telah kedaluwarsa. Autentikasi ulang untuk melakukan tindakan ini.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Anda tidak dapat memutuskan tautan akun terakhir Anda",
ACCOUNT_NOT_FOUND: "Akun tidak ditemukan",
USER_ALREADY_HAS_PASSWORD:
"Pengguna sudah memiliki kata sandi. Berikan kata sandi tersebut untuk menghapus akun.",
VERIFICATION_EMAIL_NOT_ENABLED: "Email verifikasi tidak diaktifkan",
EMAIL_ALREADY_VERIFIED: "Email sudah diverifikasi",
EMAIL_MISMATCH: "Email tidak cocok",
SESSION_NOT_FRESH: "Sesi tidak segar",
LINKED_ACCOUNT_ALREADY_EXISTS: "Akun yang ditautkan sudah ada",
VALIDATION_ERROR: "Kesalahan validasi",
MISSING_FIELD: "Kolom ini diperlukan",
PASSWORD_ALREADY_SET: "Pengguna sudah memiliki kata sandi yang ditetapkan",
};

View File

@@ -0,0 +1,76 @@
/**
* Built-in default translations for the i18n plugin.
*
* Each locale exports a {@link TranslationDictionary} covering the core
* Better Auth error codes. Additional locales can be added by following the
* same pattern.
*
* @example Basic usage — enable all built-in locales
* ```ts
* import { i18n, locales } from "@better-auth/i18n";
*
* export const auth = betterAuth({
* plugins: [
* i18n({ translations: locales }),
* ],
* });
* ```
*
* @example Selective usage — only a subset of locales
* ```ts
* import { i18n, locales } from "@better-auth/i18n";
*
* export const auth = betterAuth({
* plugins: [
* i18n({
* translations: {
* en: locales.en,
* fr: locales.fr,
* },
* }),
* ],
* });
* ```
*
* @example Override specific messages for a locale
* ```ts
* import { i18n, locales } from "@better-auth/i18n";
*
* export const auth = betterAuth({
* plugins: [
* i18n({
* translations: {
* ...locales,
* fr: {
* ...locales.fr,
* USER_NOT_FOUND: "Membre introuvable",
* },
* },
* }),
* ],
* });
* ```
*/
export { ar } from "./ar";
export { bn } from "./bn";
export { de } from "./de";
export { en } from "./en";
export { es } from "./es";
export { fa } from "./fa";
export { fr } from "./fr";
export { hi } from "./hi";
export { id } from "./id";
export { it } from "./it";
export { ja } from "./ja";
export { ko } from "./ko";
export { nl } from "./nl";
export { pl } from "./pl";
export { pt } from "./pt";
export { ru } from "./ru";
export { sv } from "./sv";
export { th } from "./th";
export { tr } from "./tr";
export { uk } from "./uk";
export { vi } from "./vi";
export { zh } from "./zh";

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* Italian translations
*/
export const it: TranslationDictionary = {
USER_NOT_FOUND: "Utente non trovato",
FAILED_TO_CREATE_USER: "Impossibile creare l'utente",
FAILED_TO_CREATE_SESSION: "Impossibile creare la sessione",
FAILED_TO_UPDATE_USER: "Impossibile aggiornare l'utente",
FAILED_TO_GET_SESSION: "Impossibile ottenere la sessione",
INVALID_PASSWORD: "Password non valida",
INVALID_EMAIL: "Indirizzo e-mail non valido",
INVALID_EMAIL_OR_PASSWORD: "Indirizzo e-mail o password non validi",
INVALID_USER: "Utente non valido",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Account social già collegato",
PROVIDER_NOT_FOUND: "Provider non trovato",
INVALID_TOKEN: "Token non valido",
TOKEN_EXPIRED: "Token scaduto",
FAILED_TO_GET_USER_INFO:
"Impossibile ottenere le informazioni dell'utente",
USER_EMAIL_NOT_FOUND: "Indirizzo e-mail dell'utente non trovato",
EMAIL_NOT_VERIFIED: "Indirizzo e-mail non verificato",
PASSWORD_TOO_SHORT: "Password troppo corta",
PASSWORD_TOO_LONG: "Password troppo lunga",
USER_ALREADY_EXISTS: "L'utente esiste già",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"L'utente esiste già. Usa un altro indirizzo e-mail.",
EMAIL_CAN_NOT_BE_UPDATED: "L'indirizzo e-mail non può essere aggiornato",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Account delle credenziali non trovato",
SESSION_EXPIRED:
"Sessione scaduta. Esegui nuovamente l'autenticazione per eseguire questa azione.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Non puoi scollegare il tuo ultimo account",
ACCOUNT_NOT_FOUND: "Account non trovato",
USER_ALREADY_HAS_PASSWORD:
"L'utente ha già una password. Forniscila per eliminare l'account.",
VERIFICATION_EMAIL_NOT_ENABLED: "L'e-mail di verifica non è abilitata",
EMAIL_ALREADY_VERIFIED: "L'indirizzo e-mail è già verificato",
EMAIL_MISMATCH: "Gli indirizzi e-mail non corrispondono",
SESSION_NOT_FRESH: "La sessione non è recente",
LINKED_ACCOUNT_ALREADY_EXISTS: "L'account collegato esiste già",
VALIDATION_ERROR: "Errore di validazione",
MISSING_FIELD: "Questo campo è obbligatorio",
PASSWORD_ALREADY_SET: "L'utente ha già una password impostata",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Japanese translations
*/
export const ja: TranslationDictionary = {
USER_NOT_FOUND: "ユーザーが見つかりません",
FAILED_TO_CREATE_USER: "ユーザーの作成に失敗しました",
FAILED_TO_CREATE_SESSION: "セッションの作成に失敗しました",
FAILED_TO_UPDATE_USER: "ユーザーの更新に失敗しました",
FAILED_TO_GET_SESSION: "セッションの取得に失敗しました",
INVALID_PASSWORD: "パスワードが無効です",
INVALID_EMAIL: "メールアドレスが無効です",
INVALID_EMAIL_OR_PASSWORD: "メールアドレスまたはパスワードが無効です",
INVALID_USER: "ユーザーが無効です",
SOCIAL_ACCOUNT_ALREADY_LINKED: "ソーシャルアカウントはすでに連携されています",
PROVIDER_NOT_FOUND: "プロバイダーが見つかりません",
INVALID_TOKEN: "トークンが無効です",
TOKEN_EXPIRED: "トークンの有効期限が切れています",
FAILED_TO_GET_USER_INFO: "ユーザー情報の取得に失敗しました",
USER_EMAIL_NOT_FOUND: "ユーザーのメールアドレスが見つかりません",
EMAIL_NOT_VERIFIED: "メールアドレスが確認されていません",
PASSWORD_TOO_SHORT: "パスワードが短すぎます",
PASSWORD_TOO_LONG: "パスワードが長すぎます",
USER_ALREADY_EXISTS: "ユーザーはすでに存在します",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"ユーザーはすでに存在します。別のメールアドレスをご使用ください。",
EMAIL_CAN_NOT_BE_UPDATED: "メールアドレスは更新できません",
CREDENTIAL_ACCOUNT_NOT_FOUND: "認証アカウントが見つかりません",
SESSION_EXPIRED:
"セッションの有効期限が切れています。このアクションを実行するには再認証してください。",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"最後のアカウントの連携を解除することはできません",
ACCOUNT_NOT_FOUND: "アカウントが見つかりません",
USER_ALREADY_HAS_PASSWORD:
"ユーザーにはすでにパスワードが設定されています。アカウントを削除するにはパスワードを入力してください。",
VERIFICATION_EMAIL_NOT_ENABLED: "確認メールが有効化されていません",
EMAIL_ALREADY_VERIFIED: "メールアドレスはすでに確認済みです",
EMAIL_MISMATCH: "メールアドレスが一致しません",
SESSION_NOT_FRESH: "セッションが最新ではありません",
LINKED_ACCOUNT_ALREADY_EXISTS: "連携アカウントはすでに存在します",
VALIDATION_ERROR: "バリデーションエラー",
MISSING_FIELD: "このフィールドは必須です",
PASSWORD_ALREADY_SET: "ユーザーにはすでにパスワードが設定されています",
};

View File

@@ -0,0 +1,44 @@
import type { TranslationDictionary } from "../types";
/**
* Korean translations
*/
export const ko: TranslationDictionary = {
USER_NOT_FOUND: "사용자를 찾을 수 없습니다",
FAILED_TO_CREATE_USER: "사용자 생성에 실패했습니다",
FAILED_TO_CREATE_SESSION: "세션 생성에 실패했습니다",
FAILED_TO_UPDATE_USER: "사용자 업데이트에 실패했습니다",
FAILED_TO_GET_SESSION: "세션을 가져오는 데 실패했습니다",
INVALID_PASSWORD: "유효하지 않은 비밀번호",
INVALID_EMAIL: "유효하지 않은 이메일",
INVALID_EMAIL_OR_PASSWORD: "유효하지 않은 이메일 또는 비밀번호",
INVALID_USER: "유효하지 않은 사용자",
SOCIAL_ACCOUNT_ALREADY_LINKED: "소셜 계정이 이미 연결되어 있습니다",
PROVIDER_NOT_FOUND: "제공자를 찾을 수 없습니다",
INVALID_TOKEN: "유효하지 않은 토큰",
TOKEN_EXPIRED: "토큰이 만료되었습니다",
FAILED_TO_GET_USER_INFO: "사용자 정보를 가져오는 데 실패했습니다",
USER_EMAIL_NOT_FOUND: "사용자 이메일을 찾을 수 없습니다",
EMAIL_NOT_VERIFIED: "이메일이 인증되지 않았습니다",
PASSWORD_TOO_SHORT: "비밀번호가 너무 짧습니다",
PASSWORD_TOO_LONG: "비밀번호가 너무 깁니다",
USER_ALREADY_EXISTS: "사용자가 이미 존재합니다",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"사용자가 이미 존재합니다. 다른 이메일을 사용해 주세요.",
EMAIL_CAN_NOT_BE_UPDATED: "이메일을 업데이트할 수 없습니다",
CREDENTIAL_ACCOUNT_NOT_FOUND: "자격 증명 계정을 찾을 수 없습니다",
SESSION_EXPIRED:
"세션이 만료되었습니다. 이 작업을 수행하려면 다시 인증해 주세요.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "마지막 계정의 연결을 해제할 수 없습니다",
ACCOUNT_NOT_FOUND: "계정을 찾을 수 없습니다",
USER_ALREADY_HAS_PASSWORD:
"사용자에게 이미 비밀번호가 있습니다. 계정을 삭제하려면 비밀번호를 제공해 주세요.",
VERIFICATION_EMAIL_NOT_ENABLED: "인증 이메일이 활성화되지 않았습니다",
EMAIL_ALREADY_VERIFIED: "이메일이 이미 인증되었습니다",
EMAIL_MISMATCH: "이메일이 일치하지 않습니다",
SESSION_NOT_FRESH: "세션이 최신 상태가 아닙니다",
LINKED_ACCOUNT_ALREADY_EXISTS: "연결된 계정이 이미 존재합니다",
VALIDATION_ERROR: "유효성 검사 오류",
MISSING_FIELD: "이 필드는 필수입니다",
PASSWORD_ALREADY_SET: "사용자에게 이미 비밀번호가 설정되어 있습니다",
};

View File

@@ -0,0 +1,44 @@
import type { TranslationDictionary } from "../types";
/**
* Dutch translations
*/
export const nl: TranslationDictionary = {
USER_NOT_FOUND: "Gebruiker niet gevonden",
FAILED_TO_CREATE_USER: "Gebruiker aanmaken mislukt",
FAILED_TO_CREATE_SESSION: "Sessie aanmaken mislukt",
FAILED_TO_UPDATE_USER: "Gebruiker bijwerken mislukt",
FAILED_TO_GET_SESSION: "Sessie ophalen mislukt",
INVALID_PASSWORD: "Ongeldig wachtwoord",
INVALID_EMAIL: "Ongeldig e-mailadres",
INVALID_EMAIL_OR_PASSWORD: "Ongeldig e-mailadres of wachtwoord",
INVALID_USER: "Ongeldige gebruiker",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Sociaal account al gekoppeld",
PROVIDER_NOT_FOUND: "Provider niet gevonden",
INVALID_TOKEN: "Ongeldig token",
TOKEN_EXPIRED: "Token verlopen",
FAILED_TO_GET_USER_INFO: "Gebruikersinformatie ophalen mislukt",
USER_EMAIL_NOT_FOUND: "E-mailadres van gebruiker niet gevonden",
EMAIL_NOT_VERIFIED: "E-mailadres niet geverifieerd",
PASSWORD_TOO_SHORT: "Wachtwoord te kort",
PASSWORD_TOO_LONG: "Wachtwoord te lang",
USER_ALREADY_EXISTS: "Gebruiker bestaat al",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Gebruiker bestaat al. Gebruik een ander e-mailadres.",
EMAIL_CAN_NOT_BE_UPDATED: "E-mailadres kan niet worden bijgewerkt",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Referentieaccount niet gevonden",
SESSION_EXPIRED:
"Sessie verlopen. Authenticeer opnieuw om deze actie uit te voeren.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "U kunt uw laatste account niet ontkoppelen",
ACCOUNT_NOT_FOUND: "Account niet gevonden",
USER_ALREADY_HAS_PASSWORD:
"Gebruiker heeft al een wachtwoord. Geef dit op om het account te verwijderen.",
VERIFICATION_EMAIL_NOT_ENABLED: "Verificatie-e-mail is niet ingeschakeld",
EMAIL_ALREADY_VERIFIED: "E-mailadres is al geverifieerd",
EMAIL_MISMATCH: "E-mailadressen komen niet overeen",
SESSION_NOT_FRESH: "Sessie is niet actueel",
LINKED_ACCOUNT_ALREADY_EXISTS: "Gekoppeld account bestaat al",
VALIDATION_ERROR: "Validatiefout",
MISSING_FIELD: "Dit veld is verplicht",
PASSWORD_ALREADY_SET: "Gebruiker heeft al een wachtwoord ingesteld",
};

View File

@@ -0,0 +1,47 @@
import type { TranslationDictionary } from "../types";
/**
* Polish translations
*/
export const pl: TranslationDictionary = {
USER_NOT_FOUND: "Użytkownik nie znaleziony",
FAILED_TO_CREATE_USER: "Nie udało się utworzyć użytkownika",
FAILED_TO_CREATE_SESSION: "Nie udało się utworzyć sesji",
FAILED_TO_UPDATE_USER: "Nie udało się zaktualizować użytkownika",
FAILED_TO_GET_SESSION: "Nie udało się pobrać sesji",
INVALID_PASSWORD: "Nieprawidłowe hasło",
INVALID_EMAIL: "Nieprawidłowy adres e-mail",
INVALID_EMAIL_OR_PASSWORD: "Nieprawidłowy adres e-mail lub hasło",
INVALID_USER: "Nieprawidłowy użytkownik",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Konto społecznościowe jest już połączone",
PROVIDER_NOT_FOUND: "Dostawca nie znaleziony",
INVALID_TOKEN: "Nieprawidłowy token",
TOKEN_EXPIRED: "Token wygasł",
FAILED_TO_GET_USER_INFO:
"Nie udało się pobrać informacji o użytkowniku",
USER_EMAIL_NOT_FOUND: "Adres e-mail użytkownika nie znaleziony",
EMAIL_NOT_VERIFIED: "Adres e-mail nie został zweryfikowany",
PASSWORD_TOO_SHORT: "Hasło jest za krótkie",
PASSWORD_TOO_LONG: "Hasło jest za długie",
USER_ALREADY_EXISTS: "Użytkownik już istnieje",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Użytkownik już istnieje. Użyj innego adresu e-mail.",
EMAIL_CAN_NOT_BE_UPDATED: "Adres e-mail nie może zostać zaktualizowany",
CREDENTIAL_ACCOUNT_NOT_FOUND:
"Konto z danymi uwierzytelniającymi nie znalezione",
SESSION_EXPIRED:
"Sesja wygasła. Uwierzytelnij się ponownie, aby wykonać tę akcję.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Nie możesz odłączyć swojego ostatniego konta",
ACCOUNT_NOT_FOUND: "Konto nie znalezione",
USER_ALREADY_HAS_PASSWORD:
"Użytkownik ma już hasło. Podaj je, aby usunąć konto.",
VERIFICATION_EMAIL_NOT_ENABLED: "E-mail weryfikacyjny nie jest włączony",
EMAIL_ALREADY_VERIFIED: "Adres e-mail jest już zweryfikowany",
EMAIL_MISMATCH: "Adresy e-mail nie są zgodne",
SESSION_NOT_FRESH: "Sesja nie jest aktualna",
LINKED_ACCOUNT_ALREADY_EXISTS: "Połączone konto już istnieje",
VALIDATION_ERROR: "Błąd walidacji",
MISSING_FIELD: "To pole jest wymagane",
PASSWORD_ALREADY_SET: "Użytkownik ma już ustawione hasło",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Portuguese translations
*/
export const pt: TranslationDictionary = {
USER_NOT_FOUND: "Usuário não encontrado",
FAILED_TO_CREATE_USER: "Falha ao criar usuário",
FAILED_TO_CREATE_SESSION: "Falha ao criar sessão",
FAILED_TO_UPDATE_USER: "Falha ao atualizar usuário",
FAILED_TO_GET_SESSION: "Falha ao obter sessão",
INVALID_PASSWORD: "Senha inválida",
INVALID_EMAIL: "E-mail inválido",
INVALID_EMAIL_OR_PASSWORD: "E-mail ou senha inválidos",
INVALID_USER: "Usuário inválido",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Conta social já vinculada",
PROVIDER_NOT_FOUND: "Provedor não encontrado",
INVALID_TOKEN: "Token inválido",
TOKEN_EXPIRED: "Token expirado",
FAILED_TO_GET_USER_INFO: "Falha ao obter informações do usuário",
USER_EMAIL_NOT_FOUND: "E-mail do usuário não encontrado",
EMAIL_NOT_VERIFIED: "E-mail não verificado",
PASSWORD_TOO_SHORT: "Senha muito curta",
PASSWORD_TOO_LONG: "Senha muito longa",
USER_ALREADY_EXISTS: "Usuário já existe",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Usuário já existe. Use outro e-mail.",
EMAIL_CAN_NOT_BE_UPDATED: "O e-mail não pode ser atualizado",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Conta de credencial não encontrada",
SESSION_EXPIRED:
"Sessão expirada. Autentique-se novamente para realizar esta ação.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Você não pode desvincular sua última conta",
ACCOUNT_NOT_FOUND: "Conta não encontrada",
USER_ALREADY_HAS_PASSWORD:
"Usuário já tem uma senha. Forneça-a para excluir a conta.",
VERIFICATION_EMAIL_NOT_ENABLED: "E-mail de verificação não está habilitado",
EMAIL_ALREADY_VERIFIED: "E-mail já está verificado",
EMAIL_MISMATCH: "E-mails não correspondem",
SESSION_NOT_FRESH: "Sessão não está recente",
LINKED_ACCOUNT_ALREADY_EXISTS: "Conta vinculada já existe",
VALIDATION_ERROR: "Erro de validação",
MISSING_FIELD: "Este campo é obrigatório",
PASSWORD_ALREADY_SET: "Usuário já tem uma senha definida",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Russian translations
*/
export const ru: TranslationDictionary = {
USER_NOT_FOUND: "Пользователь не найден",
FAILED_TO_CREATE_USER: "Не удалось создать пользователя",
FAILED_TO_CREATE_SESSION: "Не удалось создать сессию",
FAILED_TO_UPDATE_USER: "Не удалось обновить пользователя",
FAILED_TO_GET_SESSION: "Не удалось получить сессию",
INVALID_PASSWORD: "Неверный пароль",
INVALID_EMAIL: "Недействительный адрес электронной почты",
INVALID_EMAIL_OR_PASSWORD: "Неверный адрес электронной почты или пароль",
INVALID_USER: "Недействительный пользователь",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Аккаунт в социальной сети уже привязан",
PROVIDER_NOT_FOUND: "Провайдер не найден",
INVALID_TOKEN: "Недействительный токен",
TOKEN_EXPIRED: "Токен истёк",
FAILED_TO_GET_USER_INFO:
"Не удалось получить информацию о пользователе",
USER_EMAIL_NOT_FOUND: "Электронная почта пользователя не найдена",
EMAIL_NOT_VERIFIED: "Электронная почта не подтверждена",
PASSWORD_TOO_SHORT: "Пароль слишком короткий",
PASSWORD_TOO_LONG: "Пароль слишком длинный",
USER_ALREADY_EXISTS: "Пользователь уже существует",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Пользователь уже существует. Используйте другой адрес электронной почты.",
EMAIL_CAN_NOT_BE_UPDATED: "Адрес электронной почты не может быть обновлён",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Учётная запись с паролем не найдена",
SESSION_EXPIRED:
"Сессия истекла. Выполните повторную аутентификацию для выполнения этого действия.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "Вы не можете отвязать последний аккаунт",
ACCOUNT_NOT_FOUND: "Аккаунт не найден",
USER_ALREADY_HAS_PASSWORD:
"У пользователя уже есть пароль. Укажите его для удаления аккаунта.",
VERIFICATION_EMAIL_NOT_ENABLED: "Письмо для подтверждения не включено",
EMAIL_ALREADY_VERIFIED: "Электронная почта уже подтверждена",
EMAIL_MISMATCH: "Адреса электронной почты не совпадают",
SESSION_NOT_FRESH: "Сессия устарела",
LINKED_ACCOUNT_ALREADY_EXISTS: "Привязанный аккаунт уже существует",
VALIDATION_ERROR: "Ошибка валидации",
MISSING_FIELD: "Это поле обязательно для заполнения",
PASSWORD_ALREADY_SET: "У пользователя уже установлен пароль",
};

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* Swedish translations
*/
export const sv: TranslationDictionary = {
USER_NOT_FOUND: "Användare hittades inte",
FAILED_TO_CREATE_USER: "Misslyckades med att skapa användare",
FAILED_TO_CREATE_SESSION: "Misslyckades med att skapa session",
FAILED_TO_UPDATE_USER: "Misslyckades med att uppdatera användare",
FAILED_TO_GET_SESSION: "Misslyckades med att hämta session",
INVALID_PASSWORD: "Ogiltigt lösenord",
INVALID_EMAIL: "Ogiltig e-postadress",
INVALID_EMAIL_OR_PASSWORD: "Ogiltig e-postadress eller lösenord",
INVALID_USER: "Ogiltig användare",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Socialt konto redan länkat",
PROVIDER_NOT_FOUND: "Leverantör hittades inte",
INVALID_TOKEN: "Ogiltigt token",
TOKEN_EXPIRED: "Token har gått ut",
FAILED_TO_GET_USER_INFO:
"Misslyckades med att hämta användarinformation",
USER_EMAIL_NOT_FOUND: "Användarens e-postadress hittades inte",
EMAIL_NOT_VERIFIED: "E-postadressen är inte verifierad",
PASSWORD_TOO_SHORT: "Lösenordet är för kort",
PASSWORD_TOO_LONG: "Lösenordet är för långt",
USER_ALREADY_EXISTS: "Användaren finns redan",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Användaren finns redan. Använd en annan e-postadress.",
EMAIL_CAN_NOT_BE_UPDATED: "E-postadressen kan inte uppdateras",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Inloggningskontot hittades inte",
SESSION_EXPIRED:
"Sessionen har gått ut. Autentisera dig igen för att utföra denna åtgärd.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Du kan inte ta bort länken till ditt sista konto",
ACCOUNT_NOT_FOUND: "Kontot hittades inte",
USER_ALREADY_HAS_PASSWORD:
"Användaren har redan ett lösenord. Ange det för att ta bort kontot.",
VERIFICATION_EMAIL_NOT_ENABLED: "Verifieringsmail är inte aktiverat",
EMAIL_ALREADY_VERIFIED: "E-postadressen är redan verifierad",
EMAIL_MISMATCH: "E-postadresserna stämmer inte överens",
SESSION_NOT_FRESH: "Sessionen är inte aktuell",
LINKED_ACCOUNT_ALREADY_EXISTS: "Det länkade kontot finns redan",
VALIDATION_ERROR: "Valideringsfel",
MISSING_FIELD: "Det här fältet är obligatoriskt",
PASSWORD_ALREADY_SET: "Användaren har redan ett lösenord inställt",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Thai translations
*/
export const th: TranslationDictionary = {
USER_NOT_FOUND: "ไม่พบผู้ใช้",
FAILED_TO_CREATE_USER: "สร้างผู้ใช้ไม่สำเร็จ",
FAILED_TO_CREATE_SESSION: "สร้างเซสชันไม่สำเร็จ",
FAILED_TO_UPDATE_USER: "อัปเดตผู้ใช้ไม่สำเร็จ",
FAILED_TO_GET_SESSION: "ดึงเซสชันไม่สำเร็จ",
INVALID_PASSWORD: "รหัสผ่านไม่ถูกต้อง",
INVALID_EMAIL: "อีเมลไม่ถูกต้อง",
INVALID_EMAIL_OR_PASSWORD: "อีเมลหรือรหัสผ่านไม่ถูกต้อง",
INVALID_USER: "ผู้ใช้ไม่ถูกต้อง",
SOCIAL_ACCOUNT_ALREADY_LINKED: "บัญชีโซเชียลเชื่อมต่อแล้ว",
PROVIDER_NOT_FOUND: "ไม่พบผู้ให้บริการ",
INVALID_TOKEN: "โทเคนไม่ถูกต้อง",
TOKEN_EXPIRED: "โทเคนหมดอายุ",
FAILED_TO_GET_USER_INFO: "ดึงข้อมูลผู้ใช้ไม่สำเร็จ",
USER_EMAIL_NOT_FOUND: "ไม่พบอีเมลผู้ใช้",
EMAIL_NOT_VERIFIED: "อีเมลยังไม่ได้รับการยืนยัน",
PASSWORD_TOO_SHORT: "รหัสผ่านสั้นเกินไป",
PASSWORD_TOO_LONG: "รหัสผ่านยาวเกินไป",
USER_ALREADY_EXISTS: "ผู้ใช้มีอยู่แล้ว",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"ผู้ใช้มีอยู่แล้ว กรุณาใช้อีเมลอื่น",
EMAIL_CAN_NOT_BE_UPDATED: "ไม่สามารถอัปเดตอีเมลได้",
CREDENTIAL_ACCOUNT_NOT_FOUND: "ไม่พบบัญชีข้อมูลรับรอง",
SESSION_EXPIRED:
"เซสชันหมดอายุ กรุณายืนยันตัวตนใหม่เพื่อดำเนินการนี้",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"คุณไม่สามารถยกเลิกการเชื่อมต่อบัญชีสุดท้ายของคุณได้",
ACCOUNT_NOT_FOUND: "ไม่พบบัญชี",
USER_ALREADY_HAS_PASSWORD:
"ผู้ใช้มีรหัสผ่านอยู่แล้ว กรุณาระบุรหัสผ่านเพื่อลบบัญชี",
VERIFICATION_EMAIL_NOT_ENABLED: "ไม่ได้เปิดใช้งานอีเมลยืนยัน",
EMAIL_ALREADY_VERIFIED: "อีเมลได้รับการยืนยันแล้ว",
EMAIL_MISMATCH: "อีเมลไม่ตรงกัน",
SESSION_NOT_FRESH: "เซสชันไม่ใหม่",
LINKED_ACCOUNT_ALREADY_EXISTS: "บัญชีที่เชื่อมต่อมีอยู่แล้ว",
VALIDATION_ERROR: "ข้อผิดพลาดในการตรวจสอบ",
MISSING_FIELD: "ต้องกรอกฟิลด์นี้",
PASSWORD_ALREADY_SET: "ผู้ใช้มีรหัสผ่านที่ตั้งค่าไว้แล้ว",
};

View File

@@ -0,0 +1,45 @@
import type { TranslationDictionary } from "../types";
/**
* Turkish translations
*/
export const tr: TranslationDictionary = {
USER_NOT_FOUND: "Kullanıcı bulunamadı",
FAILED_TO_CREATE_USER: "Kullanıcı oluşturulamadı",
FAILED_TO_CREATE_SESSION: "Oturum oluşturulamadı",
FAILED_TO_UPDATE_USER: "Kullanıcı güncellenemedi",
FAILED_TO_GET_SESSION: "Oturum alınamadı",
INVALID_PASSWORD: "Geçersiz şifre",
INVALID_EMAIL: "Geçersiz e-posta adresi",
INVALID_EMAIL_OR_PASSWORD: "Geçersiz e-posta adresi veya şifre",
INVALID_USER: "Geçersiz kullanıcı",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Sosyal hesap zaten bağlı",
PROVIDER_NOT_FOUND: "Sağlayıcı bulunamadı",
INVALID_TOKEN: "Geçersiz token",
TOKEN_EXPIRED: "Token süresi doldu",
FAILED_TO_GET_USER_INFO: "Kullanıcı bilgileri alınamadı",
USER_EMAIL_NOT_FOUND: "Kullanıcı e-posta adresi bulunamadı",
EMAIL_NOT_VERIFIED: "E-posta adresi doğrulanmadı",
PASSWORD_TOO_SHORT: "Şifre çok kısa",
PASSWORD_TOO_LONG: "Şifre çok uzun",
USER_ALREADY_EXISTS: "Kullanıcı zaten mevcut",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Kullanıcı zaten mevcut. Başka bir e-posta adresi kullanın.",
EMAIL_CAN_NOT_BE_UPDATED: "E-posta adresi güncellenemiyor",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Kimlik bilgisi hesabı bulunamadı",
SESSION_EXPIRED:
"Oturum süresi doldu. Bu işlemi gerçekleştirmek için yeniden kimlik doğrulayın.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Son hesabınızın bağlantısını kaldıramazsınız",
ACCOUNT_NOT_FOUND: "Hesap bulunamadı",
USER_ALREADY_HAS_PASSWORD:
"Kullanıcının zaten bir şifresi var. Hesabı silmek için şifreyi girin.",
VERIFICATION_EMAIL_NOT_ENABLED: "Doğrulama e-postası etkin değil",
EMAIL_ALREADY_VERIFIED: "E-posta adresi zaten doğrulandı",
EMAIL_MISMATCH: "E-posta adresleri uyuşmuyor",
SESSION_NOT_FRESH: "Oturum güncel değil",
LINKED_ACCOUNT_ALREADY_EXISTS: "Bağlı hesap zaten mevcut",
VALIDATION_ERROR: "Doğrulama hatası",
MISSING_FIELD: "Bu alan gerekli",
PASSWORD_ALREADY_SET: "Kullanıcının şifresi zaten ayarlanmış",
};

View File

@@ -0,0 +1,47 @@
import type { TranslationDictionary } from "../types";
/**
* Ukrainian translations
*/
export const uk: TranslationDictionary = {
USER_NOT_FOUND: "Користувача не знайдено",
FAILED_TO_CREATE_USER: "Не вдалося створити користувача",
FAILED_TO_CREATE_SESSION: "Не вдалося створити сеанс",
FAILED_TO_UPDATE_USER: "Не вдалося оновити користувача",
FAILED_TO_GET_SESSION: "Не вдалося отримати сеанс",
INVALID_PASSWORD: "Неправильний пароль",
INVALID_EMAIL: "Недійсна адреса електронної пошти",
INVALID_EMAIL_OR_PASSWORD:
"Неправильна адреса електронної пошти або пароль",
INVALID_USER: "Недійсний користувач",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Соціальний акаунт вже прив'язано",
PROVIDER_NOT_FOUND: "Провайдера не знайдено",
INVALID_TOKEN: "Недійсний токен",
TOKEN_EXPIRED: "Термін дії токена закінчився",
FAILED_TO_GET_USER_INFO:
"Не вдалося отримати інформацію про користувача",
USER_EMAIL_NOT_FOUND: "Адресу електронної пошти користувача не знайдено",
EMAIL_NOT_VERIFIED: "Адресу електронної пошти не підтверджено",
PASSWORD_TOO_SHORT: "Пароль занадто короткий",
PASSWORD_TOO_LONG: "Пароль занадто довгий",
USER_ALREADY_EXISTS: "Користувач вже існує",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Користувач вже існує. Використовуйте іншу адресу електронної пошти.",
EMAIL_CAN_NOT_BE_UPDATED:
"Адресу електронної пошти не можна оновити",
CREDENTIAL_ACCOUNT_NOT_FOUND: "Обліковий запис із даними не знайдено",
SESSION_EXPIRED:
"Сеанс закінчився. Пройдіть повторну аутентифікацію для виконання цієї дії.",
FAILED_TO_UNLINK_LAST_ACCOUNT: "Ви не можете від'єднати останній акаунт",
ACCOUNT_NOT_FOUND: "Акаунт не знайдено",
USER_ALREADY_HAS_PASSWORD:
"Користувач вже має пароль. Вкажіть його, щоб видалити акаунт.",
VERIFICATION_EMAIL_NOT_ENABLED: "Лист для підтвердження не увімкнено",
EMAIL_ALREADY_VERIFIED: "Адресу електронної пошти вже підтверджено",
EMAIL_MISMATCH: "Адреси електронної пошти не збігаються",
SESSION_NOT_FRESH: "Сеанс не є актуальним",
LINKED_ACCOUNT_ALREADY_EXISTS: "Прив'язаний акаунт вже існує",
VALIDATION_ERROR: "Помилка валідації",
MISSING_FIELD: "Це поле є обов'язковим",
PASSWORD_ALREADY_SET: "У користувача вже встановлено пароль",
};

View File

@@ -0,0 +1,46 @@
import type { TranslationDictionary } from "../types";
/**
* Vietnamese translations
*/
export const vi: TranslationDictionary = {
USER_NOT_FOUND: "Không tìm thấy người dùng",
FAILED_TO_CREATE_USER: "Tạo người dùng thất bại",
FAILED_TO_CREATE_SESSION: "Tạo phiên thất bại",
FAILED_TO_UPDATE_USER: "Cập nhật người dùng thất bại",
FAILED_TO_GET_SESSION: "Lấy phiên thất bại",
INVALID_PASSWORD: "Mật khẩu không hợp lệ",
INVALID_EMAIL: "Email không hợp lệ",
INVALID_EMAIL_OR_PASSWORD: "Email hoặc mật khẩu không hợp lệ",
INVALID_USER: "Người dùng không hợp lệ",
SOCIAL_ACCOUNT_ALREADY_LINKED: "Tài khoản mạng xã hội đã được liên kết",
PROVIDER_NOT_FOUND: "Không tìm thấy nhà cung cấp",
INVALID_TOKEN: "Token không hợp lệ",
TOKEN_EXPIRED: "Token đã hết hạn",
FAILED_TO_GET_USER_INFO: "Lấy thông tin người dùng thất bại",
USER_EMAIL_NOT_FOUND: "Không tìm thấy email người dùng",
EMAIL_NOT_VERIFIED: "Email chưa được xác minh",
PASSWORD_TOO_SHORT: "Mật khẩu quá ngắn",
PASSWORD_TOO_LONG: "Mật khẩu quá dài",
USER_ALREADY_EXISTS: "Người dùng đã tồn tại",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:
"Người dùng đã tồn tại. Sử dụng email khác.",
EMAIL_CAN_NOT_BE_UPDATED: "Email không thể được cập nhật",
CREDENTIAL_ACCOUNT_NOT_FOUND:
"Không tìm thấy tài khoản thông tin xác thực",
SESSION_EXPIRED:
"Phiên đã hết hạn. Xác thực lại để thực hiện hành động này.",
FAILED_TO_UNLINK_LAST_ACCOUNT:
"Bạn không thể hủy liên kết tài khoản cuối cùng của mình",
ACCOUNT_NOT_FOUND: "Không tìm thấy tài khoản",
USER_ALREADY_HAS_PASSWORD:
"Người dùng đã có mật khẩu. Cung cấp mật khẩu để xóa tài khoản.",
VERIFICATION_EMAIL_NOT_ENABLED: "Email xác minh chưa được bật",
EMAIL_ALREADY_VERIFIED: "Email đã được xác minh",
EMAIL_MISMATCH: "Email không khớp",
SESSION_NOT_FRESH: "Phiên không còn mới",
LINKED_ACCOUNT_ALREADY_EXISTS: "Tài khoản được liên kết đã tồn tại",
VALIDATION_ERROR: "Lỗi xác thực",
MISSING_FIELD: "Trường này là bắt buộc",
PASSWORD_ALREADY_SET: "Người dùng đã có mật khẩu được đặt",
};

View File

@@ -0,0 +1,41 @@
import type { TranslationDictionary } from "../types";
/**
* Simplified Chinese translations
*/
export const zh: TranslationDictionary = {
USER_NOT_FOUND: "用户未找到",
FAILED_TO_CREATE_USER: "创建用户失败",
FAILED_TO_CREATE_SESSION: "创建会话失败",
FAILED_TO_UPDATE_USER: "更新用户失败",
FAILED_TO_GET_SESSION: "获取会话失败",
INVALID_PASSWORD: "密码无效",
INVALID_EMAIL: "邮箱无效",
INVALID_EMAIL_OR_PASSWORD: "邮箱或密码无效",
INVALID_USER: "用户无效",
SOCIAL_ACCOUNT_ALREADY_LINKED: "社交账户已绑定",
PROVIDER_NOT_FOUND: "提供商未找到",
INVALID_TOKEN: "令牌无效",
TOKEN_EXPIRED: "令牌已过期",
FAILED_TO_GET_USER_INFO: "获取用户信息失败",
USER_EMAIL_NOT_FOUND: "用户邮箱未找到",
EMAIL_NOT_VERIFIED: "邮箱未验证",
PASSWORD_TOO_SHORT: "密码太短",
PASSWORD_TOO_LONG: "密码太长",
USER_ALREADY_EXISTS: "用户已存在",
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL: "用户已存在,请使用其他邮箱",
EMAIL_CAN_NOT_BE_UPDATED: "邮箱无法更新",
CREDENTIAL_ACCOUNT_NOT_FOUND: "凭证账户未找到",
SESSION_EXPIRED: "会话已过期,请重新验证身份以执行此操作",
FAILED_TO_UNLINK_LAST_ACCOUNT: "无法取消绑定最后一个账户",
ACCOUNT_NOT_FOUND: "账户未找到",
USER_ALREADY_HAS_PASSWORD: "用户已设置密码,请提供密码以删除账户",
VERIFICATION_EMAIL_NOT_ENABLED: "验证邮件未启用",
EMAIL_ALREADY_VERIFIED: "邮箱已验证",
EMAIL_MISMATCH: "邮箱不匹配",
SESSION_NOT_FRESH: "会话已过时",
LINKED_ACCOUNT_ALREADY_EXISTS: "已绑定账户已存在",
VALIDATION_ERROR: "验证错误",
MISSING_FIELD: "此字段为必填项",
PASSWORD_ALREADY_SET: "用户已设置密码",
};

View File

@@ -3,6 +3,6 @@ import { defineConfig } from "tsdown";
export default defineConfig({
dts: { build: true, incremental: true },
format: ["esm"],
entry: ["./src/index.ts", "./src/client.ts"],
entry: ["./src/index.ts", "./src/client.ts", "./src/locales/index.ts"],
treeshake: true,
});