diff --git a/.changeset/complete-persian-localization.md b/.changeset/complete-persian-localization.md new file mode 100644 index 00000000000..10153d58ffc --- /dev/null +++ b/.changeset/complete-persian-localization.md @@ -0,0 +1,15 @@ +--- +'@clerk/localizations': minor +--- + +Complete Persian (fa-IR) localization with all missing translations + +This update completes the Persian localization by: +- Translating all undefined API key management strings +- Adding complete commerce/billing translations +- Completing organization profile translations +- Adding all missing error messages +- Including form labels and placeholders +- Adding fa-IR to package.json files array for proper publishing + +The Persian localization now provides a complete user experience for Persian-speaking users. diff --git a/.changeset/small-schools-yell.md b/.changeset/small-schools-yell.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/small-schools-yell.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 68da7ca1593..b984ce579b5 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -63,6 +63,7 @@ "en-US", "es-CR", "es-ES", + "fa-IR", "fi-FI", "fr-FR", "he-IL", diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index d954e9b5748..1823c86b13e 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -15,36 +15,37 @@ import type { LocalizationResource } from '@clerk/types'; export const faIR: LocalizationResource = { locale: 'fa-IR', apiKeys: { - action__add: undefined, - action__search: undefined, - createdAndExpirationStatus__expiresOn: undefined, - createdAndExpirationStatus__never: undefined, - detailsTitle__emptyRow: undefined, - formButtonPrimary__add: undefined, - formFieldCaption__expiration__expiresOn: undefined, - formFieldCaption__expiration__never: undefined, - formFieldOption__expiration__180d: undefined, - formFieldOption__expiration__1d: undefined, - formFieldOption__expiration__1y: undefined, - formFieldOption__expiration__30d: undefined, - formFieldOption__expiration__60d: undefined, - formFieldOption__expiration__7d: undefined, - formFieldOption__expiration__90d: undefined, - formFieldOption__expiration__never: undefined, - formHint: undefined, - formTitle: undefined, - lastUsed__days: undefined, - lastUsed__hours: undefined, - lastUsed__minutes: undefined, - lastUsed__months: undefined, - lastUsed__seconds: undefined, - lastUsed__years: undefined, - menuAction__revoke: undefined, + action__add: 'افزودن کلید جدید', + action__search: 'جستجوی کلیدها', + createdAndExpirationStatus__expiresOn: + "ایجاد شده {{ createdDate | shortDate('en-US') }} • منقضی می‌شود {{ expiresDate | longDate('en-US') }}", + createdAndExpirationStatus__never: "ایجاد شده {{ createdDate | shortDate('en-US') }} • هرگز منقضی نمی‌شود", + detailsTitle__emptyRow: 'هیچ کلید API یافت نشد', + formButtonPrimary__add: 'ایجاد کلید', + formFieldCaption__expiration__expiresOn: 'منقضی می‌شود {{ date }}', + formFieldCaption__expiration__never: 'این کلید هرگز منقضی نخواهد شد', + formFieldOption__expiration__180d: '۱۸۰ روز', + formFieldOption__expiration__1d: '۱ روز', + formFieldOption__expiration__1y: '۱ سال', + formFieldOption__expiration__30d: '۳۰ روز', + formFieldOption__expiration__60d: '۶۰ روز', + formFieldOption__expiration__7d: '۷ روز', + formFieldOption__expiration__90d: '۹۰ روز', + formFieldOption__expiration__never: 'هرگز', + formHint: 'نامی برای تولید کلید جدید ارائه دهید. در هر زمان می‌توانید آن را لغو کنید.', + formTitle: 'افزودن کلید API جدید', + lastUsed__days: '{{days}} روز پیش', + lastUsed__hours: '{{hours}} ساعت پیش', + lastUsed__minutes: '{{minutes}} دقیقه پیش', + lastUsed__months: '{{months}} ماه پیش', + lastUsed__seconds: '{{seconds}} ثانیه پیش', + lastUsed__years: '{{years}} سال پیش', + menuAction__revoke: 'لغو کلید', revokeConfirmation: { - confirmationText: undefined, - formButtonPrimary__revoke: undefined, - formHint: undefined, - formTitle: undefined, + confirmationText: 'لغو', + formButtonPrimary__revoke: 'لغو کلید', + formHint: 'آیا مطمئن هستید که می‌خواهید این کلید محرمانه را حذف کنید؟', + formTitle: 'کلید محرمانه "{{apiKeyName}}" لغو شود؟', }, }, backButton: 'بازگشت', @@ -55,14 +56,14 @@ export const faIR: LocalizationResource = { badge__endsAt: "به پایان می رسد {{ date | shortDate('en-US') }}", badge__expired: 'مننقضی شده', badge__otherImpersonatorDevice: 'دستگاه جعل هویت دیگر', - badge__pastDueAt: undefined, - badge__pastDuePlan: undefined, + badge__pastDueAt: "سررسید گذشته {{ date | shortDate('en-US') }}", + badge__pastDuePlan: 'سررسید گذشته', badge__primary: 'اولیه', badge__renewsAt: "{{ date | shortDate('en-US') }} را تمدید می‌کند", badge__requiresAction: 'نیاز به اقدام دارد', badge__startsAt: "شروع می‌شود {{ date | shortDate('en-US') }}", badge__thisDevice: 'این دستگاه', - badge__trialEndsAt: undefined, + badge__trialEndsAt: "آزمایشی پایان می‌یابد {{ date | shortDate('en-US') }}", badge__unverified: 'تایید نشده', badge__upcomingPlan: 'به زودی', badge__userDevice: 'دستگاه کاربر', @@ -81,7 +82,7 @@ export const faIR: LocalizationResource = { cancelSubscriptionTitle: 'اشتراک {{plan}} لغو شود؟', cannotSubscribeMonthly: 'شما نمی‌توانید با پرداخت ماهانه در این طرح مشترک شوید. برای عضویت در این طرح، باید پرداخت سالانه را انتخاب کنید.', - cannotSubscribeUnrecoverable: undefined, + cannotSubscribeUnrecoverable: 'شما نمی‌توانید در این طرح مشترک شوید. اشتراک موجود شما گران‌تر از این طرح است.', checkout: { description__paymentSuccessful: 'پرداخت شما با موفقیت انجام شد.', description__subscriptionSuccessful: 'اشتراک شما با موفقیت ایجاد شد.', @@ -98,13 +99,13 @@ export const faIR: LocalizationResource = { title__subscriptionBegins: 'شروع اشتراک', title__totalPaid: 'کل پرداختی', }, - pastDueNotice: undefined, + pastDueNotice: 'اشتراک قبلی شما سررسید گذشته بود، بدون پرداخت.', perMonth: 'ماهانه', title: 'تسویه حساب', title__paymentSuccessful: 'پرداخت موفقیت آمیز بود!', title__subscriptionSuccessful: 'موفقیت آمیز!', }, - credit: undefined, + credit: 'اعتبار', creditRemainder: 'اعتبار برای باقیمانده اشتراک فعلی شما.', defaultFreePlanActive: 'شما در حال حاضر در طرح رایگان هستید', free: 'رایگان', @@ -138,29 +139,29 @@ export const faIR: LocalizationResource = { }, reSubscribe: 'اشتراک مجدد', seeAllFeatures: 'مشاهده همه ویژگی‌ها', - startFreeTrial: undefined, + startFreeTrial: 'شروع آزمایش رایگان {{days}} روزه', subscribe: 'مشترک شوید', subscriptionDetails: { - beginsOn: undefined, - currentBillingCycle: undefined, - endsOn: undefined, - nextPaymentAmount: undefined, - nextPaymentOn: undefined, - pastDueAt: undefined, - renewsAt: undefined, - subscribedOn: undefined, - title: undefined, + beginsOn: 'شروع در', + currentBillingCycle: 'دوره صورتحساب فعلی', + endsOn: 'پایان در', + nextPaymentAmount: 'مبلغ پرداخت بعدی', + nextPaymentOn: 'پرداخت بعدی در', + pastDueAt: 'سررسید گذشته در', + renewsAt: 'تمدید در', + subscribedOn: 'مشترک شده در', + title: 'اشتراک', }, subtotal: 'جمع فرعی', switchPlan: 'به این طرح تغییر دهید', switchToAnnual: 'به سالانه تغییر دهید', - switchToAnnualWithAnnualPrice: undefined, + switchToAnnualWithAnnualPrice: 'تغییر به سالانه {{currency}}{{price}} / سال', switchToMonthly: 'به ماهانه تغییر دهید', - switchToMonthlyWithPrice: undefined, - totalDue: undefined, + switchToMonthlyWithPrice: 'تغییر به ماهانه {{currency}}{{price}} / ماه', + totalDue: 'کل مبلغ سررسید', totalDueToday: 'سررسید کل امروز', viewFeatures: 'مشاهده ویژگی ها', - viewPayment: undefined, + viewPayment: 'مشاهده پرداخت', year: 'سال', }, createOrganization: { @@ -193,9 +194,9 @@ export const faIR: LocalizationResource = { formFieldHintText__optional: 'اختیاری', formFieldHintText__slug: 'اسلاگ یک شناسه قابل خواندن توسط انسان است که باید منحصر به فرد باشد. اغلب در URL ها استفاده می شود.', - formFieldInputPlaceholder__apiKeyDescription: undefined, - formFieldInputPlaceholder__apiKeyExpirationDate: undefined, - formFieldInputPlaceholder__apiKeyName: undefined, + formFieldInputPlaceholder__apiKeyDescription: 'توضیح کوتاهی از کاربرد این کلید وارد کنید', + formFieldInputPlaceholder__apiKeyExpirationDate: 'تاریخ انقضا را انتخاب کنید', + formFieldInputPlaceholder__apiKeyName: 'نام کلید API را وارد کنید', formFieldInputPlaceholder__backupCode: 'کد پشتیبان را وارد کنید', formFieldInputPlaceholder__confirmDeletionUserAccount: 'حذف حساب', formFieldInputPlaceholder__emailAddress: 'آدرس ایمیل خود را وارد کنید', @@ -209,10 +210,10 @@ export const faIR: LocalizationResource = { formFieldInputPlaceholder__organizationSlug: 'my-org', formFieldInputPlaceholder__password: 'رمز عبور خود را وارد کنید', formFieldInputPlaceholder__phoneNumber: 'شماره تلفن خود را وارد کنید', - formFieldInputPlaceholder__username: undefined, - formFieldLabel__apiKeyDescription: undefined, - formFieldLabel__apiKeyExpiration: undefined, - formFieldLabel__apiKeyName: undefined, + formFieldInputPlaceholder__username: 'نام کاربری خود را وارد کنید', + formFieldLabel__apiKeyDescription: 'توضیحات کلید API', + formFieldLabel__apiKeyExpiration: 'انقضای کلید API', + formFieldLabel__apiKeyName: 'نام کلید API', formFieldLabel__automaticInvitations: 'دعوت‌های خودکار را برای این دامنه فعال کنید', formFieldLabel__backupCode: 'کد پشتیبان', formFieldLabel__confirmDeletion: 'تایید', @@ -258,7 +259,7 @@ export const faIR: LocalizationResource = { }, organizationProfile: { apiKeysPage: { - title: undefined, + title: 'کلیدهای API', }, badge__automaticInvitation: 'دعوت نامه های خودکار', badge__automaticSuggestion: 'پیشنهادات خودکار', @@ -266,11 +267,11 @@ export const faIR: LocalizationResource = { badge__unverified: 'تایید نشده', billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'تاریخچه پرداخت خالی است', + notFound: 'هیچ پرداختی یافت نشد', + tableHeader__amount: 'مبلغ', + tableHeader__date: 'تاریخ', + tableHeader__status: 'وضعیت', }, paymentSourcesSection: { actionLabel__default: 'پیش فرض کنید', @@ -291,21 +292,21 @@ export const faIR: LocalizationResource = { title: 'روش های پرداخت', }, start: { - headerTitle__payments: undefined, + headerTitle__payments: 'پرداخت‌ها', headerTitle__plans: 'طرح ها', headerTitle__statements: 'بیانیه‌ها', headerTitle__subscriptions: 'اشتراک ها', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'بیانیه‌ها خالی است', + itemCaption__paidForPlan: 'پرداخت شده برای طرح {{plan}}', + itemCaption__proratedCredit: 'اعتبار تناسبی', + itemCaption__subscribedAndPaidForPlan: 'مشترک و پرداخت شده برای طرح {{plan}}', + notFound: 'هیچ بیانیه‌ای یافت نشد', + tableHeader__amount: 'مبلغ', + tableHeader__date: 'تاریخ', + title: 'بیانیه‌ها', + totalPaid: 'کل پرداختی', }, subscriptionsListSection: { actionLabel__newSubscription: 'در یک طرح مشترک شوید', @@ -380,7 +381,7 @@ export const faIR: LocalizationResource = { }, }, navbar: { - apiKeys: undefined, + apiKeys: 'کلیدهای API', billing: 'صورتحساب', description: 'سازمان خود را مدیریت کنید', general: 'عمومی', @@ -699,7 +700,7 @@ export const faIR: LocalizationResource = { title: 'با {{provider}} وارد {{applicationName}} شوید', }, subtitle: 'خوش آمدید! لطفا برای ادامه وارد شوید', - subtitleCombined: undefined, + subtitleCombined: 'برای ادامه به {{applicationName}}، جزئیات خود را وارد کنید', title: 'وارد {{applicationName}} شوید', titleCombined: 'ادامه به {{applicationName}}', }, @@ -802,63 +803,63 @@ export const faIR: LocalizationResource = { socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { chooseOrganization: { - action__createOrganization: undefined, - action__invitationAccept: undefined, - action__suggestionsAccept: undefined, - subtitle: undefined, - suggestionsAcceptedLabel: undefined, - title: undefined, + action__createOrganization: 'ایجاد سازمان', + action__invitationAccept: 'بپیوندید', + action__suggestionsAccept: 'درخواست عضویت', + subtitle: 'برای ادامه، سازمانی را انتخاب کنید', + suggestionsAcceptedLabel: 'در انتظار تایید', + title: 'یک سازمان انتخاب کنید', }, createOrganization: { - formButtonReset: undefined, - formButtonSubmit: undefined, - subtitle: undefined, - title: undefined, + formButtonReset: 'گذشتن', + formButtonSubmit: 'ایجاد سازمان', + subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید', + title: 'ایجاد سازمان جدید', }, signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'خروج از همه حساب‌ها', + actionText: 'می‌خواهید خارج شوید؟', }, }, unstable__errors: { already_a_member_in_organization: '{{email}} از قبل عضو سازمان است.', - captcha_invalid: undefined, + captcha_invalid: 'کپچا نامعتبر است. لطفاً دوباره امتحان کنید.', captcha_unavailable: 'به دلیل عدم موفقیت در اعتبارسنجی ربات، ثبت نام ناموفق بود. لطفاً برای امتحان مجدد، صفحه را رفرش کنید یا برای راهنمایی بیشتر با پشتیبانی تماس بگیرید.', - form_code_incorrect: undefined, - form_identifier_exists__email_address: undefined, - form_identifier_exists__phone_number: undefined, - form_identifier_exists__username: undefined, - form_identifier_not_found: undefined, - form_param_format_invalid: undefined, - form_param_format_invalid__email_address: undefined, - form_param_format_invalid__phone_number: undefined, - form_param_max_length_exceeded__first_name: undefined, - form_param_max_length_exceeded__last_name: undefined, - form_param_max_length_exceeded__name: undefined, - form_param_nil: undefined, - form_param_type_invalid: undefined, - form_param_type_invalid__email_address: undefined, - form_param_type_invalid__phone_number: undefined, - form_param_value_invalid: undefined, - form_password_incorrect: undefined, + form_code_incorrect: 'کد وارد شده نادرست است.', + form_identifier_exists__email_address: 'این آدرس ایمیل قبلاً استفاده شده است.', + form_identifier_exists__phone_number: 'این شماره تلفن قبلاً استفاده شده است.', + form_identifier_exists__username: 'این نام کاربری قبلاً گرفته شده است.', + form_identifier_not_found: 'شناسه یافت نشد.', + form_param_format_invalid: 'فرمت پارامتر نامعتبر است.', + form_param_format_invalid__email_address: 'آدرس ایمیل نامعتبر است.', + form_param_format_invalid__phone_number: 'شماره تلفن نامعتبر است.', + form_param_max_length_exceeded__first_name: 'نام نباید بیشتر از حد مجاز طولانی باشد.', + form_param_max_length_exceeded__last_name: 'نام خانوادگی نباید بیشتر از حد مجاز طولانی باشد.', + form_param_max_length_exceeded__name: 'نام نباید بیشتر از حد مجاز طولانی باشد.', + form_param_nil: 'پارامتر مورد نیاز است.', + form_param_type_invalid: 'نوع پارامتر نامعتبر است.', + form_param_type_invalid__email_address: 'آدرس ایمیل باید یک رشته معتبر باشد.', + form_param_type_invalid__phone_number: 'شماره تلفن باید یک رشته معتبر باشد.', + form_param_value_invalid: 'مقدار پارامتر نامعتبر است.', + form_password_incorrect: 'رمز عبور نادرست است.', form_password_length_too_short: 'رمز عبور شما خیلی کوتاه است. باید حداقل ۸ کاراکتر داشته باشد.', form_password_not_strong_enough: 'رمز عبور شما به اندازه کافی قوی نیست.', form_password_pwned: 'این رمز عبور به عنوان بخشی از یک نقض امنیتی یافت شده و قابل استفاده نیست، لطفاً رمز عبور دیگری را امتحان کنید.', form_password_pwned__sign_in: 'این رمز عبور به عنوان بخشی از یک نقض امنیتی یافت شده و قابل استفاده نیست، لطفاً رمز عبور خود را مجدداً تنظیم کنید.', - form_password_size_in_bytes_exceeded: undefined, - form_password_validation_failed: undefined, - form_username_invalid_character: undefined, + form_password_size_in_bytes_exceeded: 'رمز عبور خیلی طولانی است.', + form_password_validation_failed: 'اعتبارسنجی رمز عبور ناموفق بود.', + form_username_invalid_character: 'نام کاربری شامل کاراکترهای نامعتبر است.', form_username_invalid_length: 'نام کاربری شما باید بین {{min_length}} و {{max_length}} کاراکتر باشد.', - identification_deletion_failed: undefined, - not_allowed_access: undefined, - organization_domain_blocked: undefined, - organization_domain_common: undefined, - organization_domain_exists_for_enterprise_connection: undefined, - organization_membership_quota_exceeded: undefined, - organization_minimum_permissions_needed: undefined, + identification_deletion_failed: 'حذف شناسه ناموفق بود.', + not_allowed_access: 'دسترسی مجاز نیست.', + organization_domain_blocked: 'دامنه سازمان مسدود شده است.', + organization_domain_common: 'دامنه سازمان عمومی است و قابل قبول نیست.', + organization_domain_exists_for_enterprise_connection: 'این دامنه برای اتصال سازمانی موجود است.', + organization_membership_quota_exceeded: 'حد مجاز عضویت سازمان تجاوز شده است.', + organization_minimum_permissions_needed: 'حداقل مجوزهای مورد نیاز برای سازمان الزامی است.', passkey_already_exists: 'یک کلید عبور از قبل در این دستگاه ثبت شده است.', passkey_not_supported: 'کلیدهای عبور در این دستگاه پشتیبانی نمی‌شوند.', passkey_pa_not_supported: 'ثبت نام نیاز به یک احراز هویت کننده پلتفرم دارد اما دستگاه از آن پشتیبانی نمی‌کند.', @@ -873,8 +874,8 @@ export const faIR: LocalizationResource = { requireUppercase: 'یک حرف بزرگ', sentencePrefix: 'رمز عبور شما باید حاوی', }, - phone_number_exists: undefined, - session_exists: undefined, + phone_number_exists: 'این شماره تلفن قبلاً استفاده شده است.', + session_exists: 'جلسه از قبل وجود دارد.', web3_missing_identifier: 'افزونه‌ی کیف پول وب۳ پیدا نشد. برای ادامه، لطفاً یکی نصب کنید.', zxcvbn: { couldBeStronger: 'رمز عبور شما کار می‌کند، اما می‌توانست قوی‌تر باشد. سعی کنید کاراکترهای بیشتری اضافه کنید.', @@ -924,7 +925,7 @@ export const faIR: LocalizationResource = { }, userProfile: { apiKeysPage: { - title: undefined, + title: 'کلیدهای API', }, backupCodePage: { actionLabel__copied: 'کپی شده!', @@ -944,11 +945,11 @@ export const faIR: LocalizationResource = { }, billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'تاریخچه پرداخت خالی است', + notFound: 'هیچ پرداختی یافت نشد', + tableHeader__amount: 'مبلغ', + tableHeader__date: 'تاریخ', + tableHeader__status: 'وضعیت', }, paymentSourcesSection: { actionLabel__default: 'پیش فرض کنید', @@ -969,28 +970,28 @@ export const faIR: LocalizationResource = { title: 'روش های پرداخت', }, start: { - headerTitle__payments: undefined, + headerTitle__payments: 'پرداخت‌ها', headerTitle__plans: 'طرح ها', headerTitle__statements: 'بیانیه‌ها', headerTitle__subscriptions: 'اشتراک', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'بیانیه‌ها خالی است', + itemCaption__paidForPlan: 'پرداخت شده برای طرح {{plan}}', + itemCaption__proratedCredit: 'اعتبار تناسبی', + itemCaption__subscribedAndPaidForPlan: 'مشترک و پرداخت شده برای طرح {{plan}}', + notFound: 'هیچ بیانیه‌ای یافت نشد', + tableHeader__amount: 'مبلغ', + tableHeader__date: 'تاریخ', + title: 'بیانیه‌ها', + totalPaid: 'کل پرداختی', }, subscriptionsListSection: { actionLabel__newSubscription: 'در یک طرح مشترک شوید', actionLabel__switchPlan: 'تغییر طرح', - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, + tableHeader__edit: 'ویرایش', + tableHeader__plan: 'طرح', + tableHeader__startDate: 'تاریخ شروع', title: 'اشتراک', }, subscriptionsSection: { @@ -1108,7 +1109,7 @@ export const faIR: LocalizationResource = { mobileButton__menu: 'منو', navbar: { account: 'نمایه', - apiKeys: undefined, + apiKeys: 'کلیدهای API', billing: 'صورتحساب', description: 'اطلاعات حساب خود را مدیریت کنید.', security: 'امنیت',