diff --git a/frontend/apps/remark42/app/locales/fa.json b/frontend/apps/remark42/app/locales/fa.json
new file mode 100644
index 0000000000..24f8b29e53
--- /dev/null
+++ b/frontend/apps/remark42/app/locales/fa.json
@@ -0,0 +1,182 @@
+{
+ "auth.back": "بازگشت",
+ "auth.email-address": "آدرس ایمیل",
+ "auth.loading": "در حال بارگذاری...",
+ "auth.oauth-button": "ورود با {provider}",
+ "auth.oauth-source": "استفاده از شبکه اجتماعی",
+ "auth.open-profile": "نمایش پروفایل من",
+ "auth.or": "یا",
+ "auth.signin": "ورود",
+ "auth.signout": "خروج",
+ "auth.submit": "ارسال",
+ "auth.symbols-restriction": "نام کاربری باید فقط شامل حروف، اعداد، زیرخط یا فضا باشد",
+ "auth.telegram-check": "بررسی",
+ "auth.telegram-link": "از طریق لینک",
+ "auth.telegram-message-1": "تلگرام را باز کنید",
+ "auth.telegram-message-2": "و در آنجا روی “شروع” کلیک کنید.",
+ "auth.telegram-message-3": "سپس، روی “بررسی” زیر کلیک کنید.",
+ "auth.telegram-optional-qr": "یا با اسکن کد QR",
+ "auth.telegram-qr": "کد QR تلگرام",
+ "auth.user-not-found": "هیچ کاربری پیدا نشد",
+ "auth.username": "نام کاربری",
+ "authPanel.disable-comments": "غیرفعال کردن نظرات",
+ "authPanel.disabled-cookies": "غیرفعال کردن مسدودسازی کوکیهای شخص ثالث برای ورود یا باز کردن نظرات",
+ "authPanel.enable-comments": "فعال کردن نظرات",
+ "authPanel.enable-cookies": "اجازه دادن به کوکیها برای ورود و نظر دادن",
+ "authPanel.hide-settings": "پنهان کردن تنظیمات",
+ "authPanel.new-page": "صفحه جدید",
+ "authPanel.read-only": "فقط خواندنی",
+ "authPanel.show-settings": "نمایش تنظیمات",
+ "blockingDuration.day": "برای یک روز",
+ "blockingDuration.month": "برای یک ماه",
+ "blockingDuration.permanently": "به طور دائمی",
+ "blockingDuration.week": "برای یک هفته",
+ "comment.block": "مسدود کردن",
+ "comment.block-user": "آیا میخواهید {userName} را {duration} مسدود کنید؟",
+ "comment.blocked-user": "مسدود شده",
+ "comment.blocking-period": "دوره مسدودسازی",
+ "comment.cancel": "لغو",
+ "comment.copied": "کپی شد!",
+ "comment.copy": "کپی",
+ "comment.delete": "حذف",
+ "comment.delete-message": "آیا میخواهید این نظر را حذف کنید؟",
+ "comment.deleted-comment": "این نظر حذف شد",
+ "comment.deleted-user": "حذف شده",
+ "comment.edit": "ویرایش",
+ "comment.edit-countdown": "ویرایش غیرفعال خواهد شد",
+ "comment.expired-time": "زمان ویرایش منقضی شده است.",
+ "comment.go-to-parent": "رفتن به نظر والد",
+ "comment.hide": "پنهان کردن",
+ "comment.hide-user-comment": "آیا میخواهید نظرات {userName} را پنهان کنید؟",
+ "comment.paid-patreon": "مشترک پرداختی پاترئون",
+ "comment.pin": "سنجاق کردن",
+ "comment.pin-comment": "آیا میخواهید این نظر را سنجاق کنید؟",
+ "comment.reply": "پاسخ",
+ "comment.time": "{day} در {time}",
+ "comment.toggle-verification": "تغییر وضعیت تأیید",
+ "comment.unblock": "رفع مسدودیت",
+ "comment.unblock-user": "آیا میخواهید این کاربر را رفع مسدود کنید؟",
+ "comment.unpin": "برداشتن سنجاق",
+ "comment.unpin-comment": "آیا میخواهید این نظر را از سنجاق بردارید؟",
+ "comment.unverified-user": "کاربر تأیید نشده",
+ "comment.unverify-user": "آیا میخواهید {userName} را تأیید نکنید؟",
+ "comment.verified-user": "کاربر تأیید شده",
+ "comment.verify-user": "آیا میخواهید {userName} را تأیید کنید؟",
+ "commentForm.anonymous-uploading-disabled": "بارگذاری تصویر برای کاربران ناشناس غیرفعال است. لطفاً به عنوان کاربر ناشناس وارد نشوید تا بتوانید تصاویر را پیوست کنید.",
+ "commentForm.exceeded-size": "{fileName} از حد مجاز اندازه {maxImageSize} فراتر رفته است",
+ "commentForm.input-placeholder": "نظر خود را وارد نمایید",
+ "commentForm.new-comment": "نظر جدید",
+ "commentForm.notice-about-styling": "استفاده از Markdown پشتیبانی میشود",
+ "commentForm.preview": "پیشنمایش",
+ "commentForm.reply": "پاسخ",
+ "commentForm.save": "ذخیره",
+ "commentForm.send": "ارسال",
+ "commentForm.subscribe-by": "مشترک شدن توسط",
+ "commentForm.subscribe-or": "یا",
+ "commentForm.unauthorized-uploading-disabled": "بارگذاری تصویر برای کاربران غیرمجاز غیرفعال است. شما باید قبل از بارگذاری وارد شوید.",
+ "commentForm.unexpected-error": "مشکلی پیش آمده است. لطفاً کمی بعد دوباره تلاش کنید.",
+ "commentForm.upload-file-fail": "{fileName} بارگذاری با خطای \"{errorMessage}\" ناموفق بود",
+ "commentForm.uploading": "در حال بارگذاری...",
+ "commentForm.uploading-file": "در حال بارگذاری {fileName}...",
+ "commentsSort.best": "بهترین",
+ "commentsSort.least-controversial": "کمترین جنجالی",
+ "commentsSort.least-recently-updated": "کمترین بهروز شده",
+ "commentsSort.most-controversial": "بیشترین جنجالی",
+ "commentsSort.newest": "جدیدترین",
+ "commentsSort.oldest": "قدیمیترین",
+ "commentsSort.recently-updated": "به تازگی بهروز شده",
+ "commentsSort.worst": "بدترین",
+ "empty-state": "هنوز نظری وجود ندارد",
+ "errors.0": "مشکلی پیش آمده است. لطفاً کمی بعد دوباره تلاش کنید.",
+ "errors.1": "نظر پیدا نشد. لطفاً صفحه را تازهسازی کنید و دوباره تلاش کنید.",
+ "errors.10": "برای ویرایش نظر خیلی دیر شده است.",
+ "errors.11": "نظر قبلاً پاسخی دارد، ویرایش ممکن نیست.",
+ "errors.12": "نتیجه رأیگیری را نمیتوان ذخیره کرد. لطفاً کمی بعد دوباره تلاش کنید.",
+ "errors.13": "شما نمیتوانید برای نظر خود رأی دهید.",
+ "errors.14": "شما قبلاً برای این نظر رأی دادهاید.",
+ "errors.15": "رأیهای زیادی برای این نظر وجود دارد.",
+ "errors.16": "حداقل امتیاز برای نظر رسیده است.",
+ "errors.17": "عملیات رد شد. لطفاً کمی بعد دوباره تلاش کنید.",
+ "errors.18": "فایل درخواستی پیدا نشد.",
+ "errors.19": "نظر شامل کلمات ممنوعه است.",
+ "errors.2": "عدم موفقیت در تجزیه درخواست ورودی.",
+ "errors.20": "تصویر ارسال شده پیدا نشد. لطفاً دوباره آن را بارگذاری کنید.",
+ "errors.3": "شما اجازه انجام این عملیات را ندارید.",
+ "errors.4": "دادههای نظر نامعتبر است.",
+ "errors.5": "نظر پیدا نشد. لطفاً صفحه را تازهسازی کنید و دوباره تلاش کنید.",
+ "errors.6": "سایت پیدا نشد. لطفاً صفحه را تازهسازی کنید و دوباره تلاش کنید.",
+ "errors.7": "کاربر مسدود شده است.",
+ "errors.8": "نمیتوان نظرات را در این صفحه ارسال کرد. نظرات فقط خواندنی هستند.",
+ "errors.9": "تغییر نظر ناموفق بود. لطفاً کمی بعد دوباره تلاش کنید.",
+ "errors.conflict": "تعارض.",
+ "errors.failed-fetch": "عدم موفقیت در دریافت. لطفاً اتصال اینترنت خود را بررسی کنید یا کمی بعد دوباره تلاش کنید.",
+ "errors.forbidden": "ممنوع.",
+ "errors.not-authorized": "مجوز ندارید.",
+ "errors.to-many-request": "شما به حداکثر حد درخواست رسیدهاید.",
+ "errors.unexpected-error": "مشکلی پیش آمده است.",
+ "profile.close": "بستن پروفایل",
+ "profile.request-to-delete-data": "درخواست حذف دادههای من",
+ "retry": "دوباره تلاش کنید",
+ "root.pinned-comments": "نظرات سنجاق شده",
+ "root.powered-by": "توسعه داده شده توسط Remark42",
+ "root.show-more": "نمایش بیشتر",
+ "settings.block": "مسدود کردن",
+ "settings.block-time": "تا {day} در {time}",
+ "settings.block-user": "آیا میخواهید {userName} را مسدود کنید؟",
+ "settings.blocked-users-header": "کاربران مسدود شده:",
+ "settings.blocked-users-title": "کاربران مسدود شده",
+ "settings.hidden-user-header": "کاربران پنهان شده:",
+ "settings.hidden-users-title": "کاربران پنهان شده",
+ "settings.hide": "پنهان کردن",
+ "settings.no-blocked-users": "هیچ کاربر مسدود شدهای وجود ندارد.",
+ "settings.no-hidden-users": "هیچ کاربر پنهان شدهای وجود ندارد.",
+ "settings.permanently": "به طور دائمی",
+ "settings.show": "نمایش",
+ "settings.unblock": "رفع مسدودیت",
+ "settings.unblock-user": "آیا میخواهید {userName} را رفع مسدود کنید؟",
+ "settings.unknown": "ناشناس",
+ "sort-by": "مرتبسازی بر اساس",
+ "subscribeByEmail.back": "بازگشت",
+ "subscribeByEmail.close": "بستن",
+ "subscribeByEmail.email": "ایمیل",
+ "subscribeByEmail.have-been-subscribed": "شما بهروزرسانیها را از طریق ایمیل دریافت کردهاید",
+ "subscribeByEmail.have-been-unsubscribed": "شما از بهروزرسانیهای ایمیل حذف شدهاید",
+ "subscribeByEmail.only-registered-users": "فقط برای کاربران ثبتنام شده در دسترس است",
+ "subscribeByEmail.submit": "ارسال",
+ "subscribeByEmail.subscribe": "مشترک شدن",
+ "subscribeByEmail.subscribe-by-email": "مشترک شدن از طریق ایمیل",
+ "subscribeByEmail.subscribe-to-replies": "مشترک شدن به پاسخها",
+ "subscribeByEmail.subscribed": "شما بهروزرسانیها را از طریق ایمیل دریافت کردهاید",
+ "subscribeByEmail.unsubscribe": "حذف اشتراک",
+ "subscribeByRSS.button-title": "مشترک شدن از طریق RSS",
+ "subscribeByRSS.replies": "پاسخها",
+ "subscribeByRSS.site": "سایت",
+ "subscribeByRSS.thread": "موضوع",
+ "subscribeByRSS.title": "RSS",
+ "subscribeByTelegram.have-been-subscribed": "شما بهروزرسانیها را از طریق تلگرام دریافت کردهاید",
+ "subscribeByTelegram.have-been-unsubscribed": "شما از بهروزرسانیهای تلگرام حذف شدهاید",
+ "subscribeByTelegram.only-registered-users": "فقط برای کاربران ثبتنام شده در دسترس است",
+ "subscribeByTelegram.resubscribe": "دوباره مشترک شوید",
+ "subscribeByTelegram.subscribe-by-telegram": "مشترک شدن از طریق تلگرام",
+ "subscribeByTelegram.telegram": "تلگرام",
+ "subscribeByTelegram.unsubscribe": "حذف اشتراک",
+ "token": "توکن را از ایمیل کپی و پیست کنید",
+ "token.expired": "توکن منقضی شده است",
+ "token.invalid": "توکن نامعتبر است",
+ "toolbar.attach-image": "تصویر را پیوست کنید، بکشید و رها کنید یا از کلیپ بورد پیست کنید",
+ "toolbar.bold": "متن پررنگ را اضافه کنید {shortcut}",
+ "toolbar.code": "کد را وارد کنید",
+ "toolbar.header": "متن عنوان را اضافه کنید",
+ "toolbar.italic": "متن کج را اضافه کنید {shortcut}",
+ "toolbar.link": "لینک را اضافه کنید {shortcut}",
+ "toolbar.ordered-list": "لیست شمارهدار را اضافه کنید",
+ "toolbar.quote": "نقل قول را وارد کنید",
+ "toolbar.unordered-list": "لیست گلولهدار را اضافه کنید",
+ "user.comments": "نظرات",
+ "user.load-more": "بیشتر بارگذاری کنید",
+ "user.my-comments": "نظرات من",
+ "vote.controversy": "جنجال: {value}",
+ "vote.downvote": "رأی منفی",
+ "vote.score": "امتیاز رأیها",
+ "vote.upvote": "رأی مثبت"
+}
diff --git a/frontend/apps/remark42/app/utils/loadLocale.ts b/frontend/apps/remark42/app/utils/loadLocale.ts
index 404b63a01c..585c41b0a1 100644
--- a/frontend/apps/remark42/app/utils/loadLocale.ts
+++ b/frontend/apps/remark42/app/utils/loadLocale.ts
@@ -55,9 +55,7 @@ export async function loadLocale(locale: string): Promise
return import(/* webpackChunkName: "ar" */ '../locales/ar.json').then((res) => res.default).catch(() => enMessages);
}
if (locale === 'zh-tw') {
- return import(/* webpackChunkName: "zh-tw" */ '../locales/zh-tw.json')
- .then((res) => res.default)
- .catch(() => enMessages);
+ return import(/* webpackChunkName: "zh-tw" */ '../locales/zh-tw.json').then((res) => res.default).catch(() => enMessages);
}
if (locale === 'th') {
return import(/* webpackChunkName: "th" */ '../locales/th.json').then((res) => res.default).catch(() => enMessages);
@@ -65,6 +63,9 @@ export async function loadLocale(locale: string): Promise
if (locale === 'cs') {
return import(/* webpackChunkName: "cs" */ '../locales/cs.json').then((res) => res.default).catch(() => enMessages);
}
+ if (locale === 'fa') {
+ return import(/* webpackChunkName: "fa" */ '../locales/fa.json').then((res) => res.default).catch(() => enMessages);
+ }
return enMessages;
}
diff --git a/frontend/apps/remark42/tasks/supportedLocales.json b/frontend/apps/remark42/tasks/supportedLocales.json
index c57b8278d8..cd8284d232 100644
--- a/frontend/apps/remark42/tasks/supportedLocales.json
+++ b/frontend/apps/remark42/tasks/supportedLocales.json
@@ -1 +1 @@
-["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl", "vi", "be", "fr", "ja", "ko", "bp", "it", "ar", "zh-tw", "th", "cs"]
+["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl", "vi", "be", "fr", "ja", "ko", "bp", "it", "ar", "zh-tw", "th", "cs", "fa"]