diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx
index 6aae23b628..e2b91e5dd9 100644
--- a/app/assets/javascripts/components/containers/mastodon.jsx
+++ b/app/assets/javascripts/components/containers/mastodon.jsx
@@ -42,6 +42,7 @@ import Blocks from '../features/blocks';
import Mutes from '../features/mutes';
import Report from '../features/report';
import { IntlProvider, addLocaleData } from 'react-intl';
+import ar from 'react-intl/locale-data/ar';
import en from 'react-intl/locale-data/en';
import de from 'react-intl/locale-data/de';
import eo from 'react-intl/locale-data/eo';
@@ -76,6 +77,7 @@ const browserHistory = useRouterHistory(createBrowserHistory)({
addLocaleData([
...en,
+ ...ar,
...de,
...eo,
...es,
diff --git a/app/assets/javascripts/components/locales/ar.jsx b/app/assets/javascripts/components/locales/ar.jsx
new file mode 100644
index 0000000000..f72eb826fe
--- /dev/null
+++ b/app/assets/javascripts/components/locales/ar.jsx
@@ -0,0 +1,72 @@
+const ar = {
+ "column_back_button.label": "العودة الى الوراء",
+ "lightbox.close": "إغلاق",
+ "loading_indicator.label": "تحميل ...",
+ "status.mention": "أذكُر @{name}",
+ "status.delete": "إحذف",
+ "status.reply": "ردّ",
+ "status.reblog": "رَقِّي",
+ "status.favourite": "Favourite",
+ "status.reblogged_by": "{name} رقى",
+ "status.sensitive_warning": "محتوى حساس",
+ "status.sensitive_toggle": "اضغط للعرض",
+ "status.show_more": "أظهر المزيد",
+ "status.show_less": "إعرض أقلّ",
+ "status.open": "وسع هذه المشاركة",
+ "status.report": "إبلِغ عن @{name}",
+ "video_player.toggle_sound": "تبديل الصوت",
+ "account.mention": "أُذكُر @{name}",
+ "account.edit_profile": "تعديل الملف الشخصي",
+ "account.unblock": "إلغاء الحظر عن @{name}",
+ "account.unfollow": "إلغاء المتابعة",
+ "account.block": "حظر @{name}",
+ "account.follow": "إتبع",
+ "account.posts": "المشاركات",
+ "account.follows": "يتبع",
+ "account.followers": "المتابعون",
+ "account.follows_you": "يتابعك",
+ "account.requested": "في انتظار الموافقة",
+ "getting_started.heading": "إستعدّ للبدء",
+ "getting_started.about_addressing": "يمكنك متابعة الأشخاص إذا كنت تعرف اسم المستخدم الخاص بهم والنطاق الذي هم عليه عن طريق إدخال عنوان شبيه بالبريد الإلكتروني في الحقل المخصص للبحث.",
+ "getting_started.about_shortcuts": "إذا كان المستخدم المستهدف في نفس النطاق الذي تستخدمه، فإسم المستخدم وحده يكفي. وتنطبق نفس القاعدة على ذكر الأشخاص في المنشورات و التبويقات.",
+ "getting_started.open_source_notice": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على GitHub {github}. {apps}.",
+ "column.home": "الرئيسية",
+ "column.community": "القائمة الزمنية المحلية",
+ "column.public": "القائمة الزمنية الفيدرالية",
+ "column.notifications": "الإشعارات",
+ "tabs_bar.compose": "تحرير",
+ "tabs_bar.home": "الرئيسية",
+ "tabs_bar.mentions": "الإشارات",
+ "tabs_bar.public": "القائمة الزمنية الفيدرالية",
+ "tabs_bar.notifications": "الإشعارات",
+ "compose_form.placeholder": "ماذا يدور في ذهنك ؟",
+ "compose_form.publish": "بَوِّق",
+ "compose_form.sensitive": "ضع علامة حساس على الوسائط",
+ "compose_form.spoiler": "إخفاء النص وراء تحذير",
+ "compose_form.private": "ضع علامة خاص",
+ "compose_form.privacy_disclaimer": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.",
+ "compose_form.unlisted": "لا تعرض على الخيوط الزمنية العامة",
+ "navigation_bar.edit_profile": "تعديل الملف الشخصي",
+ "navigation_bar.preferences": "التفضيلات",
+ "navigation_bar.community_timeline": "القائمة الزمنية المحلية",
+ "navigation_bar.public_timeline": "القائمة الزمنية الفيدرالية",
+ "navigation_bar.logout": "خروج",
+ "reply_indicator.cancel": "إلغاء",
+ "search.placeholder": "ابحث",
+ "search.account": "حساب",
+ "search.hashtag": "وسم",
+ "upload_button.label": "إضافة وسائط",
+ "upload_form.undo": "إلغاء",
+ "notification.follow": "{name} يتبعك",
+ "notification.favourite": "{name} أعجب بمنشورك",
+ "notification.reblog": "{name} قام بترقية تبويقك",
+ "notification.mention": "{name} ذكرك",
+ "notifications.column_settings.alert": "إشعارات سطح المكتب",
+ "notifications.column_settings.show": "إعرِضها في عمود",
+ "notifications.column_settings.follow": "متابعُون جُدُد :",
+ "notifications.column_settings.favourite": "المُفَضَّلة :",
+ "notifications.column_settings.mention": "الإشارات :",
+ "notifications.column_settings.reblog": "الترقيّات:",
+};
+
+export default ar;
diff --git a/app/assets/javascripts/components/locales/index.jsx b/app/assets/javascripts/components/locales/index.jsx
index 14c76ea231..9bda9a83e4 100644
--- a/app/assets/javascripts/components/locales/index.jsx
+++ b/app/assets/javascripts/components/locales/index.jsx
@@ -1,3 +1,4 @@
+import ar from './ar';
import en from './en';
import de from './de';
import es from './es';
@@ -22,6 +23,7 @@ import bg from './bg';
import id from './id';
const locales = {
+ ar,
en,
de,
es,
diff --git a/config/application.rb b/config/application.rb
index e51157292e..03e98557db 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -27,6 +27,7 @@ module Mastodon
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.available_locales = [
:en,
+ :ar,
:bg,
:de,
:eo,
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
new file mode 100644
index 0000000000..b2325309bf
--- /dev/null
+++ b/config/locales/ar.yml
@@ -0,0 +1,170 @@
+---
+ar:
+ about:
+ about_mastodon: ماستدون شبكة إجتماعية حرة و مفتوحة المصدر. هو بديل لامركزي لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في الشبكات الاجتماعية بكل شفافية.
+ about_this: عن مثيل الخادوم هذا
+ apps: التطبيقات
+ business_email: 'البريد الإلكتروني المهني :'
+ closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
+ contact: Contact
+ description_headline: ما هو %{domain}?
+ domain_count_after: خوادم أخرى
+ domain_count_before: متصل بـ
+ features:
+ api: Open API for apps and services
+ blocks: Rich block and muting tools
+ characters: 500 حرف في كل رسالة
+ chronology: Timelines are chronological
+ ethics: 'Ethical design: no ads, no tracking'
+ gifv: GIFV sets and short videos
+ privacy: Granular, per-post privacy settings
+ public: الخيوط الزمنية العمومية
+ features_headline: ما الذي يجعل ماستدون فريدًا ؟
+ get_started: إبدأ الآن
+ links: الروابط
+ other_instances: خوادم أخرى
+ source_code: الشفرة المصدرية
+ status_count_after: منشورات
+ status_count_before: نشروا
+ terms: شروط الاستعمال
+ user_count_after: المُستخدِمين
+ user_count_before: يستضيف
+ accounts:
+ follow: إتبع
+ followers: متابِعون
+ following: يتابعون
+ nothing_here: لا يوجد أي شيء هنا !
+ people_followed_by: الأشخاص الذين يتبعهم %{name}
+ people_who_follow: الأشخاص الذين يتبعون %{name}
+ posts: منشورات
+ remote_follow: إتبع عن بعد
+ unfollow: إلغاء المتابعة
+ application_mailer:
+ settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}'
+ signature: إشعارات ماستدون من %{instance}
+ view: 'View:'
+ applications:
+ invalid_url: إن الرابط المقدم غير صالح
+ auth:
+ change_password: الهوية
+ didnt_get_confirmation: Didn't receive confirmation instructions?
+ forgot_password: نسيت كلمة المرور ؟
+ login: تسجيل الدخول
+ logout: خروج
+ register: إنشاء حساب
+ resend_confirmation: إعادة إرسال تعليمات التأكيد
+ reset_password: إعادة تعيين كلمة المرور
+ set_new_password: تعيين كلمة مرور جديدة
+ authorize_follow:
+ error: Unfortunately, there was an error looking up the remote account
+ follow: إتبع
+ prompt_html: 'You (%{self}) have requested to follow:'
+ title: إتباع %{acct}
+ datetime:
+ distance_in_words:
+ about_x_hours: "%{count}سا"
+ about_x_months: "%{count}شهر"
+ about_x_years: "%{count}سنة"
+ almost_x_years: "%{count}سنوات"
+ half_a_minute: Just now
+ less_than_x_minutes: "%{count}د"
+ less_than_x_seconds: الآن
+ over_x_years: "%{count}سنين"
+ x_days: "%{count}أيام"
+ x_minutes: "%{count}د"
+ x_months: "%{count}شه"
+ x_seconds: "%{count}ث"
+ exports:
+ blocks: قمت بحظر
+ csv: CSV
+ follows: أنت تتبع
+ storage: ذاكرة التخزين
+ generic:
+ changes_saved_msg: تم حفظ التعديلات بنجاح !
+ powered_by: powered by %{link}
+ save_changes: حفظ التغييرات
+ validation_errors:
+ one: Something isn't quite right yet! Please review the error below
+ other: Something isn't quite right yet! Please review %{count} errors below
+ imports:
+ preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
+ success: تم تحميل بياناتك بنجاح وسيتم معالجتها في الوقت المناسب
+ types:
+ blocking: قائمة المحظورين
+ following: قائمة المستخدمين المتبوعين
+ upload: تحميل
+ landing_strip_html: %{name} is a user on %{domain}. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can sign up here.
+ media_attachments:
+ validations:
+ images_and_video: Cannot attach a video to a status that already contains images
+ too_many: لا يمكن إرفاق أكثر من 4 ملفات
+ notification_mailer:
+ digest:
+ body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+ mention: "%{name} mentioned you in:"
+ new_followers_summary:
+ one: لقد حصلت على متابع جديد !
+ other: لقد تحصلت على %{count} متتبعين جدد ! رائع !
+ subject:
+ one: "إشعار واحد منذ زيارتك الأخيرة \U0001F418"
+ other: "%{count} إشعارات جديدة منذ زيارتك الأخيرة \U0001F418"
+ favourite:
+ body: 'Your status was favourited by %{name}:'
+ subject: "%{name} favourited your status"
+ follow:
+ body: "%{name} من متتبعيك الآن !"
+ subject: "%{name} من متتبعيك الآن !"
+ follow_request:
+ body: "%{name} has requested to follow you"
+ subject: 'Pending follower: %{name}'
+ mention:
+ body: 'You were mentioned by %{name} in:'
+ subject: You were mentioned by %{name}
+ reblog:
+ body: 'Your status was boosted by %{name}:'
+ subject: "%{name} boosted your status"
+ pagination:
+ next: التالي
+ prev: السابق
+ remote_follow:
+ acct: Enter your username@domain you want to follow from
+ missing_resource: Could not find the required redirect URL for your account
+ proceed: Proceed to follow
+ prompt: 'إنك بصدد متابعة :'
+ settings:
+ authorized_apps: التطبيقات المرخص لها
+ back: عودة إلى ماستدون
+ edit_profile: تعديل الملف الشخصي
+ export: تصدير البيانات
+ import: إستيراد
+ preferences: التفضيلات
+ settings: الإعدادات
+ two_factor_authentication: المصادقة الثنائية
+ statuses:
+ open_in_web: إفتح في الويب
+ over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها
+ show_more: أظهر المزيد
+ visibilities:
+ private: إعرض فقط لمتتبعيك
+ public: عمومي
+ unlisted: Public, but do not display on the public timeline
+ stream_entries:
+ click_to_show: إضغط للعرض
+ reblogged: رقى
+ sensitive_content: محتوى حساس
+ time:
+ formats:
+ default: "%b %d, %Y, %H:%M"
+ two_factor_authentication:
+ code_hint: Enter the code generated by your authenticator app to confirm
+ description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter.
+ disable: تعطيل
+ enable: تفعيل
+ enabled_success: Two-factor authentication successfully enabled
+ instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in."
+ manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:'
+ setup: Set up
+ wrong_code: The entered code was invalid! Are server time and device time correct?
+ users:
+ invalid_email: عنوان البريد الإلكتروني غير صالح
+ invalid_otp_token: الرمز الثنائي غير صالح
diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml
new file mode 100644
index 0000000000..169221352e
--- /dev/null
+++ b/config/locales/devise.ar.yml
@@ -0,0 +1,27 @@
+---
+ar:
+ devise:
+ failure:
+ inactive: لم يتم تنشيط حسابك بعد.
+ locked: إن حسابك مقفل.
+ mailer:
+ password_change:
+ subject: 'ماستدون : تم تغيير كلمة المرور'
+ reset_password_instructions:
+ subject: 'ماستدون : تعليمات إستعادة كلمة المرور'
+ unlock_instructions:
+ subject: 'ماستدون : تعليمات فك القفل'
+ passwords:
+ updated: تم تغيير كلمة المرور بنجاح. أنت مسجل الآن.
+ updated_not_active: تم تغيير كلمة المرور بنجاح.
+ registrations:
+ signed_up: أهلا وسهلا ! تم تسجيل دخولك بنجاح.
+ updated: تم تحديث حسابك بنجاح.
+ sessions:
+ already_signed_out: تم تسجيل خروجك بنجاح.
+ signed_in: تم تسجيل دخولك بنجاح.
+ signed_out: تم تسجيل خروجك بنجاح.
+ errors:
+ messages:
+ not_found: لا يوجد
+ not_locked: ليس مقفلاً
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
new file mode 100644
index 0000000000..ab0c45cae6
--- /dev/null
+++ b/config/locales/doorkeeper.ar.yml
@@ -0,0 +1,63 @@
+ar:
+ activerecord:
+ attributes:
+ doorkeeper/application:
+ name: التسمية
+ doorkeeper:
+ applications:
+ buttons:
+ cancel: إلغاء
+ edit: تعديل
+ submit: إرسال
+ confirmations:
+ destroy: متأكد ؟
+ edit:
+ title: تعديل التطبيق
+ index:
+ name: التسمية
+ new: تطبيق جديد
+ title: تطبيقاتك
+ new:
+ title: تطبيق جديد
+ show:
+ application_id: معرف التطبيق
+ secret: السر
+ title: 'تطبيق : %{name}'
+ authorizations:
+ buttons:
+ authorize: ترخيص
+ deny: رفض
+ error:
+ title: حدث هناك خطأ
+ new:
+ able_to: سيكون بامكانه القيام ب
+ title: الترخيص مطلوب
+ show:
+ title: رمز الترخيص
+ authorized_applications:
+ buttons:
+ revoke: إبطال التصريح
+ confirmations:
+ revoke: متأكد ؟
+ index:
+ application: التطبيق
+ scopes: النطاقات
+ title: تطبيقاتك المرخص لها
+ flash:
+ applications:
+ create:
+ notice: تم إنشاء التطبيق
+ destroy:
+ notice: تم حذف التطبيق.
+ update:
+ notice: تم تحديث التطبيق.
+ authorized_applications:
+ destroy:
+ notice: تم إبطال التصريح المخول للتطبيق.
+ layouts:
+ admin:
+ nav:
+ applications: التطبيقات
+ scopes:
+ read: قراءة بيانات حسابك
+ write: النشر نيابةً عنك
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
new file mode 100644
index 0000000000..d612a0df0b
--- /dev/null
+++ b/config/locales/simple_form.ar.yml
@@ -0,0 +1,49 @@
+---
+ar:
+ simple_form:
+ hints:
+ defaults:
+ avatar: PNG, GIF أو JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 120x120px
+ display_name: 30 حرفاً على الأكثر
+ header: PNG, GIF or JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 700x335px
+ note: 160 حرفاً على الأكثر
+ imports:
+ data: ملف CSV تم تصديره من خادوم مثيل آخر لماستدون
+ sessions:
+ otp: أدخل الرمز الثنائي من هاتفك أو استخدم أحد رموز الاسترداد.
+ labels:
+ defaults:
+ avatar: الصورة الرمزية
+ confirm_new_password: تأكيد كلمة المرور الجديدة
+ confirm_password: تأكيد كلمة المرور
+ current_password: كلمة المرور الحالية
+ data: البيانات
+ display_name: الاسم الذي يتم عرضه
+ email: عنوان البريد الإلكتروني
+ header: رأس الصفحة
+ locale: اللغة
+ locked: إجعل حسابك خاصًا
+ new_password: كلمة مرور جديدة
+ note: السيرة الذاتية
+ otp_attempt: الرمز الثنائي
+ password: كلمة المرور
+ setting_boost_modal: إظهار مربع حوار التأكيد قبل القيام بالترقية
+ setting_default_privacy: خصوصية المنشور
+ severity: الشدة
+ type: نوع الإستيراد
+ username: اسم المستخدم
+ interactions:
+ must_be_follower: حظر اشعارات الأشخاص الذين لا يتبعونك
+ must_be_following: حظر اشعارات الأشخاص الذين لا تتبعهم
+ notification_emails:
+ digest: إرسال رسائل بريد إلكتروني ملخصة
+ favourite: إبعث بريداً إلكترونياً عندما يعجب احدهم بمنشورك
+ follow: إبعث بريداً إلكترونياً عندما يتبعك أحد
+ follow_request: إبعث بريداً إلكترونياً عند تلقيك طلب بالمتابعة
+ mention: إبعث بريداً إلكترونياً عندما يشار إليك
+ reblog: إبعث بريداً إلكترونياً عندما يعزز احدهم منشورك
+ 'no': 'لا'
+ required:
+ mark: "*"
+ text: مطلوب
+ 'yes': 'نعم'