diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 1d0cf953..a4fe6cee 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -129,18 +129,19 @@ class AppTab extends React.Component { languageOptions = (): IDropdownOption[] => [ { key: "default", text: intl.get("followSystem") }, + { key: "ar", text: "العَرَبِيَّة" }, { key: "de", text: "Deutsch" }, { key: "en-US", text: "English" }, { key: "es", text: "Español" }, + { key: "fi-FI", text: "Suomi" }, { key: "fr-FR", text: "Français" }, { key: "it", text: "Italiano" }, + { key: "ja", text: "日本語" }, { key: "nl", text: "Nederlands" }, { key: "pt-BR", text: "Português do Brasil" }, - { key: "fi-FI", text: "Suomi" }, { key: "sv", text: "Svenska" }, { key: "tr", text: "Türkçe" }, { key: "uk", text: "Українська" }, - { key: "ja", text: "日本語" }, { key: "zh-CN", text: "中文(简体)" }, { key: "zh-TW", text: "中文(繁體)" }, ] diff --git a/src/scripts/i18n/README.md b/src/scripts/i18n/README.md index 97813add..48c3371e 100644 --- a/src/scripts/i18n/README.md +++ b/src/scripts/i18n/README.md @@ -4,19 +4,20 @@ Currently, Fluent Reader supports the following languages. | Locale | Language | Credit | | --- | --- | --- | +| ar | Arabic | [@zer0-x](https://github.com/ZER0-X) | +| de | Deutsch | [@NoNamePro0](https://github.com/NoNamePro0) | | en-US | English | [@yang991178](https://github.com/yang991178) | | es | Español | [@kant](https://github.com/kant) | -| fr-FR | Français | [@Toinane](https://github.com/Toinane) | | fi-FI | Suomi | [@SUPERHAMSTERI](https://github.com/SUPERHAMSTERI) | -| zh-CN | 中文(简体) | [@yang991178](https://github.com/yang991178) | -| zh-TW | 中文(繁體) | [@jerryc127](https://github.com/jerryc127) | +| fr-FR | Français | [@Toinane](https://github.com/Toinane) | +| it | Italiano | [@andrewasd](https://github.com/andrewasd) | | ja | 日本語 | [@tiancheng2000](https://github.com/tiancheng2000) | -| de | Deutsch | [@NoNamePro0](https://github.com/NoNamePro0) | +| nl | Nederlands | [@Vistaus](https://github.com/Vistaus) | +| pt-BR | Português do Brasil | [@fabianski7](https://github.com/fabianski7) | | sv | Svenska | [@eson57](https://github.com/eson57) | | tr | Türkçe | [@mustafagenc](https://github.com/mustafagenc) | | uk | Ukrainian | [@thevllad](https://github.com/thevllad) | -| nl | Nederlands | [@Vistaus](https://github.com/Vistaus) | -| it | Italiano | [@andrewasd](https://github.com/andrewasd) | -| pt-BR | Português do Brasil | [@fabianski7](https://github.com/fabianski7) | +| zh-CN | 中文(简体) | [@yang991178](https://github.com/yang991178) | +| zh-TW | 中文(繁體) | [@jerryc127](https://github.com/jerryc127) | Refer to the repo of [react-intl-universal](https://github.com/alibaba/react-intl-universal) to get started on internationalization. diff --git a/src/scripts/i18n/_locales.ts b/src/scripts/i18n/_locales.ts index 9aa9de00..7b561d3b 100644 --- a/src/scripts/i18n/_locales.ts +++ b/src/scripts/i18n/_locales.ts @@ -1,33 +1,35 @@ +import ar from "./ar.json" +import de from "./de.json" import en_US from "./en-US.json" -import zh_CN from "./zh-CN.json" -import zh_TW from "./zh-TW.json" -import ja from "./ja.json" +import es from "./es.json" +import fi_FI from "./fi-FI.json" import fr_FR from "./fr-FR.json" -import de from "./de.json" +import it from "./it.json" +import ja from "./ja.json" import nl from "./nl.json" -import es from "./es.json" +import pt_BR from "./pt-BR.json" import sv from "./sv.json" import tr from "./tr.json" -import it from "./it.json" import uk from "./uk.json" -import pt_BR from "./pt-BR.json" -import fi_FI from "./fi-FI.json" +import zh_CN from "./zh-CN.json" +import zh_TW from "./zh-TW.json" const locales = { + "ar": ar, + "de": de, "en-US": en_US, - "zh-CN": zh_CN, - "zh-TW": zh_TW, - "ja": ja, + "es": es, + "fi-FI": fi_FI, "fr-FR": fr_FR, - "de": de, + "it": it, + "ja": ja, "nl": nl, - "es": es, + "pt-BR": pt_BR, "sv": sv, "tr": tr, - "it": it, "uk": uk, - "pt-BR": pt_BR, - "fi-FI": fi_FI, + "zh-CN": zh_CN, + "zh-TW": zh_TW, } export default locales diff --git a/src/scripts/i18n/ar.json b/src/scripts/i18n/ar.json new file mode 100644 index 00000000..31a385f6 --- /dev/null +++ b/src/scripts/i18n/ar.json @@ -0,0 +1,235 @@ +{ + "allArticles": "كافَّةُ المَقالات", + "add": "إضافَة", + "create": "إنْشاء", + "icon": "الأيقونة", + "name": "الاِسم", + "openExternal": "الفَتحُ خارِجيًا", + "emptyName": "هَذَا الحَقلُ لَا يُمكِنُ أن يَكُونَ فارِغًا.", + "emptyField": "هَذَا الحَقلُ لَا يُمكِنُ أن يَكُونَ فارِغًا.", + "edit": "تَحرير", + "delete": "حَذف", + "followSystem": "اِتِّباعُ النِّظام", + "more": "مَزيد", + "close": "إغْلاق", + "search": "البَحث", + "loadMore": "تَحميلُ المَزيد", + "dangerButton": "تَأكيدُ {action}؟", + "confirmMarkAll": "هَل تُريدُ حقًا تَعليمَ جَميعِ المَقالَاتِ الَّتي فِي هَذِهِ الصَّفحَةِ كَمَقرُوءة؟", + "confirm": "تَأكيد", + "cancel": "إلغَاء", + "time": { + "now": "الآن", + "m": "د", + "h": "س", + "d": "ي", + "minute": "{m, plural, =1 {دَقيقَةٌ وَاحِدة} =2 {دَقيقَتان} =3 {# دَقائِق} =4 {# دَقيقَتًا} other {# دَقيقَة}}", + "hour": "{h, plural, =1 {ساعَةٌ وَاحِدة} =2 {ساعَتان} =3 {# ساعات} =4 {# ساعَتًا} other {# ساعَة}}", + "day": "{d, plural, =1 {يَومٌ وَاحِد} =2 {يَومَان} =3 {# أيَّام} =4 {# يومًا} other {# يَوم}}" + }, + "log": { + "empty": "لَا إشعَارَات", + "fetchFailure": "فَشَلَ تَحميلُ المَصدَر \"{name}\".", + "fetchSuccess": "تَمَّ جَلبُ {count, plural, =1 {مَقالٍ وَاحِدٍ} =2 {مَقالانِ} =3 {# مَقالاتٍ} =4 {# مَقالاً} other {# مَقالٍ}} بِنجاح.", + "networkError": "طَرَأ خَطأٌ فِي الشَّبَكَة.", + "parseError": "طَرَأ خَطَأٌ عِندَ تَحلِيلِ تَغذِيَةِ XML.", + "syncFailure": "فَشَلٌ فِي المُزامَنَةِ مَعَ الخِدمَة" + }, + "nav": { + "menu": "القائِمَة", + "refresh": "تَحديث", + "markAllRead": "تَعليمُ الكٌلِّ كَمَقرُوء", + "notifications": "الإشعَارَات", + "view": "المُعايَنَة", + "settings": "الإعدَادَات", + "minimize": "التَّقليص", + "maximize": "التَّكبير" + }, + "menu": { + "close": "إغلاقُ القائِمَة", + "subscriptions": "الاِشتِراكات" + }, + "article": { + "error": "فَشَلَ تَحميلُ المَقال.", + "reload": "إعادَةُ التَّحميل؟", + "empty": "لَا مَقالَات", + "untitled": "(بِلَا عُنوَان)", + "hide": "إخفاءُ المَقال", + "unhide": "إظهارُ المَقال", + "markRead": "التَّعليمُ كَمَقرُوء", + "markUnread": "التَّعليمُ كَغيرِ مَقرُوء", + "markAbove": "تَعليمُ الأعلَى كَمَقرُوء", + "markBelow": "تَعليمُ الأدْنى كَمَقرُوء", + "star": "نَجمَة", + "unstar": "إزالَةُ النَّجمَة", + "fontSize": "حَجْمُ الخَطّ", + "loadWebpage": "تَحميلُ صَفحَةِ الويب", + "loadFull": "تَحميلُ كامِلِ المُحتَوى", + "notify": "الإخطارُ عِندَ الجَّلبِ في الخَلفيَّة", + "dontNotify": "عَدَمُ الإخطَار" + }, + "context": { + "share": "المُشارَكَة", + "read": "القِراءة", + "copyTitle": "نَسخُ العُنوان", + "copyURL": "نَسخُ الرَّابِط", + "copy": "نَسخ", + "search": "البَحثُ عَن \"{text}\" عَلَى {engine}", + "view": "المُعايَنَة", + "cardView": "مَظهَرُ البِطاقات", + "listView": "مَظهَرُ القَائمَة", + "magazineView": "مَظهَرُ المِجَلَّة", + "compactView": "المَظهَرُ المَضغوط", + "filter": "التَصفِيَة", + "unreadOnly": "غَيرَ المَقروءةِ فَقَط", + "starredOnly": "المُعلَّمَةُ بالنَّجمَةِ فَقَط", + "fullSearch": "البَحثُ فِي النَصِّ الكامِل", + "showHidden": "إظهارُ المَقالاتِ المَخفيَّة", + "manageSources": "إدارَةُ المَصادِر", + "saveImageAs": "حِفظُ الصّورَةِ كَـ ...", + "copyImage": "نَسخُ الصّورَة", + "copyImageURL": "نَسخُ رابِطِ الصّورَة", + "caseSensitive": "حَساسيَّةُ حَالَةِ الأحرُف", + "showCover": "عَرضُ الغِلاف", + "showSnippet": "عَرضُ مُقتَطَف", + "fadeRead": "تلاشي قراءة المقالات" + }, + "searchEngine": { + "name": "مُحَرِّكُ البَحث", + "google": "جوجل", + "bing": "بينغ", + "baidu": "بايدو", + "duckduckgo": "دك دك جو" + }, + "settings": { + "writeError": "طرأ خطأ أثناء كتابة الملف.", + "name": "الإعدَادَات", + "fetching": "يَجري تَحدِيثُ المَصَادِر، يُرجَى الاِنتِظار ...", + "exit": "الخُرورجُ مِنَ الإعدَادَات", + "sources": "المَصادِر", + "grouping": "المَجمُوعات", + "rules": "القَوانين", + "service": "الخَدمات", + "app": "التَّفضيلات", + "about": "حَول", + "version": "الإصدار", + "shortcuts": "الاِختِصارات", + "openSource": "المَصدَرُ المَفتُوح", + "feedback": "التَّغذِيَةُ الرَاجِعَة" + }, + "sources": { + "serviceWarning": "لَن تُزامَن المَصادِرِ المُستورَدَةِ أو المُضافَةِ هُنا مَعَ خِدمَتك.", + "serviceManaged": "يُدَارُ هَذَا المَصدَرُ مِن قِبَلِ خدمَتك.", + "untitled": "مَصدَر", + "errorAdd": "طرأ خطأ عند إضافة المصدر.", + "errorParse": "طرأ خطأ عند تحليل ملف OPML.", + "errorParseHint": "يرجى التأكد من أن الملف ليس تالفًا ويتم ترميزه باستخدام UTF-8.", + "errorImport": "خطأ في إستيراد {count, plural, =1 {مصدر واحد} =2 {مصدران} =3 {# مصادر} =4 {# مصدرًا} other {# مصدر}}.", + "exist": "هذا المصدر موجود بالفعل.", + "opmlFile": "مِلف OPML", + "name": "اِسمُ المَصدَر", + "editName": "تَحريرُ الاِسم", + "fetchFrequency": "حدُّ تردد الجلب", + "unlimited": "بِلا حُدود", + "openTarget": "هدف الفتح الافتراضي للمقالات", + "delete": "حَذفُ المَصدَر", + "add": "إضافَةُ مَصدَر", + "import": "إستِيراد", + "export": "تَصدير", + "rssText": "نَصُّ RSS الكامِل", + "loadWebpage": "تَحميلُ صفحَةِ الويب", + "inputUrl": "إدخالُ عٌنوانِ URL", + "badIcon": "أيقونَةٌ غَيرُ صَالِحَة", + "badUrl": "عُنوانُ URL غَيرُ صَالِح", + "deleteWarning": "سوف يُزالُ المَصدَر وجَميع المقالات المحفوظة.", + "selected": "المَصدَر المُحَدَّد", + "selectedMulti": "عَدَدٌ مِنَ المَصادِرِ المُحُدَّدَة" + }, + "groups": { + "exist": "هذه المجموعة موجودة بالفعل.", + "type": "النوع", + "group": "المجموعة", + "source": "المصدر", + "capacity": "السِّعَة", + "exitGroup": "العودة إلى المجموعات", + "deleteSource": "الحذف من المجموعة", + "sourceHint": "اسحب وارمِ المصادر لإعادة الترتيب.", + "create": "إنشاء مجموعة", + "selectedGroup": "المجموعة المُحَدَّدَة", + "selectedSource": "المصدر المُحَدَّدَ", + "enterName": "أدخل اسم", + "editName": "تحرير الاِسم", + "deleteGroup": "حذف المجموعة", + "chooseGroup": "حَدِّد مجموعة", + "addToGroup": "إضافة إلى ...", + "groupHint": "انقر نقرًا مزدوجًا على المجموعة لتحرير المصادر. اسحب وارمِ لإعادة الترتيب." + }, + "rules": { + "intro": "التَّعلِيم تلقائيًا أو إرسال الإشعارات عن طريق تعبيرات نمطيَّة.", + "help": "تعلم المزيد", + "source": "المصدر", + "selectSource": "حدد مصدر", + "new": "قاعدة جديدة", + "if": "إذا كانَ", + "then": "حينئذٍ", + "title": "العنوان", + "content": "المحتوى", + "fullSearch": "عنوان المحتوى", + "creator": "الكاتب", + "match": "يتطابق مع", + "notMatch": "لا يتطابق مع", + "regex": "تعبير نمطي", + "badRegex": "تعبير نمطي غير صالح.", + "action": "إلاجراءات", + "selectAction": "تحديد إجراء", + "hint": "تُطَبَّق القواعد بالترتيب. اسحب وارمِ لإعادة التريب.", + "test": "اختبار القاعدة" + }, + "service": { + "intro": "المزامنة عبر الأجهزة بواسطة خدمات RSS.", + "select": "اِختر خدمة", + "suggest": "إقتراح خدمة جديدة", + "overwriteWarning": "سيتم حذف المصادر المحلية إذا كانت موجودة في الخدمة.", + "groupsWarning": "لا تتم مزامنة المجموعات تلقائيا مع الخدمة.", + "rateLimitWarning": "لتجنب معدل الحد، تحتاج إلى إنشاء مفتاح API الخاص بك.", + "removeAd": "إزالة الإعلانات", + "endpoint": "نقطة النهاية", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "unchanged": "دون تغيير", + "fetchLimit": "حدّ المزامنة", + "fetchLimitNum": "آخر {count} مقال", + "importGroups": "استيراد مجموعات", + "failure": "يتعذَّر الاتصال بالخدمة", + "failureHint": "يرجى التحقق من تكوين الخدمة أو حالة الشبكة.", + "fetchUnlimited": "غير محدود (غير موصى به)", + "exportToLite": "التصدير إلى قارئ فلُوينت لايت" + }, + "app": { + "cleanup": "التنظيف", + "cache": "محو ذاكرة التخزين المؤقتة", + "cacheSize": "مُخزَّن {size} مِنَ البيانات المؤقتة.", + "deleteChoices": "حذف المقالات منذ ... يوم", + "confirmDelete": "حذف", + "daysAgo": "قبلَ {days, plural, =1 {يَومٍ وَاحِد} =2 {يَومَان} =3 {# أيَّام} =4 {# يومًا} other {# يَوم}}", + "deleteAll": "حذف كافَّة المقالات", + "calculatingSize": "يجري حساب الحجم...", + "itemSize": "حول {حجم} من المخزن المحلي محتلة من قبل المقالات", + "confirmImport": "هل تريد حقا استيراد البيانات من ملف نسخة احتياطية؟ سيتم مسح جميع البيانات الحالية.", + "data": "بيانات التطبيق", + "backup": "نُشخة احتياطية", + "restore": "استرجاع", + "frData": "بيانات قارئ فلُوينت", + "language": "لُغةُ العرض", + "theme": "السِّمَة", + "lightTheme": "النمط المضيء", + "darkTheme": "النمط المظلم", + "enableProxy": "تمكين وكيل", + "badUrl": "عنوان URL غشر صالح", + "pac": "عنوان PAC", + "setPac": "تعيين PAC", + "pacHint": "بالنسبة لوكلاء Socks، يوصى لِـPAK بإرجاع \"SOCKS5\" لِـDNS طرف الوكيل. تعطيل الوكيل يتطلب إعادة التشغيل.", + "fetchInterval": "فترات الجلب التلقائي", + "never": "أبدًا" + } +}