diff --git a/packages/i18n/README.md b/packages/i18n/README.md index 43e4177554..7971dc2bfb 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -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). diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 060d9b5ade..8c41d928da 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -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" ] } }, diff --git a/packages/i18n/src/i18n.test.ts b/packages/i18n/src/i18n.test.ts index 8651dd86e4..decb76b312 100644 --- a/packages/i18n/src/i18n.test.ts +++ b/packages/i18n/src/i18n.test.ts @@ -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)[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)[key], + `Locale "${locale}" key "${key}" must be a non-empty string`, + ).toBe("string"); + expect( + (dict as Record)[key].length, + `Locale "${locale}" key "${key}" must not be empty`, + ).toBeGreaterThan(0); + } + } + }); + }); }); diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index cb9508b76c..b412e4bcb7 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -13,6 +13,8 @@ export type { TranslationDictionary, } from "./types"; +export * as locales from "./locales"; + declare module "@better-auth/core" { interface BetterAuthPluginRegistry { i18n: { diff --git a/packages/i18n/src/locales/ar.ts b/packages/i18n/src/locales/ar.ts new file mode 100644 index 0000000000..f4606be9de --- /dev/null +++ b/packages/i18n/src/locales/ar.ts @@ -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: "المستخدم لديه كلمة مرور محددة بالفعل", +}; diff --git a/packages/i18n/src/locales/bn.ts b/packages/i18n/src/locales/bn.ts new file mode 100644 index 0000000000..d966ce8eb0 --- /dev/null +++ b/packages/i18n/src/locales/bn.ts @@ -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: "ব্যবহারকারীর পাসওয়ার্ড ইতিমধ্যে সেট করা আছে", +}; diff --git a/packages/i18n/src/locales/de.ts b/packages/i18n/src/locales/de.ts new file mode 100644 index 0000000000..d3bf91f37e --- /dev/null +++ b/packages/i18n/src/locales/de.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/en.ts b/packages/i18n/src/locales/en.ts new file mode 100644 index 0000000000..1943a24592 --- /dev/null +++ b/packages/i18n/src/locales/en.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/es.ts b/packages/i18n/src/locales/es.ts new file mode 100644 index 0000000000..606b91c176 --- /dev/null +++ b/packages/i18n/src/locales/es.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/fa.ts b/packages/i18n/src/locales/fa.ts new file mode 100644 index 0000000000..31759c2010 --- /dev/null +++ b/packages/i18n/src/locales/fa.ts @@ -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: "کاربر از قبل رمز عبور دارد", +}; diff --git a/packages/i18n/src/locales/fr.ts b/packages/i18n/src/locales/fr.ts new file mode 100644 index 0000000000..b18c1fcff0 --- /dev/null +++ b/packages/i18n/src/locales/fr.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/hi.ts b/packages/i18n/src/locales/hi.ts new file mode 100644 index 0000000000..2637ae9037 --- /dev/null +++ b/packages/i18n/src/locales/hi.ts @@ -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: "उपयोगकर्ता का पासवर्ड पहले से सेट है", +}; diff --git a/packages/i18n/src/locales/id.ts b/packages/i18n/src/locales/id.ts new file mode 100644 index 0000000000..dafac690cb --- /dev/null +++ b/packages/i18n/src/locales/id.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/index.ts b/packages/i18n/src/locales/index.ts new file mode 100644 index 0000000000..98ac6bbf23 --- /dev/null +++ b/packages/i18n/src/locales/index.ts @@ -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"; diff --git a/packages/i18n/src/locales/it.ts b/packages/i18n/src/locales/it.ts new file mode 100644 index 0000000000..8887e887e8 --- /dev/null +++ b/packages/i18n/src/locales/it.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/ja.ts b/packages/i18n/src/locales/ja.ts new file mode 100644 index 0000000000..79d72d587b --- /dev/null +++ b/packages/i18n/src/locales/ja.ts @@ -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: "ユーザーにはすでにパスワードが設定されています", +}; diff --git a/packages/i18n/src/locales/ko.ts b/packages/i18n/src/locales/ko.ts new file mode 100644 index 0000000000..026e9007a3 --- /dev/null +++ b/packages/i18n/src/locales/ko.ts @@ -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: "사용자에게 이미 비밀번호가 설정되어 있습니다", +}; diff --git a/packages/i18n/src/locales/nl.ts b/packages/i18n/src/locales/nl.ts new file mode 100644 index 0000000000..ef1c9b3388 --- /dev/null +++ b/packages/i18n/src/locales/nl.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/pl.ts b/packages/i18n/src/locales/pl.ts new file mode 100644 index 0000000000..d2bfc06238 --- /dev/null +++ b/packages/i18n/src/locales/pl.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/pt.ts b/packages/i18n/src/locales/pt.ts new file mode 100644 index 0000000000..86013e9ee5 --- /dev/null +++ b/packages/i18n/src/locales/pt.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/ru.ts b/packages/i18n/src/locales/ru.ts new file mode 100644 index 0000000000..632125d220 --- /dev/null +++ b/packages/i18n/src/locales/ru.ts @@ -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: "У пользователя уже установлен пароль", +}; diff --git a/packages/i18n/src/locales/sv.ts b/packages/i18n/src/locales/sv.ts new file mode 100644 index 0000000000..5af70f96df --- /dev/null +++ b/packages/i18n/src/locales/sv.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/th.ts b/packages/i18n/src/locales/th.ts new file mode 100644 index 0000000000..754bc0ba1f --- /dev/null +++ b/packages/i18n/src/locales/th.ts @@ -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: "ผู้ใช้มีรหัสผ่านที่ตั้งค่าไว้แล้ว", +}; diff --git a/packages/i18n/src/locales/tr.ts b/packages/i18n/src/locales/tr.ts new file mode 100644 index 0000000000..4836aa7ce1 --- /dev/null +++ b/packages/i18n/src/locales/tr.ts @@ -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ış", +}; diff --git a/packages/i18n/src/locales/uk.ts b/packages/i18n/src/locales/uk.ts new file mode 100644 index 0000000000..0b9715642f --- /dev/null +++ b/packages/i18n/src/locales/uk.ts @@ -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: "У користувача вже встановлено пароль", +}; diff --git a/packages/i18n/src/locales/vi.ts b/packages/i18n/src/locales/vi.ts new file mode 100644 index 0000000000..52a208f6c6 --- /dev/null +++ b/packages/i18n/src/locales/vi.ts @@ -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", +}; diff --git a/packages/i18n/src/locales/zh.ts b/packages/i18n/src/locales/zh.ts new file mode 100644 index 0000000000..5647fe3c3a --- /dev/null +++ b/packages/i18n/src/locales/zh.ts @@ -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: "用户已设置密码", +}; diff --git a/packages/i18n/tsdown.config.ts b/packages/i18n/tsdown.config.ts index a52367369a..90fc4ce37e 100644 --- a/packages/i18n/tsdown.config.ts +++ b/packages/i18n/tsdown.config.ts @@ -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, });