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
This commit is contained in:
Koala Yeung 2017-04-23 11:58:47 +08:00 committed by Eugen
parent 9cd20a7062
commit 6f0b3b069f
8 changed files with 386 additions and 0 deletions

View file

@ -42,6 +42,7 @@ import Blocks from '../features/blocks';
import Mutes from '../features/mutes'; import Mutes from '../features/mutes';
import Report from '../features/report'; import Report from '../features/report';
import { IntlProvider, addLocaleData } from 'react-intl'; import { IntlProvider, addLocaleData } from 'react-intl';
import ar from 'react-intl/locale-data/ar';
import en from 'react-intl/locale-data/en'; import en from 'react-intl/locale-data/en';
import de from 'react-intl/locale-data/de'; import de from 'react-intl/locale-data/de';
import eo from 'react-intl/locale-data/eo'; import eo from 'react-intl/locale-data/eo';
@ -76,6 +77,7 @@ const browserHistory = useRouterHistory(createBrowserHistory)({
addLocaleData([ addLocaleData([
...en, ...en,
...ar,
...de, ...de,
...eo, ...eo,
...es, ...es,

View file

@ -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;

View file

@ -1,3 +1,4 @@
import ar from './ar';
import en from './en'; import en from './en';
import de from './de'; import de from './de';
import es from './es'; import es from './es';
@ -22,6 +23,7 @@ import bg from './bg';
import id from './id'; import id from './id';
const locales = { const locales = {
ar,
en, en,
de, de,
es, es,

View file

@ -27,6 +27,7 @@ module Mastodon
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.available_locales = [ config.i18n.available_locales = [
:en, :en,
:ar,
:bg, :bg,
:de, :de,
:eo, :eo,

170
config/locales/ar.yml Normal file
View file

@ -0,0 +1,170 @@
---
ar:
about:
about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
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 (<strong>%{self}</strong>) 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: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
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 <strong>two-factor authentication</strong>, 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: "<strong>Scan this QR code into Google Authenticator or a similiar TOTP app on your phone</strong>. 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: الرمز الثنائي غير صالح

View file

@ -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: ليس مقفلاً

View file

@ -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: النشر نيابةً عنك

View file

@ -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': 'نعم'