Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,6 @@ dist
.turbo
.DS_Store
.source
.vscode
.vscode

.json-autotranslate-cache/*
14 changes: 13 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"scripts": {
"build": "tsup --clean --dts",
"dev": "tsc-watch",
"prepublishOnly": "rm -rf dist && turbo build"
"prepublishOnly": "rm -rf dist && turbo build",
"translate": "./src/locales/update-enjson.sh && pnpx json-autotranslate --input src/locales/jsons --delete-unused-strings --source-language en --service deepl-free --directory-structure ngx-translate --config $DEEPL_API_KEY --type key-based"
},
"type": "module",
"main": "./dist/index.cjs",
Expand Down Expand Up @@ -61,6 +62,16 @@
"types": "./dist/triplit.d.cts",
"default": "./dist/triplit.cjs"
}
},
"./locales": {
"import": {
"types": "./dist/locales.d.ts",
"default": "./dist/locales.js"
},
"require": {
"types": "./dist/locales.d.cts",
"default": "./dist/locales.cjs"
}
}
},
"files": [
Expand Down Expand Up @@ -89,6 +100,7 @@
"@radix-ui/react-use-callback-ref": "^1.1.1",
"@radix-ui/react-use-layout-effect": "^1.1.1",
"@react-email/components": "^0.0.41",
"@stagewise/toolbar": "^0.2.1",
"@tanstack/react-query": "^5.76.1",
"@types/grecaptcha": "^3.0.9",
"@types/node": "^22.15.21",
Expand Down
1 change: 1 addition & 0 deletions src/locales.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./locales/auth-ui-locales"
81 changes: 81 additions & 0 deletions src/locales/auth-ui-locales.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
"use client"
import type { AuthLocalization } from "../lib/auth-localization"
import ar from "./jsons/ar.json"
import bg from "./jsons/bg.json"
import cs from "./jsons/cs.json"
import da from "./jsons/da.json"
import de from "./jsons/de.json"
import el from "./jsons/el.json"
import en from "./jsons/en.json"
import et from "./jsons/et.json"
import fi from "./jsons/fi.json"
import fr from "./jsons/fr.json"
import hu from "./jsons/hu.json"
import id from "./jsons/id.json"
import it from "./jsons/it.json"
import ja from "./jsons/ja.json"
import ko from "./jsons/ko.json"
import lt from "./jsons/lt.json"
import lv from "./jsons/lv.json"
import nb from "./jsons/nb.json"
import nl from "./jsons/nl.json"
import pl from "./jsons/pl.json"
import pt from "./jsons/pt.json"
import ro from "./jsons/ro.json"
import ru from "./jsons/ru.json"
import sk from "./jsons/sk.json"
import sl from "./jsons/sl.json"
import sv from "./jsons/sv.json"
import tr from "./jsons/tr.json"
import uk from "./jsons/uk.json"
import zh from "./jsons/zh.json"

function browserLocale(): string {
return(navigator.language||navigator.languages[0]).split("-")[0]||"";
}

const locales = {
ar, // Arabic
bg, // Bulgarian
cs, // Czech
da, // Danish
de, // German
el, // Greek
en, // English
et, // Estonian
fi, // Finnish
fr, // French
hu, // Hungarian
id, // Indonesian
it, // Italian
ja, // Japanese
ko, // Korean
lt, // Lithuanian
lv, // Latvian
nb, // Norwegian Bokmål
nl, // Dutch
pl, // Polish
pt, // Portuguese
ro, // Romanian
ru, // Russian
sk, // Slovak
sl, // Slovenian
sv, // Swedish
tr, // Turkish
uk, // Ukrainian
zh, // Chinese
} as const;

type LocaleKey = keyof typeof locales;

export const authUILocales: Record<LocaleKey, AuthLocalization> = locales;

function isValidLocale(locale: string): locale is LocaleKey {
return locale in locales;
}

export function useBrowserLocale(): AuthLocalization {
const locale = browserLocale();
return isValidLocale(locale) ? authUILocales[locale] : authUILocales.en;
}

176 changes: 176 additions & 0 deletions src/locales/jsons/ar.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
{
"email": "البريد الإلكتروني",
"password": "كلمة المرور",
"account": "الحساب",
"accounts": "الحسابات",
"accountsDescription": "قم بالتبديل بين حساباتك التي قمت بتسجيل الدخول إليها حالياً.",
"accountsInstructions": "تسجيل الدخول إلى حساب إضافي.",
"addAccount": "إضافة حساب",
"addPasskey": "إضافة مفتاح مرور",
"alreadyHaveAnAccount": "هل لديك حساب بالفعل؟",
"avatar": "الصورة الرمزية",
"avatarDescription": "انقر على الصورة الرمزية لتحميل صورة مخصصة من ملفاتك.",
"avatarInstructions": "الصورة الرمزية اختيارية ولكن يوصى بها بشدة.",
"backupCodeRequired": "مطلوب رمز احتياطي",
"backupCodes": "الرموز الاحتياطية",
"backupCodesDescription": "احفظ هذه الرموز الاحتياطية في مكان آمن. يمكنك استخدامها للوصول إلى حسابك إذا فقدت طريقة المصادقة الثنائية.",
"backupCodePlaceholder": "رمز النسخ الاحتياطي",
"backupCode": "رمز النسخ الاحتياطي",
"backupCodeAction": "حساب الاسترداد",
"cancel": "إلغاء",
"changePassword": "تغيير كلمة المرور",
"changePasswordDescription": "أدخل كلمة المرور الحالية وكلمة مرور جديدة.",
"changePasswordInstructions": "يُرجى استخدام 8 أحرف كحد أدنى.",
"changePasswordSuccess": "تم تغيير كلمة المرور الخاصة بك.",
"confirmPassword": "تأكيد كلمة المرور",
"confirmPasswordPlaceholder": "تأكيد كلمة المرور",
"confirmPasswordRequired": "مطلوب تأكيد كلمة المرور",
"continueWithAuthenticator": "المتابعة مع الموثق",
"copiedToClipboard": "نسخ إلى الحافظة",
"copyToClipboard": "نسخ إلى الحافظة",
"copyAllCodes": "نسخ جميع الرموز",
"continue": "تابع",
"currentPassword": "كلمة المرور الحالية",
"currentPasswordPlaceholder": "كلمة المرور الحالية",
"currentSession": "الدورة الحالية",
"delete": "حذف",
"deleteAvatar": "حذف الصورة الرمزية",
"deleteAccount": "حذف الحساب",
"deleteAccountDescription": "إزالة حسابك وجميع محتوياته بشكل دائم. هذا الإجراء غير قابل للعكس، لذا يرجى المتابعة بحذر.",
"deleteAccountInstructions": "يرجى تأكيد حذف حسابك. هذا الإجراء غير قابل للعكس، لذا يُرجى المتابعة بحذر.",
"deleteAccountVerify": "يرجى التحقق من بريدك الإلكتروني للتحقق من حذف حسابك.",
"deleteAccountSuccess": "تم حذف حسابك.",
"deleteAccountNotFresh": "يجب أن تكون قد قمت بتسجيل الدخول مؤخراً لحذف حسابك.",
"disable": "تعطيل",
"disabledCredentialsDescription": "اختر مزوداً لتسجيل الدخول إلى حسابك",
"dontHaveAnAccount": "ليس لديك حساب؟",
"done": "تم",
"emailDescription": "أدخل عنوان البريد الإلكتروني الذي تريد استخدامه لتسجيل الدخول.",
"emailInstructions": "الرجاء إدخال عنوان بريد إلكتروني صحيح.",
"emailInvalid": "عنوان البريد الإلكتروني غير صالح",
"emailIsTheSame": "البريد الإلكتروني هو نفسه",
"emailPlaceholder": "[email protected]",
"emailRequired": "عنوان البريد الإلكتروني مطلوب",
"emailVerifyChange": "يرجى التحقق من بريدك الإلكتروني للتحقق من التغيير.",
"emailVerification": "يرجى التحقق من بريدك الإلكتروني للحصول على رابط التحقق.",
"enable": "التمكين",
"error": "خطأ",
"isInvalid": "غير صالحة",
"isRequired": "مطلوب",
"isTheSame": "هو نفسه",
"forgotAuthenticator": "هل نسيت المصادقة؟",
"forgotPassword": "نسيت كلمة المرور",
"forgotPasswordAction": "إرسال رابط إعادة التعيين",
"forgotPasswordDescription": "أدخل بريدك الإلكتروني لإعادة تعيين كلمة المرور الخاصة بك",
"forgotPasswordEmail": "تحقق من بريدك الإلكتروني للحصول على رابط إعادة تعيين كلمة المرور.",
"forgotPasswordLink": "هل نسيت كلمة المرور الخاصة بك؟",
"invalidTwoFactorCookie": "ملف تعريف الارتباط بعاملين غير صالح",
"link": "الرابط",
"magicLink": "الرابط السحري",
"magicLinkAction": "إرسال الرابط السحري",
"magicLinkDescription": "أدخل بريدك الإلكتروني لتلقي رابط سحري",
"magicLinkEmail": "تحقق من بريدك الإلكتروني للحصول على الرابط السحري",
"emailOTP": "رمز البريد الإلكتروني",
"emailOTPSendAction": "إرسال الرمز",
"emailOTPVerifyAction": "التحقق من الرمز",
"emailOTPDescription": "أدخل بريدك الإلكتروني لاستلام الرمز",
"emailOTPVerificationSent": "يرجى التحقق من بريدك الإلكتروني للحصول على رمز التحقق.",
"name": "الاسم",
"nameDescription": "يرجى إدخال اسمك الكامل أو اسم العرض.",
"nameInstructions": "يُرجى استخدام 32 حرفاً كحد أقصى.",
"namePlaceholder": "الاسم",
"newPassword": "كلمة مرور جديدة",
"newPasswordPlaceholder": "كلمة مرور جديدة",
"newPasswordRequired": "مطلوب كلمة مرور جديدة",
"oneTimePassword": "كلمة مرور لمرة واحدة",
"orContinueWith": "أو تابع مع",
"passkey": "مفتاح المرور",
"passkeys": "مفاتيح المرور",
"passkeysDescription": "إدارة مفاتيح المرور الخاصة بك للوصول الآمن.",
"passkeysInstructions": "الوصول الآمن إلى حسابك بدون كلمة مرور.",
"apiKeys": "مفاتيح واجهة برمجة التطبيقات",
"apiKeysDescription": "إدارة مفاتيح API الخاصة بك للوصول الآمن.",
"apiKeysInstructions": "أنشئ مفاتيح API للوصول إلى حسابك برمجياً.",
"createApiKey": "إنشاء مفتاح API",
"createApiKeyDescription": "أدخل اسمًا فريدًا لمفتاح API الخاص بك لتمييزه عن المفاتيح الأخرى.",
"apiKeyNamePlaceholder": "مفتاح API جديد",
"apiKeyCreated": "تم إنشاء مفتاح API",
"apiKeyCreatedDescription": "يُرجى نسخ مفتاح API الخاص بك وتخزينه في مكان آمن. لأسباب أمنية لا يمكننا إظهاره مرة أخرى.",
"neverExpires": "لا تنتهي صلاحيتها",
"expires": "تنتهي صلاحيتها",
"noExpiration": "لا يوجد انتهاء صلاحية",
"create": "إنشاء",
"passwordPlaceholder": "كلمة المرور",
"passwordRequired": "كلمة المرور مطلوبة",
"passwordsDoNotMatch": "كلمات المرور غير متطابقة",
"providers": "المزودون",
"providersDescription": "ربط حسابك بخدمة طرف ثالث.",
"recoverAccount": "حساب الاسترداد",
"recoverAccountAction": "حساب الاسترداد",
"recoverAccountDescription": "الرجاء إدخال رمز النسخ الاحتياطي للوصول إلى حسابك",
"rememberMe": "تذكّرني",
"resendCode": "إعادة إرسال الرمز",
"resendVerificationEmail": "إعادة إرسال البريد الإلكتروني للتحقق",
"resetPassword": "إعادة تعيين كلمة المرور",
"resetPasswordAction": "حفظ كلمة المرور الجديدة",
"resetPasswordDescription": "أدخل كلمة المرور الجديدة أدناه",
"resetPasswordInvalidToken": "رابط إعادة تعيين كلمة المرور غير صالح",
"resetPasswordSuccess": "تمت إعادة تعيين كلمة المرور بنجاح",
"requestFailed": "فشل الطلب",
"revoke": "الإلغاء",
"deleteApiKey": "حذف مفتاح API",
"deleteApiKeyConfirmation": "هل أنت متأكد من رغبتك في حذف مفتاح API هذا؟",
"apiKey": "مفتاح واجهة برمجة التطبيقات",
"signIn": "تسجيل الدخول",
"signInAction": "تسجيل الدخول",
"signInDescription": "أدخل بريدك الإلكتروني أدناه لتسجيل الدخول إلى حسابك",
"signInUsernameDescription": "أدخل اسم المستخدم أو البريد الإلكتروني لتسجيل الدخول إلى حسابك",
"signInWith": "تسجيل الدخول باستخدام",
"signOut": "تسجيل الخروج",
"signUp": "التسجيل",
"signUpAction": "إنشاء حساب",
"signUpDescription": "أدخل معلوماتك لإنشاء حساب",
"signUpEmail": "تحقق من بريدك الإلكتروني للحصول على رابط التحقق.",
"sessions": "الجلسات",
"sessionsDescription": "إدارة جلساتك النشطة وإلغاء الوصول.",
"setPassword": "تعيين كلمة المرور",
"setPasswordDescription": "انقر على الزر أدناه لتلقي رسالة بريد إلكتروني لإعداد كلمة مرور لحسابك.",
"settings": "الإعدادات",
"save": "الحفظ",
"security": "الأمن",
"switchAccount": "تبديل الحساب",
"trustDevice": "ثق بهذا الجهاز",
"twoFactor": "عاملان",
"twoFactorAction": "التحقق من الرمز",
"twoFactorDescription": "الرجاء إدخال كلمة المرور لمرة واحدة للمتابعة",
"twoFactorCardDescription": "أضف طبقة أمان إضافية إلى حسابك.",
"twoFactorDisableInstructions": "الرجاء إدخال كلمة المرور لتعطيل المصادقة الثنائية (2FA).",
"twoFactorEnableInstructions": "الرجاء إدخال كلمة المرور الخاصة بك لتمكين المصادقة الثنائية (2FA).",
"twoFactorEnabled": "تم تمكين المصادقة الثنائية",
"twoFactorDisabled": "تم تعطيل المصادقة الثنائية العامل الثاني",
"twoFactorPrompt": "المصادقة الثنائية",
"twoFactorTotpLabel": "امسح رمز الاستجابة السريعة باستخدام أداة التوثيق الخاصة بك",
"sendVerificationCode": "إرسال رمز التحقق",
"unlink": "فك الارتباط",
"updatedSuccessfully": "تم التحديث بنجاح",
"username": "اسم المستخدم",
"usernameDescription": "أدخل اسم المستخدم الذي تريد استخدامه لتسجيل الدخول.",
"usernameInstructions": "يُرجى استخدام 32 حرفاً كحد أقصى.",
"usernamePlaceholder": "اسم المستخدم",
"signInUsernamePlaceholder": "اسم المستخدم أو البريد الإلكتروني",
"verifyYourEmail": "التحقق من بريدك الإلكتروني",
"verifyYourEmailDescription": "يرجى التحقق من عنوان بريدك الإلكتروني. تحقق من صندوق الوارد الخاص بك للحصول على البريد الإلكتروني للتحقق. إذا لم تستلم البريد الإلكتروني، انقر على الزر أدناه لإعادة الإرسال.",
"goBack": "ارجع",
"invalidEmailOrPassword": "البريد الإلكتروني أو كلمة المرور غير صالحة",
"passwordInvalid": "كلمة مرور غير صالحة",
"sessionNotFresh": "جلستك ليست حديثة. يرجى تسجيل الدخول مرة أخرى.",
"sessionExpired": "انتهت صلاحية الجلسة",
"passwordTooShort": "كلمة المرور قصيرة جداً",
"passwordTooLong": "كلمة المرور طويلة جداً",
"uploadAvatar": "تحميل الصورة الرمزية",
"privacyPolicy": "سياسة الخصوصية",
"termsOfService": "شروط الخدمة",
"protectedByRecaptcha": "هذا الموقع محمي بواسطة reCAPTCHA.",
"byContinuingYouAgree": "من خلال المتابعة، فإنك توافق على",
"missingCaptchaResponse": "استجابة CAPTCHA مفقودة"
}
Loading