From 53109e7f2389b1364d84617822d41130c25745aa Mon Sep 17 00:00:00 2001 From: JP Date: Mon, 26 Dec 2022 17:12:04 +0200 Subject: [PATCH] feat(i18n): add arabic translations (#490) Co-authored-by: userquin --- components/search/SearchWidget.vue | 2 + composables/setups.ts | 8 + config/i18n.ts | 14 ++ locales/ar-EG.json | 308 +++++++++++++++++++++++++++++ 4 files changed, 332 insertions(+) create mode 100644 locales/ar-EG.json diff --git a/components/search/SearchWidget.vue b/components/search/SearchWidget.vue index 265417c4..29f986aa 100644 --- a/components/search/SearchWidget.vue +++ b/components/search/SearchWidget.vue @@ -59,11 +59,13 @@ const activate = () => { v-model="query" h-full pl-10 + rtl-pr-10 rounded-full w-full bg-transparent outline="focus:none" pr-4 + rtl-pl-4 :placeholder="t('nav_side.search', ['Elk'])" pb="1px" placeholder-text-secondary diff --git a/composables/setups.ts b/composables/setups.ts index 4c2a9304..77479775 100644 --- a/composables/setups.ts +++ b/composables/setups.ts @@ -1,6 +1,8 @@ import { pwaInfo } from 'virtual:pwa-info' import type { Link } from '@unhead/schema' +import type { Directions } from 'vue-i18n-routing' import { APP_NAME, STORAGE_KEY_LANG } from '~/constants' +import type { LocaleObject } from '#i18n' export function setupPageHeader() { const isDev = process.dev @@ -30,9 +32,15 @@ export function setupPageHeader() { } } + const localeMap = (i18n.locales.value as LocaleObject[]).reduce((acc, l) => { + acc[l.code!] = l.dir ?? 'ltr' + return acc + }, {} as Record) + useHeadFixed({ htmlAttrs: { lang: () => i18n.locale.value, + dir: () => localeMap[i18n.locale.value] ?? 'ltr', }, titleTemplate: title => `${title ? `${title} | ` : ''}${APP_NAME}${isDev ? ' (dev)' : isPreview ? ' (preview)' : ''}`, link, diff --git a/config/i18n.ts b/config/i18n.ts index 1df3abd0..05e15d68 100644 --- a/config/i18n.ts +++ b/config/i18n.ts @@ -2,41 +2,55 @@ import type { NuxtI18nOptions } from '@nuxtjs/i18n' import type { DateTimeFormats } from '@intlify/core-base' import type { LocaleObject } from '#i18n' +// @ts-expect-error dir is there, ts complaining const locales: LocaleObject[] = [ { code: 'en-US', file: 'en-US.json', name: 'English', + dir: 'ltr', }, { code: 'de-DE', file: 'de-DE.json', name: 'Deutsch', + dir: 'ltr', }, { code: 'zh-CN', file: 'zh-CN.json', name: '简体中文', + dir: 'ltr', }, { code: 'ja-JP', file: 'ja-JP.json', name: '日本語', + dir: 'ltr', }, { code: 'es-ES', file: 'es-ES.json', name: 'Español', + dir: 'ltr', }, { code: 'fr-FR', file: 'fr-FR.json', name: 'Français', + dir: 'ltr', }, { code: 'cs-CZ', file: 'cs-CZ.json', name: 'Česky', + dir: 'ltr', + }, + { + code: 'ar', + file: 'ar-EG.json', + name: 'العربية', + dir: 'rtl', }, ].sort((a, b) => a.code.localeCompare(b.code)) diff --git a/locales/ar-EG.json b/locales/ar-EG.json new file mode 100644 index 00000000..a52512ff --- /dev/null +++ b/locales/ar-EG.json @@ -0,0 +1,308 @@ +{ + "account": { + "avatar_description": "صورة حساب {0}", + "blocked_by": "تم حظرك من قبل هذا المستخدم", + "blocked_domains": "النطاقات المحظورة", + "blocked_users": "المستخدمين المحظورين", + "blocking": "محظور", + "bot": "حساب آلي", + "favourites": "المفضلة", + "follow": "إتبع", + "follow_back": "إعادة متابعة", + "follow_requested": "طلبت المتابعة", + "followers": "متابِعون", + "followers_count": "{0} متابِعون|{0} متابِع|{0} متابِعون", + "following": "مُتابَع", + "following_count": "{0} مُتابَع", + "follows_you": "يتابعك", + "go_to_profile": "اعرض الصفحة التعريفية", + "joined": "انضم", + "moved_title": "أشار إلى أن حسابهم الجديد أصبح على", + "muted_users": "المستخدمين المكتومين", + "muting": "قُمتَ(ي) بكتم", + "mutuals": "المتبادلين", + "pinned": "المثبتة", + "posts": "المنشورات", + "posts_count": "{0} منشورات|{0} منشور|{0} منشورات", + "profile_description": "{0} رأسية حساب", + "profile_unavailable": "حساب غير متوفر", + "unblock": "إلغاء حظر", + "unfollow": "إلغاء متابعة", + "unmute": "إلغاء كتم" + }, + "action": { + "bookmark": "إضافة إلى المرجعية", + "bookmarked": "مضاف إلى المرجعية", + "boost": "إعادة نشر", + "boosted": "أعيد نشرها", + "close": "أغلق", + "compose": "منشور جديد", + "enter_app": "أدخل التطبيق", + "favourite": "إضافة إلى المفضلين", + "favourited": "مضاف إلى المفضلين", + "more": "المزيد", + "next": "التالي", + "prev": "السابق", + "publish": "!نشر", + "reply": "رد", + "save_changes": "حفظ التغييرات", + "sign_in": "تسجيل الدخول", + "switch_account": "تغيير الحساب", + "vote": "قم بالتصويت" + }, + "app_desc_short": "موقع الكتروني ماستدون رشيق", + "app_logo": "Elk شعار", + "app_name": "Elk", + "command": { + "activate": "تفعيل", + "complete": "أكمل", + "compose_desc": "اكتب منشور جديد", + "lang": "اللغات", + "n-people-in-the-past-n-days": "{0} أشخاص في الأيام ال {1} الماضية", + "select_lang": "اختار اللغة", + "sign_in_desc": "إضافة حساب قائم", + "switch_account": "التبديل إلى {0}", + "switch_account_desc": "قم بالتبديل إلى حساب آخر", + "toggle_dark_mode": "تبديل المظهر الداكن", + "toggle_zen_mode": "تبديل وضع الهدوء" + }, + "common": { + "end_of_list": "نهاية القائمة", + "error": "حدث خطأ", + "kiloSuffix": "ألف", + "megaSuffix": "مليون", + "not_found": "404 غير معثور عليه", + "offline_desc": "يبدو أنك غير متصل بالإنترنت. يرجى التحقق من اتصالك." + }, + "conversation": { + "with": "مع" + }, + "error": { + "account_not_found": "حساب {0} غير موجود", + "explore-list-empty": "لا توجد مشاركات شائعة الآن. تحقق مرة أخرى لاحقًا!", + "sign_in_error": "لا يمكن الاتصال بالموقع", + "status_not_found": "لا يمكن إيجاد المنشور" + }, + "feature_flag": { + "avatar_on_avatar": "الصورة الرمزية على الصورة الرمزية", + "github_cards": "GitHub بطاقات", + "user_switcher_sidebar": "الشريط الجانبي لمبدل المستخدم", + "virtual_scroll": "التمرير الافتراضي" + }, + "help": { + "desc_highlight": "توقع بعض الأخطاء والميزات المفقودة هنا وهناك.", + "desc_para1": "نشكرك على اهتمامك بتجربة Elk ، عميل ماستدون العام!", + "desc_para2": "نحن نعمل بجد على التطوير وتحسينه بمرور الوقت. وسندعوك قريبًا للانضمام إلى القوة بمجرد أن نجعلها مفتوحة المصدر قريبًا!", + "desc_para3": "قبل ذلك ، للمساعدة في تعزيز التنمية ، يمكنك رعاية أعضاء فريقنا من خلال الروابط أدناه.", + "title": "Elk في عرض مسبق" + }, + "menu": { + "block_account": "حظر {0}", + "block_domain": "حظر المجال {0}", + "copy_link_to_post": "انسخ الرابط إلى هذا المنشور", + "delete": "حذف", + "delete_and_redraft": "حذف وإعادة صياغة", + "direct_message_account": "إرسال رسالة مباشرة إلى {0}", + "edit": "تعديل", + "mention_account": "أذكر {0}", + "mute_account": "كتم {0}", + "open_in_original_site": "فتح في الموقع الأصلي", + "pin_on_profile": "تثبيت على حسابك الشخصي", + "show_untranslated": "عرض بدون ترجمة", + "toggle_theme": { + "dark": "تبديل المظهر الداكن", + "light": "تبديل المظهر الفاتح" + }, + "translate_post": "ترجم المنشور", + "unblock_account": "رفع الحظر عن {0}", + "unblock_domain": "رفع الحظر عن النطاق {0}", + "unmute_account": "إلغاء كتم الحساب {0}", + "unpin_on_profile": "إلغاء التثبيت من الملف الشخصي" + }, + "nav_footer": { + "built_at": "Built {0}", + "select_feature_flags": "تبديل علامات الميزات", + "select_language": "اختار اللغة", + "show_intro": "عرض المقدمة", + "toggle_theme": "تبديل المظهر", + "zen_mode": "الوضع الهادئ" + }, + "nav_side": { + "bookmarks": "الفواصل المرجعية", + "conversations": "المحادثات", + "explore": "استكشف", + "favourites": "المفضلة", + "federated": "الفديرالية", + "home": "الخيط الزمني الرئيسي", + "local": "المحلي", + "notifications": "الإشعارات", + "profile": "الصفحة التعريفية", + "search": "البحث" + }, + "nav_user": { + "sign_in_desc": "قم بتسجيل الدخول لمتابعة الملفات الشخصية والمشاركة والرد على المنشورات أو التفاعل من حسابك على خادم مختلف" + }, + "notification": { + "favourited_post": "أُعجِب بمنشورك", + "followed_you": "بدأ في متابعتك", + "followed_you_count": "تبعك {followers} أشخاص|تبعك {followers} شخص| تبعك {followers} أشخاص", + "missing_type": "MISSING notification.type:", + "reblogged_post": "اعاد نشر منشورك", + "request_to_follow": "طلب(ت) متابعتك", + "settings": { + "alerts": { + "favourite": "المفضلة", + "follow": "متابعين جدد", + "mention": "المنشورات التي تذكرني", + "poll": "استطلاعات الرأي", + "reblog": "إعادة نشر منشورك", + "title": "ما هي الإشعارات التي تريد تلقيها؟" + }, + "close_btn": "أغلق إعدادات الإشعارات", + "policy": { + "all": "من اي شخص", + "followed": "من الناس الذين أتابعهم", + "follower": "من الناس الذين يتبعونني", + "none": "من لا أحد", + "title": "من الذي يمكنني تلقي إشعارات منه؟" + }, + "save_settings": "حفظ التغييرات الإعدادات", + "show_btn": "إظهار إعدادات الإشعارات", + "title": "إعدادات الإشعارات", + "undo_settings": "تراجع عن تغييرات الإعدادات", + "unsubscribe": "تعطيل الإشعارات", + "unsubscribed_with_warning": "مكّن الإشعارات لتلقي الإشعارات من هذا الحساب بالنقر فوق الزر \"@:notification.settings.warning.enable_desktop{'\"'}", + "unsupported": "متصفحك لا يدعم الإشعارات", + "warning": { + "enable_close": "أغلق", + "enable_description": "لتلقي إشعارات عندما لا يكون Elk مفتوحًا ، قم بتمكين إشعارات النظام. يمكنك التحكم بدقة في أنواع التفاعلات التي تنشئ إشعارات النظام عبر الزر \"Show Settings\" أعلاه بمجرد تمكينه.", + "enable_description_short": "لتغيير إعدادات إشعارات النظام عندما لا يكون Elk مفتوحًا ، يجب أولاً تمكين إشعارات النظام.", + "enable_desktop": "تفعيل إشعارات النظام", + "enable_title": "لا تفوت أي شيء" + } + }, + "update_status": "قام(ت) بتحديث حالته(ا)" + }, + "placeholder": { + "content_warning": "اكتب تحذيرك هنا", + "default_1": "ماذا يدور في ذهنك؟", + "reply_to_account": "الرد على {0}", + "replying": "الرد", + "the_thread": "المحادثة" + }, + "pwa": { + "dismiss": "تجاهل", + "message": "@:pwa.title{','} اضغط على @:pwa.reload الزر للتحديث", + "reload": "تحديث", + "title": "يتوفر تحديث Elk الجديد" + }, + "search": { + "search_desc": "ابحث عن الأشخاص والهاشتاج" + }, + "state": { + "edited": "(معدل)", + "editing": "تعديل", + "loading": "جاري التحميل ...", + "uploading": "جاري التحميل ..." + }, + "status": { + "edited": "عدل {0}", + "filter_hidden_phrase": "تمت تصفيتها بواسطة", + "filter_removed_phrase": "تمت إزالته بواسطة عامل التصفية", + "filter_show_anyway": "عرض على أي حال", + "img_alt": { + "desc": "وصف", + "dismiss": "تجاهل" + }, + "poll": { + "count": "{n} أصوات|{n} صوت|{n} أصوات", + "ends": "ينتهي في {0}", + "finished": "انتهى في {0}" + }, + "reblogged": "{0} اعاد نشر", + "someone": "شخص ما", + "spoiler_show_less": "عرض أقل", + "spoiler_show_more": "عرض المزيد", + "thread": "المحادثة", + "try_original_site": "جرب الموقع الأصلي" + }, + "status_history": { + "created": "تم إنشاؤه في {0}", + "edited": "تم تعديله في {0}" + }, + "tab": { + "accounts": "الحسابات", + "for_you": "مصممة لك", + "hashtags": "هاشتاغ", + "media": "الصور/الفيديو", + "news": "الأخبار", + "notifications_all": "كل شىء", + "notifications_mention": "موجهة إلي", + "posts": "المنشورات", + "posts_with_replies": "المنشورات والردود" + }, + "time_ago_options": { + "day_future": "في 0 يوم|غداً|في {n} يوم", + "day_past": "قبل {n} يوم|البارحة| قبل 0 يوم", + "hour_future": "في 0 ساعة|في 1 ساعة|في {n} ساعة", + "hour_past": "قبل 0 ساعة|قبل ساعة واحدة|{n} من الساعات الماضية", + "just_now": "الآن", + "minute_future": "في 0 دقيقة|في دقيقة واحدة|في {n} دقيقة", + "minute_past": "قبل 0 دقيقة|قبل دقيقة واحدة|قبل {n} دقيقة", + "month_future": "في 0 شهر|الشهر القادم|في {n} شهر", + "month_past": "قبل 0 شهر|الشهر الماضي|منذ {n} شهر", + "second_future": "الآن|في ثانية|في {n} ثواني", + "second_past": "للتو|منذ ثانية|منذ {n} ثانية", + "short_day_future": "في {n} ي", + "short_day_past": "{n}ي", + "short_hour_future": "في {n} س", + "short_hour_past": "{n}س", + "short_minute_future": "في {n} دق", + "short_minute_past": "{n}دق", + "short_month_future": "في {n} ش", + "short_month_past": "{n}ش", + "short_second_future": "في {n} ", + "short_second_past": "{n}", + "short_week_future": "في {n} اسبوع", + "short_week_past": "{n}اسبوع", + "short_year_future": "في {n} سنة", + "short_year_past": "{n}سنة", + "week_future": "في 0 أسبوع | الأسبوع القادم | في {n} أسبوع", + "week_past": "قبل 0 أسبوع | الأسبوع الماضي | {n} أسبوع مضى", + "year_future": "في 0 سنة|العام القادم|في {n} سنة", + "year_past": "منذ 0 سنة|العام الماضي|منذ {n} سنة" + }, + "timeline": { + "show_new_items": "إظهار {n} عناصر جديدة|إظهار {n} عنصر جديد|إظهار {n} عناصر جديدة" + }, + "title": { + "federated_timeline": "الجدول الزمني الموحد", + "local_timeline": "الجدول الزمني المحلي" + }, + "tooltip": { + "add_content_warning": "إضافة تحذير المحتوى", + "add_media": "أضف صورًا أو مقطع فيديو أو ملفًا صوتيًا", + "change_content_visibility": "تغيير خصوصية المحتوى", + "explore_links_intro": "يتم التحدث عن هذه القصص الإخبارية من قبل الأشخاص الموجودين على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي", + "explore_posts_intro": "تكتسب هذه المنشورات من هذه الشبكة وغيرها من الشبكات اللامركزية زخمًا على هذه الشبكة في الوقت الحالي", + "explore_tags_intro": "تكتسب هذه الهاشتاغ زخمًا بين الأشخاص على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي", + "toggle_code_block": "تبديل كتلة التعليمات البرمجية" + }, + "user": { + "add_existing": "إضافة حساب قائم", + "server_address_label": "عنوان خادم ماستودون", + "sign_out_account": "تسجيل الخروج من {0}", + "tip_no_account": "إذا ليس لديك حساب ماستودون ، {0}", + "tip_register_account": "اختر خادم ماستودون الخاص بك وقم بتسجيل حساب" + }, + "visibility": { + "direct": "رسالة مباشرة", + "direct_desc": "مرئي للمستخدمين المذكورين فقط", + "private": "المتابعون فقط", + "private_desc": "مرئي للمتابعين فقط", + "public": "عام", + "public_desc": "مرئي للجميع", + "unlisted": "غير مدرج", + "unlisted_desc": "مرئي للجميع ، ولكن تم إلغاء الاشتراك في ميزات الاكتشاف" + } +}