From 6f0b3b069f3ee9a9eceec77666fc124b9695f124 Mon Sep 17 00:00:00 2001 From: Koala Yeung Date: Sun, 23 Apr 2017 11:58:47 +0800 Subject: [PATCH] Adding arabic string localization (rebased) (#1895) * Create ar.jsx * Preparing file for translation. * Create ar.yml * Preparing file for translation. * Create simple_form.ar.yml * Preparing file for translation. * Create devise.ar.yml * Preparing file for translation. * Create doorkeeper.ar.yml * Preparing file for translation. * Update index.jsx Preparing file for translation. * Update mastodon.jsx * Preparing file to translation. * Correction thanks to @Taekiro https://github.com/tootsuite/mastodon/pull/1798#pullrequestreview-32924922 * Update settings_helper.rb Preparing file to translation. * Update application.rb * Preparing file to translation. * Update simple_form.ar.yml * Update doorkeeper.ar.yml * Update devise.ar.yml * Update ar.yml * Fix i18n-tasks unused issue (ar) Remove unused translation strings * Update application.rb * Update ar.jsx * Fix various issues with Arabic translation * Fix duplication caused in merge * Fix syntax error in devise.ar.yml * Fix import error Duplicated incorrect import in mastodon.jsx * Fix duplication error in locales/index.jsx * Update ar.yml * Update ar.jsx * Update ar.yml * Update ar.jsx * Fix ar translation --- .../components/containers/mastodon.jsx | 2 + .../javascripts/components/locales/ar.jsx | 72 ++++++++ .../javascripts/components/locales/index.jsx | 2 + config/application.rb | 1 + config/locales/ar.yml | 170 ++++++++++++++++++ config/locales/devise.ar.yml | 27 +++ config/locales/doorkeeper.ar.yml | 63 +++++++ config/locales/simple_form.ar.yml | 49 +++++ 8 files changed, 386 insertions(+) create mode 100644 app/assets/javascripts/components/locales/ar.jsx create mode 100644 config/locales/ar.yml create mode 100644 config/locales/devise.ar.yml create mode 100644 config/locales/doorkeeper.ar.yml create mode 100644 config/locales/simple_form.ar.yml diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx index 6aae23b628c..e2b91e5dd96 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 00000000000..f72eb826fe4 --- /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 14c76ea231a..9bda9a83e4c 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 e51157292e0..03e98557dbb 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 00000000000..b2325309bf7 --- /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 00000000000..169221352ec --- /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 00000000000..ab0c45cae6e --- /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 00000000000..d612a0df0ba --- /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': 'نعم'