From 0aa44181e4c95743dd2611ce736180aa944f0d2d Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 04:41:37 +0100 Subject: [PATCH 01/10] feat: add arabic strings --- config/i18n.ts | 115 ++++---- i18n/locales/ar-EG.json | 1 + i18n/locales/ar.json | 588 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 646 insertions(+), 58 deletions(-) create mode 100644 i18n/locales/ar-EG.json create mode 100644 i18n/locales/ar.json diff --git a/config/i18n.ts b/config/i18n.ts index 9da86517..098162a2 100644 --- a/config/i18n.ts +++ b/config/i18n.ts @@ -13,26 +13,26 @@ interface LocaleObjectData extends LocaleObject { } export const countryLocaleVariants: Record = { - /*ar: [ - // ar.json contains ar-EG translations - // { code: 'ar-DZ', name: 'Arabic (Algeria)' }, - // { code: 'ar-BH', name: 'Arabic (Bahrain)' }, - { country: true, code: 'ar-EG', name: 'العربية' }, - // { code: 'ar-EG', name: 'Arabic (Egypt)' }, - // { code: 'ar-IQ', name: 'Arabic (Iraq)' }, - // { code: 'ar-JO', name: 'Arabic (Jordan)' }, - // { code: 'ar-KW', name: 'Arabic (Kuwait)' }, - // { code: 'ar-LB', name: 'Arabic (Lebanon)' }, - // { code: 'ar-LY', name: 'Arabic (Libya)' }, - // { code: 'ar-MA', name: 'Arabic (Morocco)' }, - // { code: 'ar-OM', name: 'Arabic (Oman)' }, - // { code: 'ar-QA', name: 'Arabic (Qatar)' }, - // { code: 'ar-SA', name: 'Arabic (Saudi Arabia)' }, - // { code: 'ar-SY', name: 'Arabic (Syria)' }, - // { code: 'ar-TN', name: 'Arabic (Tunisia)' }, - // { code: 'ar-AE', name: 'Arabic (U.A.E.)' }, - // { code: 'ar-YE', name: 'Arabic (Yemen)' }, - ],*/ + ar: [ + // ar.json contains ar-EG translations + // { code: 'ar-DZ', name: 'Arabic (Algeria)' }, + // { code: 'ar-BH', name: 'Arabic (Bahrain)' }, + { country: true, code: 'ar-EG', name: 'العربية' }, + // { code: 'ar-EG', name: 'Arabic (Egypt)' }, + // { code: 'ar-IQ', name: 'Arabic (Iraq)' }, + // { code: 'ar-JO', name: 'Arabic (Jordan)' }, + // { code: 'ar-KW', name: 'Arabic (Kuwait)' }, + // { code: 'ar-LB', name: 'Arabic (Lebanon)' }, + // { code: 'ar-LY', name: 'Arabic (Libya)' }, + // { code: 'ar-MA', name: 'Arabic (Morocco)' }, + // { code: 'ar-OM', name: 'Arabic (Oman)' }, + // { code: 'ar-QA', name: 'Arabic (Qatar)' }, + // { code: 'ar-SA', name: 'Arabic (Saudi Arabia)' }, + // { code: 'ar-SY', name: 'Arabic (Syria)' }, + // { code: 'ar-TN', name: 'Arabic (Tunisia)' }, + // { code: 'ar-AE', name: 'Arabic (U.A.E.)' }, + // { code: 'ar-YE', name: 'Arabic (Yemen)' }, + ], en: [ // en.json contains en-US translations { country: true, code: 'en-US', name: 'English (US)' }, @@ -84,47 +84,46 @@ const locales: (Omit & { code: string })[] = [ file: 'en.json', name: 'English', }, + { + code: 'ar', + file: 'ar.json', + name: 'العربية', + dir: 'rtl', + pluralRule: (choice: number) => { + const name = new Intl.PluralRules('ar-EG').select(choice) + return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] + }, + } satisfies LocaleObjectData, /*{ - code: 'ar', - file: 'ar.json', - name: 'العربية', - dir: 'rtl', - pluralRule: (choice: number) => { - const name = new Intl.PluralRules('ar-EG').select(choice) - return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] - }, - } satisfies LocaleObjectData, - { - code: 'ckb', - file: 'ckb.json', - name: 'کوردیی ناوەندی', - dir: 'rtl', - pluralRule: (choice: number) => { - const name = new Intl.PluralRules('ckb').select(choice) - return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] - }, - } satisfies LocaleObjectData, - { - code: 'fa-IR', - file: 'fa-IR.json', - name: 'فارسی', - dir: 'rtl', - pluralRule: (choice: number) => { - const name = new Intl.PluralRules('fa-IR').select(choice) - return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] - }, - } satisfies LocaleObjectData, - { - code: 'ca', - file: 'ca.json', - name: 'Català', + code: 'ckb', + file: 'ckb.json', + name: 'کوردیی ناوەندی', + dir: 'rtl', + pluralRule: (choice: number) => { + const name = new Intl.PluralRules('ckb').select(choice) + return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] }, - { - code: 'el-GR', - file: 'el-GR.json', - name: 'Ελληνικά', + } satisfies LocaleObjectData, + { + code: 'fa-IR', + file: 'fa-IR.json', + name: 'فارسی', + dir: 'rtl', + pluralRule: (choice: number) => { + const name = new Intl.PluralRules('fa-IR').select(choice) + return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] }, - */ + } satisfies LocaleObjectData, + { + code: 'ca', + file: 'ca.json', + name: 'Català', + }, + { + code: 'el-GR', + file: 'el-GR.json', + name: 'Ελληνικά', + },*/ { code: 'de-DE', file: 'de-DE.json', diff --git a/i18n/locales/ar-EG.json b/i18n/locales/ar-EG.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/i18n/locales/ar-EG.json @@ -0,0 +1 @@ +{} diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json new file mode 100644 index 00000000..49136412 --- /dev/null +++ b/i18n/locales/ar.json @@ -0,0 +1,588 @@ +{ + "seo": { + "home": { + "title": "npmx - متصفح الحزم لسجل npm", + "description": "متصفح أفضل لسجل npm. ابحث عن الحزم واستعرضها واستكشفها عبر واجهة حديثة." + } + }, + "tagline": "متصفح أفضل لسجل npm", + "non_affiliation_disclaimer": "غير مرتبط بشركة npm, Inc.", + "trademark_disclaimer": "npm علامة تجارية مسجلة لشركة npm, Inc. هذا الموقع غير مرتبط بشركة npm, Inc.", + "footer": { + "about": "حول", + "docs": "التوثيق", + "source": "المصدر", + "social": "اجتماعي", + "chat": "الدردشة" + }, + "search": { + "label": "ابحث عن حزم npm", + "placeholder": "ابحث عن الحزم...", + "button": "بحث", + "clear": "مسح البحث", + "searching": "جارٍ البحث...", + "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", + "updating": "(جارٍ التحديث...)", + "no_results": "لم يتم العثور على حزم لـ \"{query}\"", + "not_taken": "الاسم {name} غير مأخوذ", + "claim_prompt": "احجز اسم هذه الحزمة على npm", + "claim_button": "احجز \"{name}\"", + "want_to_claim": "هل تريد حجز اسم هذه الحزمة؟", + "start_typing": "ابدأ الكتابة للبحث عن الحزم", + "exact_match": "مطابقة تامة", + "suggestion": { + "user": "مستخدم", + "org": "مؤسسة", + "view_user_packages": "عرض حزم هذا المستخدم", + "view_org_packages": "عرض حزم هذه المؤسسة" + } + }, + "nav": { + "popular_packages": "الحزم الشائعة", + "search": "بحث", + "settings": "الإعدادات", + "back": "عودة" + }, + "settings": { + "relative_dates": "تواريخ نسبية", + "include_types": "تضمين {'@'}types في التثبيت", + "theme": "السمة", + "theme_light": "فاتحة", + "theme_dark": "داكنة", + "theme_system": "سمة النظام", + "language": "اللغة", + "help_translate": "ساهم في ترجمة npmx", + "accent_colors": "ألوان الموقع" + }, + "common": { + "loading": "جارٍ التحميل...", + "loading_more": "جارٍ تحميل المزيد...", + "loading_packages": "جارٍ تحميل الحزم...", + "end_of_results": "نهاية النتائج", + "try_again": "حاول مرة أخرى", + "close": "إغلاق", + "retry": "إعادة المحاولة", + "copy": "نسخ", + "copied": "تم النسخ!", + "show_more": "عرض المزيد", + "warnings": "تحذيرات:", + "go_back_home": "العودة إلى الصفحة الرئيسية", + "view_on_npm": "عرض على npm", + "per_week": "/ أسبوع", + "sort": { + "name": "الاسم", + "role": "الدور", + "members": "الأعضاء" + }, + "scroll_to_top": "التمرير إلى الأعلى" + }, + "package": { + "not_found": "لم يتم العثور على الحزمة", + "not_found_message": "تعذّر العثور على الحزمة.", + "no_description": "لا يوجد وصف", + "show_full_description": "عرض الوصف بالكامل", + "not_latest": "(ليست الأحدث)", + "verified_provenance": "مصدر موثّق", + "view_permalink": "عرض الرابط الدائم لهذا الإصدار", + "deprecation": { + "package": "تم إهمال هذه الحزمة.", + "version": "تم إهمال هذا الإصدار.", + "no_reason": "لم يتم تقديم سبب" + }, + "stats": { + "license": "الترخيص", + "weekly": "أسبوعيًا", + "deps": "الاعتماديات", + "install_size": "حجم التثبيت", + "updated": "آخر تحديث", + "view_download_trends": "عرض اتجاهات التنزيل", + "view_dependency_graph": "عرض مخطط الاعتماديات", + "inspect_dependency_tree": "فحص شجرة الاعتماديات" + }, + "links": { + "repo": "المستودع", + "homepage": "الصفحة الرئيسية", + "issues": "المشكلات", + "forks": "تفرعات | تفرع | تفرعات | تفرعات | تفرع | تفرع", + "jsr": "jsr", + "code": "الكود", + "docs": "التوثيق", + "fund": "التمويل" + }, + "get_started": { + "title": "البدء", + "pm_label": "مدير الحزم", + "copy_command": "نسخ أمر التثبيت", + "view_types": "عرض {package}" + }, + "create": { + "title": "إنشاء مشروع جديد", + "copy_command": "نسخ أمر الإنشاء" + }, + "run": { + "title": "تشغيل", + "locally": "تشغيل محليًا" + }, + "readme": { + "title": "README (إقرأني)", + "no_readme": "لا يتوفر README.", + "view_on_github": "عرض على GitHub" + }, + "keywords_title": "الكلمات المفتاحية", + "compatibility": "التوافق", + "card": { + "publisher": "الناشر", + "updated": "آخر تحديث", + "weekly_downloads": "التنزيلات الأسبوعية", + "keywords": "الكلمات المفتاحية", + "license": "الترخيص" + }, + "versions": { + "title": "الإصدارات", + "collapse": "طي {tag}", + "expand": "توسيع {tag}", + "collapse_other": "طي الإصدارات الأخرى", + "expand_other": "توسيع الإصدارات الأخرى", + "collapse_major": "طي الرئيسي {major}", + "expand_major": "توسيع الرئيسي {major}", + "other_versions": "إصدارات أخرى", + "more_tagged": "{count} إصدار موسوم آخر | إصدار موسوم آخر | إصدارين موسومين أخريين | {count} إصدارات موسومة أخرى | {count} إصدار موسوم آخر | {count} إصدار موسوم آخر", + "all_covered": "جميع الإصدارات مشمولة بالوسوم أعلاه", + "deprecated_title": "{version} (مهمل)" + }, + "dependencies": { + "title": "الاعتماديات ({count})", + "list_label": "اعتماديات الحزمة", + "show_all": "عرض كل الاعتماديات ({count})", + "optional": "اختياري" + }, + "peer_dependencies": { + "title": "اعتماديات النظير ({count})", + "list_label": "اعتماديات نظير الحزمة", + "show_all": "عرض كل اعتماديات النظير ({count})" + }, + "optional_dependencies": { + "title": "اعتماديات اختيارية ({count})", + "list_label": "اعتماديات الحزمة الاختيارية", + "show_all": "عرض كل الاعتماديات الاختيارية ({count})" + }, + "maintainers": { + "title": "القائمون على الصيانة", + "list_label": "قائمو صيانة الحزمة", + "you": "(أنت)", + "via": "عبر {teams}", + "remove_owner": "إزالة {name} كمالك", + "username_to_add": "اسم المستخدم لإضافته كمالك", + "username_placeholder": "اسم المستخدم...", + "add_button": "إضافة", + "cancel_add": "إلغاء إضافة المالك", + "add_owner": "+ إضافة مالك" + }, + "downloads": { + "title": "التنزيلات الأسبوعية", + "date_range": "من {start} إلى {end}", + "analyze": "تحليل التنزيلات", + "modal_title": "التنزيلات", + "granularity": "مستوى التفصيل", + "granularity_daily": "يومي", + "granularity_weekly": "أسبوعي", + "granularity_monthly": "شهري", + "granularity_yearly": "سنوي", + "start_date": "البداية", + "end_date": "النهاية", + "no_data": "لا تتوفر بيانات تنزيل", + "loading": "جارٍ التحميل...", + "y_axis_label": "تنزيلات {granularity}ة" + }, + "install_scripts": { + "title": "سكربتات التثبيت", + "script_label": "(سكربت)", + "npx_packages": "{count} حزم npx | حزمة npx واحدة | حزمتي npx | {count} حزم npx | {count} حزمة npx | {count} حزمة npx", + "currently": "حاليًا {version}" + }, + "playgrounds": { + "title": "جرّبه", + "choose": "اختر بيئة تجريب" + }, + "metrics": { + "esm": "ES Modules مدعومة", + "cjs": "CommonJS مدعومة", + "no_esm": "لا تدعم ES Modules", + "types_included": "أنواع TypeScript مضمّنة", + "types_available": "أنواع TypeScript متوفرة عبر {package}", + "no_types": "لا توجد أنواع TypeScript" + }, + "license": { + "view_spdx": "عرض نص الترخيص على SPDX" + }, + "vulnerabilities": { + "no_description": "لا يتوفر وصف", + "found": "تم العثور على {count} ثغرة | تم العثور على ثغرة واحدة | تم العثور على ثغرتين | تم العثور على {count} ثغرات | تم العثور على {count} ثغرة | تم العثور على {count} ثغرة", + "deps_found": "تم العثور على {count} ثغرة | تم العثور على ثغرة واحدة | تم العثور على ثغرتين | تم العثور على {count} ثغرات | تم العثور على {count} ثغرة | تم العثور على {count} ثغرة", + "deps_affected": "تأثرت {count} تبعية | تأثرت تبعية واحدة | تأثرت تبعيتان | تأثرت {count} تبعيات | تأثرت {count} تبعية | تأثرت {count} تبعية", + "tree_found": "{vulns} ثغرة في {packages}/{total} حزمة | ثغرة واحدة في {packages}/{total} حزمة | ثغرتان في {packages}/{total} حزمة | {vulns} ثغرات في {packages}/{total} حزمة | {vulns} ثغرة في {packages}/{total} حزمة | {vulns} ثغرة في {packages}/{total} حزمة", + "scanning_tree": "جارٍ فحص شجرة الاعتماديات...", + "show_all_packages": "عرض كل الحزم المتأثرة ({count})", + "no_summary": "لا يوجد ملخص", + "view_details": "عرض تفاصيل الثغرة", + "path": "المسار", + "more": "+{count} أخرى", + "packages_failed": "تعذر فحص {count} حزمة | تعذر فحص الحزمة | تعذر فحص الحزمتين | تعذر فحص {count} حزم | تعذر فحص {count} حزمة | تعذر فحص {count} حزمة", + "no_known": "لا توجد ثغرات معروفة في {count} حزمة | لا توجد ثغرات معروفة في الحزمة | لا توجد ثغرات معروفة في الحزمتين | لا توجد ثغرات معروفة في {count} حزم | لا توجد ثغرات معروفة في {count} حزمة | لا توجد ثغرات معروفة في {count} حزمة", + "scan_failed": "تعذر فحص الثغرات", + "depth": { + "root": "هذه الحزمة", + "direct": "تبعية مباشرة", + "transitive": "تبعية غير مباشرة" + }, + "severity": { + "critical": "حرجة", + "high": "عالية", + "moderate": "متوسطة", + "low": "منخفضة" + } + }, + "access": { + "title": "وصول الفريق", + "refresh": "تحديث وصول الفريق", + "list_label": "قائمة وصول الفريق", + "owner": "مالك", + "rw": "قراءة/كتابة", + "ro": "قراءة فقط", + "revoke_access": "سحب وصول {name}", + "no_access": "لا يوجد وصول فريق مُعدّ", + "select_team_label": "اختر فريقًا", + "loading_teams": "جارٍ تحميل الفرق...", + "select_team": "اختر فريقًا", + "permission_label": "مستوى الصلاحية", + "permission": { + "read_only": "قراءة فقط", + "read_write": "قراءة/كتابة" + }, + "grant_button": "منح", + "cancel_grant": "إلغاء منح الوصول", + "grant_access": "+ منح وصول للفريق" + }, + "list": { + "filter_label": "فلترة الحزم", + "filter_placeholder": "فلتر الحزم...", + "sort_label": "ترتيب الحزم", + "showing_count": "يعرض {filtered} من أصل {total} حزمة" + }, + "skeleton": { + "loading": "جارٍ تحميل تفاصيل الحزمة", + "license": "الترخيص", + "weekly": "أسبوعيًا", + "size": "الحجم", + "deps": "الاعتماديات", + "updated": "آخر تحديث", + "install": "تثبيت", + "readme": "README", + "maintainers": "القائمون على الصيانة", + "keywords": "الكلمات المفتاحية", + "versions": "الإصدارات", + "dependencies": "الاعتماديات" + }, + "sort": { + "downloads": "الأكثر تنزيلًا", + "updated": "مُحدَّثة مؤخرًا", + "name_asc": "الاسم (A-Z)", + "name_desc": "الاسم (Z-A)" + } + }, + "connector": { + "status": { + "connecting": "جارٍ الاتصال...", + "connected_as": "متصل كـ {'@'}{user}", + "connected": "متصل", + "connect_cli": "ربط واجهة سطر الأوامر المحلية", + "aria_connecting": "جارٍ الاتصال بالموصل المحلي", + "aria_connected": "تم الاتصال بالموصل المحلي", + "aria_click_to_connect": "انقر للاتصال بالموصل المحلي", + "avatar_alt": "صورة {user} الرمزية" + }, + "modal": { + "title": "الموصل المحلي", + "close_modal": "إغلاق النافذة", + "connected": "متصل", + "logged_in_as": "تم تسجيل الدخول كـ {'@'}{user}", + "connected_hint": "يمكنك الآن إدارة الحزم والمؤسسات من واجهة الويب.", + "disconnect": "قطع الاتصال", + "run_hint": "شغّل الموصل على جهازك لتمكين ميزات الإدارة.", + "copy_command": "نسخ الأمر", + "copied": "تم النسخ", + "paste_token": "ثم الصق الرمز أدناه للاتصال:", + "token_label": "الرمز", + "token_placeholder": "الصق الرمز هنا...", + "advanced": "خيارات متقدمة", + "port_label": "المنفذ", + "warning": "تحذير!", + "warning_text": "يسمح هذا لـ npmx بالوصول إلى npm CLI لديك. لا تتصل إلا بالمواقع التي تثق بها.", + "connect": "اتصال", + "connecting": "جارٍ الاتصال..." + } + }, + "operations": { + "queue": { + "title": "قائمة العمليات", + "clear_all": "مسح الكل", + "refresh": "تحديث العمليات", + "empty": "لا توجد عمليات في القائمة", + "empty_hint": "أضف عمليات من صفحات الحزمة أو المؤسسة", + "active_label": "العمليات النشطة", + "otp_required": "رمز OTP مطلوب", + "otp_prompt": "أدخل رمز OTP للمتابعة", + "otp_placeholder": "أدخل رمز OTP...", + "otp_label": "كلمة المرور وحيدة الاستخدام (OTP)", + "retry_otp": "إعادة المحاولة باستخدام OTP", + "retrying": "جارٍ إعادة المحاولة...", + "approve_operation": "الموافقة على العملية", + "remove_operation": "إزالة العملية", + "approve_all": "الموافقة على الكل", + "execute": "تنفيذ", + "executing": "جارٍ التنفيذ...", + "log": "السجل", + "log_label": "سجل العمليات المكتملة", + "remove_from_log": "إزالة من السجل" + } + }, + "org": { + "teams": { + "title": "الفرق", + "refresh": "تحديث الفرق", + "filter_label": "فلترة الفرق", + "filter_placeholder": "فلتر الفرق...", + "sort_by": "الترتيب حسب", + "loading": "جارٍ تحميل الفرق...", + "no_teams": "لم يتم العثور على فرق", + "list_label": "فرق المؤسسة", + "delete_team": "حذف الفريق {name}", + "member_count": "{count} أعضاء | عضو واحد | عضوان | {count} أعضاء | {count} عضواً | {count} عضواً", + "members_of": "أعضاء {team}", + "no_members": "لا يوجد أعضاء", + "remove_user": "إزالة {user} من الفريق", + "username_to_add": "اسم المستخدم لإضافته إلى {team}", + "username_placeholder": "اسم المستخدم...", + "add_button": "إضافة", + "cancel_add_user": "إلغاء إضافة المستخدم", + "add_member": "+ إضافة عضو", + "team_name_label": "اسم الفريق", + "team_name_placeholder": "اسم-الفريق...", + "create_button": "إنشاء", + "no_match": "لا توجد فرق تطابق \"{query}\"", + "cancel_create": "إلغاء إنشاء الفريق", + "create_team": "+ إنشاء فريق" + }, + "members": { + "title": "الأعضاء", + "refresh": "تحديث الأعضاء", + "filter_label": "فلترة الأعضاء", + "filter_placeholder": "فلتر الأعضاء...", + "filter_by_role": "فلترة حسب الدور", + "filter_by_team": "فلترة حسب الفريق", + "all_teams": "كل الفرق", + "sort_by": "الترتيب حسب", + "loading": "جارٍ تحميل الأعضاء...", + "no_members": "لم يتم العثور على أعضاء", + "list_label": "أعضاء المؤسسة", + "change_role_for": "تغيير الدور لـ {name}", + "remove_from_org": "إزالة {name} من المؤسسة", + "view_team": "عرض فريق {team}", + "no_match": "لا يوجد أعضاء يطابقون عوامل الفلترة", + "username_label": "اسم المستخدم", + "username_placeholder": "اسم المستخدم...", + "role_label": "الدور", + "role": { + "all": "الكل", + "developer": "مطور", + "admin": "مدير", + "owner": "مالك" + }, + "team_label": "الفريق", + "no_team": "بدون فريق", + "add_button": "إضافة", + "cancel_add": "إلغاء إضافة عضو", + "add_member": "+ إضافة عضو" + }, + "public_packages": "{count} حزم عامة | حزمة عامة واحدة | حزمتان عامتان | {count} حزم عامة | {count} حزمة عامة | {count} حزمة عامة", + "page": { + "packages_title": "الحزم", + "members_tab": "الأعضاء", + "teams_tab": "الفرق", + "no_packages": "لم يتم العثور على حزم عامة لـ", + "no_packages_hint": "قد لا تكون هذه المؤسسة موجودة أو قد لا تحتوي على حزم عامة.", + "failed_to_load": "فشل تحميل حزم المؤسسة", + "no_match": "لا توجد حزم تطابق \"{query}\"", + "not_found": "لم يتم العثور على المؤسسة", + "not_found_message": "المؤسسة \"{'@'}{name}\" غير موجودة على npm", + "filter_placeholder": "فلتر {count} حزمة..." + } + }, + "user": { + "combobox": { + "add_to_org_hint": "(سيُضاف أيضًا إلى المؤسسة)", + "press_enter_to_add": "اضغط Enter لإضافة {'@'}{username}", + "default_placeholder": "اسم المستخدم...", + "suggestions_label": "اقتراحات المستخدمين" + }, + "page": { + "packages_title": "الحزم", + "no_packages": "لم يتم العثور على حزم عامة لـ", + "no_packages_hint": "قد لا يكون هذا المستخدم موجودًا أو قد لا يحتوي على حزم عامة.", + "failed_to_load": "فشل تحميل حزم المستخدم", + "no_match": "لا توجد حزم تطابق \"{query}\"", + "filter_placeholder": "فلتر {count} حزمة..." + }, + "orgs_page": { + "title": "المؤسسات", + "back_to_profile": "العودة إلى الملف الشخصي", + "connect_required": "اربط واجهة سطر الأوامر المحلية لعرض مؤسساتك.", + "connect_hint_prefix": "شغّل", + "connect_hint_suffix": "للبدء.", + "own_orgs_only": "يمكنك عرض مؤسساتك أنت فقط.", + "view_your_orgs": "عرض مؤسساتك", + "loading": "جارٍ تحميل المؤسسات...", + "empty": "لم يتم العثور على مؤسسات.", + "empty_hint": "يتم اكتشاف المؤسسات من حزمك ذات النطاق (scoped).", + "count": "{count} مؤسسة | مؤسسة واحدة | مؤسستان | {count} مؤسسات | {count} مؤسسة | {count} مؤسسة", + "packages_count": "{count} حزمة | حزمة واحدة | حزمتان | {count} حزم | {count} حزمة | {count} حزمة" + } + }, + "claim": { + "modal": { + "title": "حجز اسم حزمة", + "close_modal": "إغلاق النافذة", + "success": "تم حجز الحزمة!", + "success_detail": "تم نشر {name}{'@'}0.0.0 على npm.", + "success_hint": "يمكنك الآن نشر إصدارات جديدة لهذه الحزمة باستخدام npm publish.", + "view_package": "عرض الحزمة", + "invalid_name": "اسم حزمة غير صالح:", + "available": "هذا الاسم متاح!", + "taken": "هذا الاسم مستخدم بالفعل.", + "similar_warning": "توجد حزم مشابهة — قد يرفض npm هذا الاسم:", + "related": "حزم ذات صلة:", + "scope_warning_title": "فكّر في استخدام حزمة بنطاق (scoped) بدلًا من ذلك", + "scope_warning_text": "أسماء الحزم غير ذات النطاق هي مورد مشترك. لا تحجز اسمًا إلا إذا كنت تنوي نشر حزمة وصيانتها. للمشاريع الشخصية أو المؤسسية، استخدم اسمًا ذا نطاق مثل {'@'}{username}/{name}.", + "connect_required": "اربط الموصل المحلي لحجز اسم هذه الحزمة.", + "connect_button": "الاتصال بالموصل", + "publish_hint": "سيؤدي هذا إلى نشر حزمة مصغرة كعنصر نائب (placeholder).", + "preview_json": "معاينة package.json", + "claim_button": "حجز اسم الحزمة", + "publishing": "جارٍ النشر...", + "checking": "جارٍ التحقق من التوفر...", + "failed_to_check": "فشل التحقق من توفر الاسم", + "failed_to_claim": "فشل حجز الحزمة" + } + }, + "code": { + "files_label": "الملفات", + "no_files": "لا توجد ملفات في هذا المجلد", + "select_version": "اختر إصدارًا", + "root": "الجذر", + "lines": "{count} سطر", + "toggle_tree": "تبديل شجرة الملفات", + "close_tree": "إغلاق شجرة الملفات", + "copy_link": "نسخ الرابط", + "raw": "خام (Raw)", + "view_raw": "عرض الملف الخام (Raw)", + "file_too_large": "الملف كبير جدًا للمعاينة", + "file_size_warning": "{size} يتجاوز حد 500KB للتظليل النحوي (syntax highlighting)", + "load_anyway": "تحميل على أي حال", + "failed_to_load": "فشل تحميل الملف", + "unavailable_hint": "قد يكون الملف كبيرًا جدًا أو غير متاح", + "version_required": "الإصدار مطلوب لتصفح الكود", + "go_to_package": "الانتقال إلى الحزمة", + "loading_tree": "جارٍ تحميل شجرة الملفات...", + "failed_to_load_tree": "فشل تحميل الملفات لهذا الإصدار من الحزمة", + "back_to_package": "العودة إلى الحزمة", + "table": { + "name": "الاسم", + "size": "الحجم" + } + }, + "badges": { + "provenance": { + "verified": "موثّق", + "verified_title": "مصدر موثّق", + "verified_via": "موثّق: تم النشر عبر {provider}" + }, + "jsr": { + "title": "متوفر أيضًا على JSR", + "label": "jsr" + } + }, + "about": { + "title": "حول", + "heading": "حول", + "meta_description": "npmx هو متصفح سريع وحديث لسجل npm. تجربة مستخدم أفضل لاستكشاف حزم npm.", + "back_home": "العودة إلى الصفحة الرئيسية", + "what_we_are": { + "title": "ما هو npmx", + "better_ux_dx": "تجربة مستخدم/مطور أفضل", + "admin_ui": "واجهة إدارة", + "description": "npmx هو {betterUxDx} لسجل حزم npm وأدواته. نحن نوفر واجهة سريعة وحديثة لاستكشاف الحزم، مع ميزات مثل الوضع الداكن، التنقل عبر لوحة المفاتيح، تصفح الكود، والاتصالات بسجلات بديلة مثل {jsr}.", + "admin_description": "نهدف أيضًا إلى توفير {adminUi} أفضل لإدارة حزمك، فرقك، ومنظماتك — كل ذلك من المتصفح، مدعومًا بواسطة npm CLI المحلي الخاص بك." + }, + "what_we_are_not": { + "title": "ما ليس هو npmx", + "not_package_manager": "ليس مدير حزم.", + "not_registry": "ليس سجلًا.", + "registry_description": "نحن لا نستضيف الحزم. نحن مجرد طريقة أفضل لتصفحها.", + "package_managers_exist": "{already} {people} {building} {managers} {package} {cool} {really}.", + "words": { + "already": "هناك بالفعل", + "people": "أشخاص", + "building": "يبنون", + "really": "جدا", + "cool": "رائعة", + "package": "حزم", + "managers": "مديري" + } + }, + "contributors": { + "title": "المساهمون", + "description": "npmx هو مشروع مفتوح المصدر بالكامل، تم بناؤه بواسطة مجتمع مذهل من المساهمين.", + "loading": "جارٍ تحميل المساهمين...", + "error": "فشل تحميل المساهمين", + "view_profile": "عرض بروفايل {name} على GitHub" + }, + "get_involved": { + "title": "كن جزءًا من npmx", + "contribute": { + "title": "المساهمة", + "description": "ساعدنا في بناء تجربة npm أفضل.", + "cta": "عرض على GitHub" + }, + "community": { + "title": "انضم إلى المجتمع", + "description": "تحدث، اطرح الأسئلة، وشارك الأفكار.", + "cta": "انضم إلى Discord" + }, + "follow": { + "title": "ابقَ على اطلاع", + "description": "اكتشف آخر الأخبار عن npmx.", + "cta": "تابع على Bluesky" + } + } + }, + "header": { + "home": "الصفحة الرئيسية لـ npmx", + "github": "GitHub", + "packages": "الحزم", + "packages_dropdown": { + "title": "حزمك", + "loading": "جارٍ التحميل...", + "error": "فشل تحميل الحزم", + "empty": "لا توجد حزم", + "view_all": "عرض الكل" + }, + "orgs": "المؤسسات", + "orgs_dropdown": { + "title": "مؤسساتك", + "loading": "جارٍ التحميل...", + "error": "فشل تحميل المؤسسات", + "empty": "لا توجد مؤسسات", + "view_all": "عرض الكل" + } + } +} From f88777e376746e806dc7e8ab118b085bde3863d0 Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 04:42:54 +0100 Subject: [PATCH 02/10] fix: add pluralization for `found_packages` for en --- i18n/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 363baa7d..b2e71c0c 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -21,7 +21,7 @@ "button": "search", "clear": "Clear search", "searching": "Searching...", - "found_packages": "Found {count} packages", + "found_packages": "Found 1 package | Found {count} packages", "updating": "(updating...)", "no_results": "No packages found for \"{query}\"", "results": "Search results", From b57d9cc69ca5aebbe3614e7a2f78b0115029dff7 Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 04:43:31 +0100 Subject: [PATCH 03/10] fix: supply plural number in various t calls --- app/components/PackageVersions.vue | 8 +++++++- app/pages/search.vue | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/components/PackageVersions.vue b/app/components/PackageVersions.vue index 2c111134..babea642 100644 --- a/app/components/PackageVersions.vue +++ b/app/components/PackageVersions.vue @@ -498,7 +498,13 @@ function getTagVersions(tag: string): VersionDisplay[] { {{ $t('package.versions.other_versions') }} - ({{ $t('package.versions.more_tagged', { count: hiddenTagRows.length }) }}) + ({{ + $t( + 'package.versions.more_tagged', + { count: hiddenTagRows.length }, + hiddenTagRows.length, + ) + }}) diff --git a/app/pages/search.vue b/app/pages/search.vue index 1453f3f6..a39ecbd1 100644 --- a/app/pages/search.vue +++ b/app/pages/search.vue @@ -886,7 +886,13 @@ defineOgImageComponent('Default', { role="status" class="text-fg-muted text-sm mt-4 font-mono" > - {{ $t('search.found_packages', { count: formatNumber(visibleResults.total) }) }} + {{ + $t( + 'search.found_packages', + { count: formatNumber(visibleResults.total) }, + visibleResults.total, + ) + }} {{ $t('search.updating') }} From 62195bc596b4bb956c79b2a180a202de6dcadea5 Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 23:00:28 +0100 Subject: [PATCH 04/10] fix: add lunaria files --- lunaria/files/ar-EG.json | 588 +++++++++++++++++++++++++++++++++++++++ lunaria/files/en-US.json | 2 +- 2 files changed, 589 insertions(+), 1 deletion(-) create mode 100644 lunaria/files/ar-EG.json diff --git a/lunaria/files/ar-EG.json b/lunaria/files/ar-EG.json new file mode 100644 index 00000000..49136412 --- /dev/null +++ b/lunaria/files/ar-EG.json @@ -0,0 +1,588 @@ +{ + "seo": { + "home": { + "title": "npmx - متصفح الحزم لسجل npm", + "description": "متصفح أفضل لسجل npm. ابحث عن الحزم واستعرضها واستكشفها عبر واجهة حديثة." + } + }, + "tagline": "متصفح أفضل لسجل npm", + "non_affiliation_disclaimer": "غير مرتبط بشركة npm, Inc.", + "trademark_disclaimer": "npm علامة تجارية مسجلة لشركة npm, Inc. هذا الموقع غير مرتبط بشركة npm, Inc.", + "footer": { + "about": "حول", + "docs": "التوثيق", + "source": "المصدر", + "social": "اجتماعي", + "chat": "الدردشة" + }, + "search": { + "label": "ابحث عن حزم npm", + "placeholder": "ابحث عن الحزم...", + "button": "بحث", + "clear": "مسح البحث", + "searching": "جارٍ البحث...", + "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", + "updating": "(جارٍ التحديث...)", + "no_results": "لم يتم العثور على حزم لـ \"{query}\"", + "not_taken": "الاسم {name} غير مأخوذ", + "claim_prompt": "احجز اسم هذه الحزمة على npm", + "claim_button": "احجز \"{name}\"", + "want_to_claim": "هل تريد حجز اسم هذه الحزمة؟", + "start_typing": "ابدأ الكتابة للبحث عن الحزم", + "exact_match": "مطابقة تامة", + "suggestion": { + "user": "مستخدم", + "org": "مؤسسة", + "view_user_packages": "عرض حزم هذا المستخدم", + "view_org_packages": "عرض حزم هذه المؤسسة" + } + }, + "nav": { + "popular_packages": "الحزم الشائعة", + "search": "بحث", + "settings": "الإعدادات", + "back": "عودة" + }, + "settings": { + "relative_dates": "تواريخ نسبية", + "include_types": "تضمين {'@'}types في التثبيت", + "theme": "السمة", + "theme_light": "فاتحة", + "theme_dark": "داكنة", + "theme_system": "سمة النظام", + "language": "اللغة", + "help_translate": "ساهم في ترجمة npmx", + "accent_colors": "ألوان الموقع" + }, + "common": { + "loading": "جارٍ التحميل...", + "loading_more": "جارٍ تحميل المزيد...", + "loading_packages": "جارٍ تحميل الحزم...", + "end_of_results": "نهاية النتائج", + "try_again": "حاول مرة أخرى", + "close": "إغلاق", + "retry": "إعادة المحاولة", + "copy": "نسخ", + "copied": "تم النسخ!", + "show_more": "عرض المزيد", + "warnings": "تحذيرات:", + "go_back_home": "العودة إلى الصفحة الرئيسية", + "view_on_npm": "عرض على npm", + "per_week": "/ أسبوع", + "sort": { + "name": "الاسم", + "role": "الدور", + "members": "الأعضاء" + }, + "scroll_to_top": "التمرير إلى الأعلى" + }, + "package": { + "not_found": "لم يتم العثور على الحزمة", + "not_found_message": "تعذّر العثور على الحزمة.", + "no_description": "لا يوجد وصف", + "show_full_description": "عرض الوصف بالكامل", + "not_latest": "(ليست الأحدث)", + "verified_provenance": "مصدر موثّق", + "view_permalink": "عرض الرابط الدائم لهذا الإصدار", + "deprecation": { + "package": "تم إهمال هذه الحزمة.", + "version": "تم إهمال هذا الإصدار.", + "no_reason": "لم يتم تقديم سبب" + }, + "stats": { + "license": "الترخيص", + "weekly": "أسبوعيًا", + "deps": "الاعتماديات", + "install_size": "حجم التثبيت", + "updated": "آخر تحديث", + "view_download_trends": "عرض اتجاهات التنزيل", + "view_dependency_graph": "عرض مخطط الاعتماديات", + "inspect_dependency_tree": "فحص شجرة الاعتماديات" + }, + "links": { + "repo": "المستودع", + "homepage": "الصفحة الرئيسية", + "issues": "المشكلات", + "forks": "تفرعات | تفرع | تفرعات | تفرعات | تفرع | تفرع", + "jsr": "jsr", + "code": "الكود", + "docs": "التوثيق", + "fund": "التمويل" + }, + "get_started": { + "title": "البدء", + "pm_label": "مدير الحزم", + "copy_command": "نسخ أمر التثبيت", + "view_types": "عرض {package}" + }, + "create": { + "title": "إنشاء مشروع جديد", + "copy_command": "نسخ أمر الإنشاء" + }, + "run": { + "title": "تشغيل", + "locally": "تشغيل محليًا" + }, + "readme": { + "title": "README (إقرأني)", + "no_readme": "لا يتوفر README.", + "view_on_github": "عرض على GitHub" + }, + "keywords_title": "الكلمات المفتاحية", + "compatibility": "التوافق", + "card": { + "publisher": "الناشر", + "updated": "آخر تحديث", + "weekly_downloads": "التنزيلات الأسبوعية", + "keywords": "الكلمات المفتاحية", + "license": "الترخيص" + }, + "versions": { + "title": "الإصدارات", + "collapse": "طي {tag}", + "expand": "توسيع {tag}", + "collapse_other": "طي الإصدارات الأخرى", + "expand_other": "توسيع الإصدارات الأخرى", + "collapse_major": "طي الرئيسي {major}", + "expand_major": "توسيع الرئيسي {major}", + "other_versions": "إصدارات أخرى", + "more_tagged": "{count} إصدار موسوم آخر | إصدار موسوم آخر | إصدارين موسومين أخريين | {count} إصدارات موسومة أخرى | {count} إصدار موسوم آخر | {count} إصدار موسوم آخر", + "all_covered": "جميع الإصدارات مشمولة بالوسوم أعلاه", + "deprecated_title": "{version} (مهمل)" + }, + "dependencies": { + "title": "الاعتماديات ({count})", + "list_label": "اعتماديات الحزمة", + "show_all": "عرض كل الاعتماديات ({count})", + "optional": "اختياري" + }, + "peer_dependencies": { + "title": "اعتماديات النظير ({count})", + "list_label": "اعتماديات نظير الحزمة", + "show_all": "عرض كل اعتماديات النظير ({count})" + }, + "optional_dependencies": { + "title": "اعتماديات اختيارية ({count})", + "list_label": "اعتماديات الحزمة الاختيارية", + "show_all": "عرض كل الاعتماديات الاختيارية ({count})" + }, + "maintainers": { + "title": "القائمون على الصيانة", + "list_label": "قائمو صيانة الحزمة", + "you": "(أنت)", + "via": "عبر {teams}", + "remove_owner": "إزالة {name} كمالك", + "username_to_add": "اسم المستخدم لإضافته كمالك", + "username_placeholder": "اسم المستخدم...", + "add_button": "إضافة", + "cancel_add": "إلغاء إضافة المالك", + "add_owner": "+ إضافة مالك" + }, + "downloads": { + "title": "التنزيلات الأسبوعية", + "date_range": "من {start} إلى {end}", + "analyze": "تحليل التنزيلات", + "modal_title": "التنزيلات", + "granularity": "مستوى التفصيل", + "granularity_daily": "يومي", + "granularity_weekly": "أسبوعي", + "granularity_monthly": "شهري", + "granularity_yearly": "سنوي", + "start_date": "البداية", + "end_date": "النهاية", + "no_data": "لا تتوفر بيانات تنزيل", + "loading": "جارٍ التحميل...", + "y_axis_label": "تنزيلات {granularity}ة" + }, + "install_scripts": { + "title": "سكربتات التثبيت", + "script_label": "(سكربت)", + "npx_packages": "{count} حزم npx | حزمة npx واحدة | حزمتي npx | {count} حزم npx | {count} حزمة npx | {count} حزمة npx", + "currently": "حاليًا {version}" + }, + "playgrounds": { + "title": "جرّبه", + "choose": "اختر بيئة تجريب" + }, + "metrics": { + "esm": "ES Modules مدعومة", + "cjs": "CommonJS مدعومة", + "no_esm": "لا تدعم ES Modules", + "types_included": "أنواع TypeScript مضمّنة", + "types_available": "أنواع TypeScript متوفرة عبر {package}", + "no_types": "لا توجد أنواع TypeScript" + }, + "license": { + "view_spdx": "عرض نص الترخيص على SPDX" + }, + "vulnerabilities": { + "no_description": "لا يتوفر وصف", + "found": "تم العثور على {count} ثغرة | تم العثور على ثغرة واحدة | تم العثور على ثغرتين | تم العثور على {count} ثغرات | تم العثور على {count} ثغرة | تم العثور على {count} ثغرة", + "deps_found": "تم العثور على {count} ثغرة | تم العثور على ثغرة واحدة | تم العثور على ثغرتين | تم العثور على {count} ثغرات | تم العثور على {count} ثغرة | تم العثور على {count} ثغرة", + "deps_affected": "تأثرت {count} تبعية | تأثرت تبعية واحدة | تأثرت تبعيتان | تأثرت {count} تبعيات | تأثرت {count} تبعية | تأثرت {count} تبعية", + "tree_found": "{vulns} ثغرة في {packages}/{total} حزمة | ثغرة واحدة في {packages}/{total} حزمة | ثغرتان في {packages}/{total} حزمة | {vulns} ثغرات في {packages}/{total} حزمة | {vulns} ثغرة في {packages}/{total} حزمة | {vulns} ثغرة في {packages}/{total} حزمة", + "scanning_tree": "جارٍ فحص شجرة الاعتماديات...", + "show_all_packages": "عرض كل الحزم المتأثرة ({count})", + "no_summary": "لا يوجد ملخص", + "view_details": "عرض تفاصيل الثغرة", + "path": "المسار", + "more": "+{count} أخرى", + "packages_failed": "تعذر فحص {count} حزمة | تعذر فحص الحزمة | تعذر فحص الحزمتين | تعذر فحص {count} حزم | تعذر فحص {count} حزمة | تعذر فحص {count} حزمة", + "no_known": "لا توجد ثغرات معروفة في {count} حزمة | لا توجد ثغرات معروفة في الحزمة | لا توجد ثغرات معروفة في الحزمتين | لا توجد ثغرات معروفة في {count} حزم | لا توجد ثغرات معروفة في {count} حزمة | لا توجد ثغرات معروفة في {count} حزمة", + "scan_failed": "تعذر فحص الثغرات", + "depth": { + "root": "هذه الحزمة", + "direct": "تبعية مباشرة", + "transitive": "تبعية غير مباشرة" + }, + "severity": { + "critical": "حرجة", + "high": "عالية", + "moderate": "متوسطة", + "low": "منخفضة" + } + }, + "access": { + "title": "وصول الفريق", + "refresh": "تحديث وصول الفريق", + "list_label": "قائمة وصول الفريق", + "owner": "مالك", + "rw": "قراءة/كتابة", + "ro": "قراءة فقط", + "revoke_access": "سحب وصول {name}", + "no_access": "لا يوجد وصول فريق مُعدّ", + "select_team_label": "اختر فريقًا", + "loading_teams": "جارٍ تحميل الفرق...", + "select_team": "اختر فريقًا", + "permission_label": "مستوى الصلاحية", + "permission": { + "read_only": "قراءة فقط", + "read_write": "قراءة/كتابة" + }, + "grant_button": "منح", + "cancel_grant": "إلغاء منح الوصول", + "grant_access": "+ منح وصول للفريق" + }, + "list": { + "filter_label": "فلترة الحزم", + "filter_placeholder": "فلتر الحزم...", + "sort_label": "ترتيب الحزم", + "showing_count": "يعرض {filtered} من أصل {total} حزمة" + }, + "skeleton": { + "loading": "جارٍ تحميل تفاصيل الحزمة", + "license": "الترخيص", + "weekly": "أسبوعيًا", + "size": "الحجم", + "deps": "الاعتماديات", + "updated": "آخر تحديث", + "install": "تثبيت", + "readme": "README", + "maintainers": "القائمون على الصيانة", + "keywords": "الكلمات المفتاحية", + "versions": "الإصدارات", + "dependencies": "الاعتماديات" + }, + "sort": { + "downloads": "الأكثر تنزيلًا", + "updated": "مُحدَّثة مؤخرًا", + "name_asc": "الاسم (A-Z)", + "name_desc": "الاسم (Z-A)" + } + }, + "connector": { + "status": { + "connecting": "جارٍ الاتصال...", + "connected_as": "متصل كـ {'@'}{user}", + "connected": "متصل", + "connect_cli": "ربط واجهة سطر الأوامر المحلية", + "aria_connecting": "جارٍ الاتصال بالموصل المحلي", + "aria_connected": "تم الاتصال بالموصل المحلي", + "aria_click_to_connect": "انقر للاتصال بالموصل المحلي", + "avatar_alt": "صورة {user} الرمزية" + }, + "modal": { + "title": "الموصل المحلي", + "close_modal": "إغلاق النافذة", + "connected": "متصل", + "logged_in_as": "تم تسجيل الدخول كـ {'@'}{user}", + "connected_hint": "يمكنك الآن إدارة الحزم والمؤسسات من واجهة الويب.", + "disconnect": "قطع الاتصال", + "run_hint": "شغّل الموصل على جهازك لتمكين ميزات الإدارة.", + "copy_command": "نسخ الأمر", + "copied": "تم النسخ", + "paste_token": "ثم الصق الرمز أدناه للاتصال:", + "token_label": "الرمز", + "token_placeholder": "الصق الرمز هنا...", + "advanced": "خيارات متقدمة", + "port_label": "المنفذ", + "warning": "تحذير!", + "warning_text": "يسمح هذا لـ npmx بالوصول إلى npm CLI لديك. لا تتصل إلا بالمواقع التي تثق بها.", + "connect": "اتصال", + "connecting": "جارٍ الاتصال..." + } + }, + "operations": { + "queue": { + "title": "قائمة العمليات", + "clear_all": "مسح الكل", + "refresh": "تحديث العمليات", + "empty": "لا توجد عمليات في القائمة", + "empty_hint": "أضف عمليات من صفحات الحزمة أو المؤسسة", + "active_label": "العمليات النشطة", + "otp_required": "رمز OTP مطلوب", + "otp_prompt": "أدخل رمز OTP للمتابعة", + "otp_placeholder": "أدخل رمز OTP...", + "otp_label": "كلمة المرور وحيدة الاستخدام (OTP)", + "retry_otp": "إعادة المحاولة باستخدام OTP", + "retrying": "جارٍ إعادة المحاولة...", + "approve_operation": "الموافقة على العملية", + "remove_operation": "إزالة العملية", + "approve_all": "الموافقة على الكل", + "execute": "تنفيذ", + "executing": "جارٍ التنفيذ...", + "log": "السجل", + "log_label": "سجل العمليات المكتملة", + "remove_from_log": "إزالة من السجل" + } + }, + "org": { + "teams": { + "title": "الفرق", + "refresh": "تحديث الفرق", + "filter_label": "فلترة الفرق", + "filter_placeholder": "فلتر الفرق...", + "sort_by": "الترتيب حسب", + "loading": "جارٍ تحميل الفرق...", + "no_teams": "لم يتم العثور على فرق", + "list_label": "فرق المؤسسة", + "delete_team": "حذف الفريق {name}", + "member_count": "{count} أعضاء | عضو واحد | عضوان | {count} أعضاء | {count} عضواً | {count} عضواً", + "members_of": "أعضاء {team}", + "no_members": "لا يوجد أعضاء", + "remove_user": "إزالة {user} من الفريق", + "username_to_add": "اسم المستخدم لإضافته إلى {team}", + "username_placeholder": "اسم المستخدم...", + "add_button": "إضافة", + "cancel_add_user": "إلغاء إضافة المستخدم", + "add_member": "+ إضافة عضو", + "team_name_label": "اسم الفريق", + "team_name_placeholder": "اسم-الفريق...", + "create_button": "إنشاء", + "no_match": "لا توجد فرق تطابق \"{query}\"", + "cancel_create": "إلغاء إنشاء الفريق", + "create_team": "+ إنشاء فريق" + }, + "members": { + "title": "الأعضاء", + "refresh": "تحديث الأعضاء", + "filter_label": "فلترة الأعضاء", + "filter_placeholder": "فلتر الأعضاء...", + "filter_by_role": "فلترة حسب الدور", + "filter_by_team": "فلترة حسب الفريق", + "all_teams": "كل الفرق", + "sort_by": "الترتيب حسب", + "loading": "جارٍ تحميل الأعضاء...", + "no_members": "لم يتم العثور على أعضاء", + "list_label": "أعضاء المؤسسة", + "change_role_for": "تغيير الدور لـ {name}", + "remove_from_org": "إزالة {name} من المؤسسة", + "view_team": "عرض فريق {team}", + "no_match": "لا يوجد أعضاء يطابقون عوامل الفلترة", + "username_label": "اسم المستخدم", + "username_placeholder": "اسم المستخدم...", + "role_label": "الدور", + "role": { + "all": "الكل", + "developer": "مطور", + "admin": "مدير", + "owner": "مالك" + }, + "team_label": "الفريق", + "no_team": "بدون فريق", + "add_button": "إضافة", + "cancel_add": "إلغاء إضافة عضو", + "add_member": "+ إضافة عضو" + }, + "public_packages": "{count} حزم عامة | حزمة عامة واحدة | حزمتان عامتان | {count} حزم عامة | {count} حزمة عامة | {count} حزمة عامة", + "page": { + "packages_title": "الحزم", + "members_tab": "الأعضاء", + "teams_tab": "الفرق", + "no_packages": "لم يتم العثور على حزم عامة لـ", + "no_packages_hint": "قد لا تكون هذه المؤسسة موجودة أو قد لا تحتوي على حزم عامة.", + "failed_to_load": "فشل تحميل حزم المؤسسة", + "no_match": "لا توجد حزم تطابق \"{query}\"", + "not_found": "لم يتم العثور على المؤسسة", + "not_found_message": "المؤسسة \"{'@'}{name}\" غير موجودة على npm", + "filter_placeholder": "فلتر {count} حزمة..." + } + }, + "user": { + "combobox": { + "add_to_org_hint": "(سيُضاف أيضًا إلى المؤسسة)", + "press_enter_to_add": "اضغط Enter لإضافة {'@'}{username}", + "default_placeholder": "اسم المستخدم...", + "suggestions_label": "اقتراحات المستخدمين" + }, + "page": { + "packages_title": "الحزم", + "no_packages": "لم يتم العثور على حزم عامة لـ", + "no_packages_hint": "قد لا يكون هذا المستخدم موجودًا أو قد لا يحتوي على حزم عامة.", + "failed_to_load": "فشل تحميل حزم المستخدم", + "no_match": "لا توجد حزم تطابق \"{query}\"", + "filter_placeholder": "فلتر {count} حزمة..." + }, + "orgs_page": { + "title": "المؤسسات", + "back_to_profile": "العودة إلى الملف الشخصي", + "connect_required": "اربط واجهة سطر الأوامر المحلية لعرض مؤسساتك.", + "connect_hint_prefix": "شغّل", + "connect_hint_suffix": "للبدء.", + "own_orgs_only": "يمكنك عرض مؤسساتك أنت فقط.", + "view_your_orgs": "عرض مؤسساتك", + "loading": "جارٍ تحميل المؤسسات...", + "empty": "لم يتم العثور على مؤسسات.", + "empty_hint": "يتم اكتشاف المؤسسات من حزمك ذات النطاق (scoped).", + "count": "{count} مؤسسة | مؤسسة واحدة | مؤسستان | {count} مؤسسات | {count} مؤسسة | {count} مؤسسة", + "packages_count": "{count} حزمة | حزمة واحدة | حزمتان | {count} حزم | {count} حزمة | {count} حزمة" + } + }, + "claim": { + "modal": { + "title": "حجز اسم حزمة", + "close_modal": "إغلاق النافذة", + "success": "تم حجز الحزمة!", + "success_detail": "تم نشر {name}{'@'}0.0.0 على npm.", + "success_hint": "يمكنك الآن نشر إصدارات جديدة لهذه الحزمة باستخدام npm publish.", + "view_package": "عرض الحزمة", + "invalid_name": "اسم حزمة غير صالح:", + "available": "هذا الاسم متاح!", + "taken": "هذا الاسم مستخدم بالفعل.", + "similar_warning": "توجد حزم مشابهة — قد يرفض npm هذا الاسم:", + "related": "حزم ذات صلة:", + "scope_warning_title": "فكّر في استخدام حزمة بنطاق (scoped) بدلًا من ذلك", + "scope_warning_text": "أسماء الحزم غير ذات النطاق هي مورد مشترك. لا تحجز اسمًا إلا إذا كنت تنوي نشر حزمة وصيانتها. للمشاريع الشخصية أو المؤسسية، استخدم اسمًا ذا نطاق مثل {'@'}{username}/{name}.", + "connect_required": "اربط الموصل المحلي لحجز اسم هذه الحزمة.", + "connect_button": "الاتصال بالموصل", + "publish_hint": "سيؤدي هذا إلى نشر حزمة مصغرة كعنصر نائب (placeholder).", + "preview_json": "معاينة package.json", + "claim_button": "حجز اسم الحزمة", + "publishing": "جارٍ النشر...", + "checking": "جارٍ التحقق من التوفر...", + "failed_to_check": "فشل التحقق من توفر الاسم", + "failed_to_claim": "فشل حجز الحزمة" + } + }, + "code": { + "files_label": "الملفات", + "no_files": "لا توجد ملفات في هذا المجلد", + "select_version": "اختر إصدارًا", + "root": "الجذر", + "lines": "{count} سطر", + "toggle_tree": "تبديل شجرة الملفات", + "close_tree": "إغلاق شجرة الملفات", + "copy_link": "نسخ الرابط", + "raw": "خام (Raw)", + "view_raw": "عرض الملف الخام (Raw)", + "file_too_large": "الملف كبير جدًا للمعاينة", + "file_size_warning": "{size} يتجاوز حد 500KB للتظليل النحوي (syntax highlighting)", + "load_anyway": "تحميل على أي حال", + "failed_to_load": "فشل تحميل الملف", + "unavailable_hint": "قد يكون الملف كبيرًا جدًا أو غير متاح", + "version_required": "الإصدار مطلوب لتصفح الكود", + "go_to_package": "الانتقال إلى الحزمة", + "loading_tree": "جارٍ تحميل شجرة الملفات...", + "failed_to_load_tree": "فشل تحميل الملفات لهذا الإصدار من الحزمة", + "back_to_package": "العودة إلى الحزمة", + "table": { + "name": "الاسم", + "size": "الحجم" + } + }, + "badges": { + "provenance": { + "verified": "موثّق", + "verified_title": "مصدر موثّق", + "verified_via": "موثّق: تم النشر عبر {provider}" + }, + "jsr": { + "title": "متوفر أيضًا على JSR", + "label": "jsr" + } + }, + "about": { + "title": "حول", + "heading": "حول", + "meta_description": "npmx هو متصفح سريع وحديث لسجل npm. تجربة مستخدم أفضل لاستكشاف حزم npm.", + "back_home": "العودة إلى الصفحة الرئيسية", + "what_we_are": { + "title": "ما هو npmx", + "better_ux_dx": "تجربة مستخدم/مطور أفضل", + "admin_ui": "واجهة إدارة", + "description": "npmx هو {betterUxDx} لسجل حزم npm وأدواته. نحن نوفر واجهة سريعة وحديثة لاستكشاف الحزم، مع ميزات مثل الوضع الداكن، التنقل عبر لوحة المفاتيح، تصفح الكود، والاتصالات بسجلات بديلة مثل {jsr}.", + "admin_description": "نهدف أيضًا إلى توفير {adminUi} أفضل لإدارة حزمك، فرقك، ومنظماتك — كل ذلك من المتصفح، مدعومًا بواسطة npm CLI المحلي الخاص بك." + }, + "what_we_are_not": { + "title": "ما ليس هو npmx", + "not_package_manager": "ليس مدير حزم.", + "not_registry": "ليس سجلًا.", + "registry_description": "نحن لا نستضيف الحزم. نحن مجرد طريقة أفضل لتصفحها.", + "package_managers_exist": "{already} {people} {building} {managers} {package} {cool} {really}.", + "words": { + "already": "هناك بالفعل", + "people": "أشخاص", + "building": "يبنون", + "really": "جدا", + "cool": "رائعة", + "package": "حزم", + "managers": "مديري" + } + }, + "contributors": { + "title": "المساهمون", + "description": "npmx هو مشروع مفتوح المصدر بالكامل، تم بناؤه بواسطة مجتمع مذهل من المساهمين.", + "loading": "جارٍ تحميل المساهمين...", + "error": "فشل تحميل المساهمين", + "view_profile": "عرض بروفايل {name} على GitHub" + }, + "get_involved": { + "title": "كن جزءًا من npmx", + "contribute": { + "title": "المساهمة", + "description": "ساعدنا في بناء تجربة npm أفضل.", + "cta": "عرض على GitHub" + }, + "community": { + "title": "انضم إلى المجتمع", + "description": "تحدث، اطرح الأسئلة، وشارك الأفكار.", + "cta": "انضم إلى Discord" + }, + "follow": { + "title": "ابقَ على اطلاع", + "description": "اكتشف آخر الأخبار عن npmx.", + "cta": "تابع على Bluesky" + } + } + }, + "header": { + "home": "الصفحة الرئيسية لـ npmx", + "github": "GitHub", + "packages": "الحزم", + "packages_dropdown": { + "title": "حزمك", + "loading": "جارٍ التحميل...", + "error": "فشل تحميل الحزم", + "empty": "لا توجد حزم", + "view_all": "عرض الكل" + }, + "orgs": "المؤسسات", + "orgs_dropdown": { + "title": "مؤسساتك", + "loading": "جارٍ التحميل...", + "error": "فشل تحميل المؤسسات", + "empty": "لا توجد مؤسسات", + "view_all": "عرض الكل" + } + } +} diff --git a/lunaria/files/en-US.json b/lunaria/files/en-US.json index 363baa7d..b2e71c0c 100644 --- a/lunaria/files/en-US.json +++ b/lunaria/files/en-US.json @@ -21,7 +21,7 @@ "button": "search", "clear": "Clear search", "searching": "Searching...", - "found_packages": "Found {count} packages", + "found_packages": "Found 1 package | Found {count} packages", "updating": "(updating...)", "no_results": "No packages found for \"{query}\"", "results": "Search results", From 6a7b190a20f07784e7753fec378ad18918527a6e Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 23:05:40 +0100 Subject: [PATCH 05/10] fix: config type error --- config/i18n.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/i18n.ts b/config/i18n.ts index 098162a2..23b17ae1 100644 --- a/config/i18n.ts +++ b/config/i18n.ts @@ -85,7 +85,7 @@ const locales: (Omit & { code: string })[] = [ name: 'English', }, { - code: 'ar', + code: 'ar-EG', file: 'ar.json', name: 'العربية', dir: 'rtl', From 8b3b270db56fd80cec05f3c91af3d1b10c9f2d4d Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 23:43:46 +0100 Subject: [PATCH 06/10] feat: update arabic translations --- i18n/locales/ar.json | 166 ++++++++++++++++++++++++-- lunaria/files/{ar-EG.json => ar.json} | 166 ++++++++++++++++++++++++-- 2 files changed, 306 insertions(+), 26 deletions(-) rename lunaria/files/{ar-EG.json => ar.json} (79%) diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json index 49136412..ef1feec9 100644 --- a/i18n/locales/ar.json +++ b/i18n/locales/ar.json @@ -24,6 +24,7 @@ "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", "updating": "(جارٍ التحديث...)", "no_results": "لم يتم العثور على حزم لـ \"{query}\"", + "results": "نتائج البحث", "not_taken": "الاسم {name} غير مأخوذ", "claim_prompt": "احجز اسم هذه الحزمة على npm", "claim_button": "احجز \"{name}\"", @@ -38,21 +39,44 @@ } }, "nav": { + "main_navigation": "الصفحة الرئيسية", "popular_packages": "الحزم الشائعة", "search": "بحث", "settings": "الإعدادات", "back": "عودة" }, "settings": { + "title": "الإعدادات", + "tagline": "تخصيص تجربتك على npmx", + "meta_description": "قم بتخصيص تجربتك على npmx من خلال إعدادات مثل السمة، اللغة، وتفضيلات العرض.", + "sections": { + "appearance": "المظهر", + "display": "العرض", + "language": "اللغة" + }, "relative_dates": "تواريخ نسبية", + "relative_dates_description": "عرض التواريخ مثل \"منذ 3 أيام\" بدلًا من التاريخ كاملا.", "include_types": "تضمين {'@'}types في التثبيت", + "include_types_description": "إضافة حزمة {'@'}types إلى أوامر التثبيت للحزم غير المرفقة بأنواع TypeScript.", + "hide_platform_packages": "إخفاء الحزم الخاصة بالمنصة في البحث", + "hide_platform_packages_description": "إخفاء الحزم الـ binary native مثل {'@'}esbuild/linux-x64 من النتائج", "theme": "السمة", "theme_light": "فاتحة", "theme_dark": "داكنة", "theme_system": "سمة النظام", "language": "اللغة", "help_translate": "ساهم في ترجمة npmx", - "accent_colors": "ألوان الموقع" + "accent_colors": "ألوان الموقع", + "clear_accent": "مسح لون التمييز", + "translation_progress": "تقدم الترجمة" + }, + "i18n": { + "missing_keys": "{count} ترجمات مفقودة | ترجمة واحدة مفقودة | ترجمتان مفقودتان | {count} ترجمات مفقودة | {count} ترجمة مفقودة | {count} ترجمة مفقودة", + "copy_keys": "نسخ المفاتيح", + "show_more_keys": "عرض المزيد ({count})...", + "contribute_hint": "ساعد في تحسين هذه الترجمة عن طريق إضافة المفاتيح المفقودة.", + "edit_on_github": "تعديل على GitHub", + "view_guide": "دليل الترجمة" }, "common": { "loading": "جارٍ التحميل...", @@ -64,6 +88,8 @@ "retry": "إعادة المحاولة", "copy": "نسخ", "copied": "تم النسخ!", + "skip_link": "تخطي إلى المحتوى الرئيسي", + "close_modal": "إغلاق النافذة", "show_more": "عرض المزيد", "warnings": "تحذيرات:", "go_back_home": "العودة إلى الصفحة الرئيسية", @@ -84,6 +110,7 @@ "not_latest": "(ليست الأحدث)", "verified_provenance": "مصدر موثّق", "view_permalink": "عرض الرابط الدائم لهذا الإصدار", + "navigation": "تصفح الحزمة", "deprecation": { "package": "تم إهمال هذه الحزمة.", "version": "تم إهمال هذا الإصدار.", @@ -91,11 +118,10 @@ }, "stats": { "license": "الترخيص", - "weekly": "أسبوعيًا", "deps": "الاعتماديات", "install_size": "حجم التثبيت", + "vulns": "الثغرات", "updated": "آخر تحديث", - "view_download_trends": "عرض اتجاهات التنزيل", "view_dependency_graph": "عرض مخطط الاعتماديات", "inspect_dependency_tree": "فحص شجرة الاعتماديات" }, @@ -103,12 +129,15 @@ "repo": "المستودع", "homepage": "الصفحة الرئيسية", "issues": "المشكلات", - "forks": "تفرعات | تفرع | تفرعات | تفرعات | تفرع | تفرع", "jsr": "jsr", "code": "الكود", "docs": "التوثيق", "fund": "التمويل" }, + "docs": { + "not_available": "التوثيق غير متوفر", + "not_available_detail": "لم نتمكن من إنشاء التوثيق لهذا الإصدار." + }, "get_started": { "title": "البدء", "pm_label": "مدير الحزم", @@ -154,7 +183,8 @@ "title": "الاعتماديات ({count})", "list_label": "اعتماديات الحزمة", "show_all": "عرض كل الاعتماديات ({count})", - "optional": "اختياري" + "optional": "اختياري", + "view_vulnerabilities": "عرض الثغرات" }, "peer_dependencies": { "title": "اعتماديات النظير ({count})", @@ -167,8 +197,8 @@ "show_all": "عرض كل الاعتماديات الاختيارية ({count})" }, "maintainers": { - "title": "القائمون على الصيانة", - "list_label": "قائمو صيانة الحزمة", + "title": "المشرفون", + "list_label": "مشرفو الحزمة", "you": "(أنت)", "via": "عبر {teams}", "remove_owner": "إزالة {name} كمالك", @@ -176,7 +206,9 @@ "username_placeholder": "اسم المستخدم...", "add_button": "إضافة", "cancel_add": "إلغاء إضافة المالك", - "add_owner": "+ إضافة مالك" + "add_owner": "+ إضافة مالك", + "show_more": "(عرض المزيد ({count}))", + "show_less": "(عرض أقل)" }, "downloads": { "title": "التنزيلات الأسبوعية", @@ -192,7 +224,9 @@ "end_date": "النهاية", "no_data": "لا تتوفر بيانات تنزيل", "loading": "جارٍ التحميل...", - "y_axis_label": "تنزيلات {granularity}ة" + "y_axis_label": "تنزيلات {granularity}ة", + "download_file": "تنزيل {fileType}", + "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية" }, "install_scripts": { "title": "سكربتات التثبيت", @@ -278,7 +312,7 @@ "updated": "آخر تحديث", "install": "تثبيت", "readme": "README", - "maintainers": "القائمون على الصيانة", + "maintainers": "المشرفون", "keywords": "الكلمات المفتاحية", "versions": "الإصدارات", "dependencies": "الاعتماديات" @@ -367,7 +401,7 @@ "cancel_add_user": "إلغاء إضافة المستخدم", "add_member": "+ إضافة عضو", "team_name_label": "اسم الفريق", - "team_name_placeholder": "اسم-الفريق...", + "team_name_placeholder": "اسم الفريق...", "create_button": "إنشاء", "no_match": "لا توجد فرق تطابق \"{query}\"", "cancel_create": "إلغاء إنشاء الفريق", @@ -480,7 +514,7 @@ "select_version": "اختر إصدارًا", "root": "الجذر", "lines": "{count} سطر", - "toggle_tree": "تبديل شجرة الملفات", + "toggle_tree": "إظهار/إخفاء شجرة الملفات", "close_tree": "إغلاق شجرة الملفات", "copy_link": "نسخ الرابط", "raw": "خام (Raw)", @@ -511,6 +545,112 @@ "label": "jsr" } }, + "filters": { + "title": "فلاتر", + "search": "بحث", + "search_scope": "نطاق البحث", + "search_placeholder_name": "فلترة حسب اسم الحزمة...", + "search_placeholder_description": "فلترة حسب الوصف...", + "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية...", + "search_placeholder_all": "فلترة حسب الكل أو استخدم name: desc: kw:", + "scope_name": "الإسم", + "scope_name_description": "بحث في أسماء الحزم فقط", + "scope_description": "الوصف", + "scope_description_description": "بحث في الأوصاف فقط", + "scope_keywords": "الكلمات المفتاحية", + "scope_keywords_description": "بحث في الكلمات المفتاحية فقط", + "scope_all": "الكل", + "scope_all_description": "بحث في جميع الحقول، يدعم المحددات name: desc: kw:", + "weekly_downloads": "التنزيلات الأسبوعية", + "updated_within": "تم التحديث خلال", + "security": "الأمان", + "keywords": "الكلمات المفتاحية", + "more_keywords": "+{count} المزيد", + "clear_all": "مسح الكل", + "remove_filter": "إزالة فلتر {label}", + "download_range": { + "any": "أي", + "lt100": "< 100", + "100_1k": "100 - 1K", + "1k_10k": "1K - 10K", + "10k_100k": "10K - 100K", + "gt100k": "> 100K" + }, + "updated": { + "any": "أي وقت", + "week": "الأسبوع الماضي", + "month": "الشهر الماضي", + "quarter": "آخر 3 أشهر", + "year": "السنة الماضية" + }, + "security_options": { + "all": "جميع الحزم", + "secure": "بدون تحذيرات", + "insecure": "مع التحذيرات" + }, + "sort": { + "label": "فرز الحزم", + "toggle_direction": "قلب اتجاه الفرز", + "ascending": "تصاعدي", + "descending": "تنازلي", + "relevance": "الصلة", + "downloads_week": "التنزيلات/الأسبوع", + "downloads_day": "التنزيلات/اليوم", + "downloads_month": "التنزيلات/الشهر", + "downloads_year": "التنزيلات/السنة", + "updated": "آخر تحديث", + "name": "الاسم", + "quality": "الجودة", + "popularity": "الشعبية", + "maintenance": "الصيانة", + "score": "التنقيط" + }, + "columns": { + "title": "الأعمدة", + "show": "عرض الأعمدة", + "reset": "إعادة التعيين إلى الافتراضيات", + "coming_soon": "قريبًا", + "name": "الاسم", + "version": "الإصدار", + "description": "الوصف", + "downloads": "التنزيلات/الأسبوع", + "updated": "آخر تحديث", + "maintainers": "المشرفون", + "keywords": "الكلمات المفتاحية", + "quality_score": "درجة الجودة", + "popularity_score": "درجة الشعبية", + "maintenance_score": "درجة الصيانة", + "combined_score": "الدرجة المجمعة", + "security": "الأمان" + }, + "view_mode": { + "label": "وضع العرض", + "cards": "عرض البطاقات", + "table": "عرض الجدول" + }, + "pagination": { + "mode_label": "وضع التصفح", + "infinite": "غير منتهي", + "paginated": "مقسم إلى صفحات", + "items_per_page": "عدد العناصر في الصفحة", + "per_page": "{count} / صفحة", + "all_yolo": "الكل (إنما هي حياة واحدة)", + "showing": "{start}-{end} من {total}", + "previous": "الصفحة السابقة", + "next": "الصفحة التالية", + "nav_label": "التصفح" + }, + "count": { + "showing_filtered": "{filtered} من {total} حزمة", + "showing_all": "{total} حزمة | حزمة واحدة | حزمتان | {total} حزم | {total} حزمة | {total} حزمة", + "showing_paginated": "{pageSize} من {total} حزمة" + }, + "table": { + "security_warning": "تحذير أمني", + "secure": "آمن", + "no_packages": "لم يتم العثور على حزم" + } + }, "about": { "title": "حول", "heading": "حول", @@ -533,7 +673,7 @@ "already": "هناك بالفعل", "people": "أشخاص", "building": "يبنون", - "really": "جدا", + "really": "بحقّ", "cool": "رائعة", "package": "حزم", "managers": "مديري" diff --git a/lunaria/files/ar-EG.json b/lunaria/files/ar.json similarity index 79% rename from lunaria/files/ar-EG.json rename to lunaria/files/ar.json index 49136412..ef1feec9 100644 --- a/lunaria/files/ar-EG.json +++ b/lunaria/files/ar.json @@ -24,6 +24,7 @@ "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", "updating": "(جارٍ التحديث...)", "no_results": "لم يتم العثور على حزم لـ \"{query}\"", + "results": "نتائج البحث", "not_taken": "الاسم {name} غير مأخوذ", "claim_prompt": "احجز اسم هذه الحزمة على npm", "claim_button": "احجز \"{name}\"", @@ -38,21 +39,44 @@ } }, "nav": { + "main_navigation": "الصفحة الرئيسية", "popular_packages": "الحزم الشائعة", "search": "بحث", "settings": "الإعدادات", "back": "عودة" }, "settings": { + "title": "الإعدادات", + "tagline": "تخصيص تجربتك على npmx", + "meta_description": "قم بتخصيص تجربتك على npmx من خلال إعدادات مثل السمة، اللغة، وتفضيلات العرض.", + "sections": { + "appearance": "المظهر", + "display": "العرض", + "language": "اللغة" + }, "relative_dates": "تواريخ نسبية", + "relative_dates_description": "عرض التواريخ مثل \"منذ 3 أيام\" بدلًا من التاريخ كاملا.", "include_types": "تضمين {'@'}types في التثبيت", + "include_types_description": "إضافة حزمة {'@'}types إلى أوامر التثبيت للحزم غير المرفقة بأنواع TypeScript.", + "hide_platform_packages": "إخفاء الحزم الخاصة بالمنصة في البحث", + "hide_platform_packages_description": "إخفاء الحزم الـ binary native مثل {'@'}esbuild/linux-x64 من النتائج", "theme": "السمة", "theme_light": "فاتحة", "theme_dark": "داكنة", "theme_system": "سمة النظام", "language": "اللغة", "help_translate": "ساهم في ترجمة npmx", - "accent_colors": "ألوان الموقع" + "accent_colors": "ألوان الموقع", + "clear_accent": "مسح لون التمييز", + "translation_progress": "تقدم الترجمة" + }, + "i18n": { + "missing_keys": "{count} ترجمات مفقودة | ترجمة واحدة مفقودة | ترجمتان مفقودتان | {count} ترجمات مفقودة | {count} ترجمة مفقودة | {count} ترجمة مفقودة", + "copy_keys": "نسخ المفاتيح", + "show_more_keys": "عرض المزيد ({count})...", + "contribute_hint": "ساعد في تحسين هذه الترجمة عن طريق إضافة المفاتيح المفقودة.", + "edit_on_github": "تعديل على GitHub", + "view_guide": "دليل الترجمة" }, "common": { "loading": "جارٍ التحميل...", @@ -64,6 +88,8 @@ "retry": "إعادة المحاولة", "copy": "نسخ", "copied": "تم النسخ!", + "skip_link": "تخطي إلى المحتوى الرئيسي", + "close_modal": "إغلاق النافذة", "show_more": "عرض المزيد", "warnings": "تحذيرات:", "go_back_home": "العودة إلى الصفحة الرئيسية", @@ -84,6 +110,7 @@ "not_latest": "(ليست الأحدث)", "verified_provenance": "مصدر موثّق", "view_permalink": "عرض الرابط الدائم لهذا الإصدار", + "navigation": "تصفح الحزمة", "deprecation": { "package": "تم إهمال هذه الحزمة.", "version": "تم إهمال هذا الإصدار.", @@ -91,11 +118,10 @@ }, "stats": { "license": "الترخيص", - "weekly": "أسبوعيًا", "deps": "الاعتماديات", "install_size": "حجم التثبيت", + "vulns": "الثغرات", "updated": "آخر تحديث", - "view_download_trends": "عرض اتجاهات التنزيل", "view_dependency_graph": "عرض مخطط الاعتماديات", "inspect_dependency_tree": "فحص شجرة الاعتماديات" }, @@ -103,12 +129,15 @@ "repo": "المستودع", "homepage": "الصفحة الرئيسية", "issues": "المشكلات", - "forks": "تفرعات | تفرع | تفرعات | تفرعات | تفرع | تفرع", "jsr": "jsr", "code": "الكود", "docs": "التوثيق", "fund": "التمويل" }, + "docs": { + "not_available": "التوثيق غير متوفر", + "not_available_detail": "لم نتمكن من إنشاء التوثيق لهذا الإصدار." + }, "get_started": { "title": "البدء", "pm_label": "مدير الحزم", @@ -154,7 +183,8 @@ "title": "الاعتماديات ({count})", "list_label": "اعتماديات الحزمة", "show_all": "عرض كل الاعتماديات ({count})", - "optional": "اختياري" + "optional": "اختياري", + "view_vulnerabilities": "عرض الثغرات" }, "peer_dependencies": { "title": "اعتماديات النظير ({count})", @@ -167,8 +197,8 @@ "show_all": "عرض كل الاعتماديات الاختيارية ({count})" }, "maintainers": { - "title": "القائمون على الصيانة", - "list_label": "قائمو صيانة الحزمة", + "title": "المشرفون", + "list_label": "مشرفو الحزمة", "you": "(أنت)", "via": "عبر {teams}", "remove_owner": "إزالة {name} كمالك", @@ -176,7 +206,9 @@ "username_placeholder": "اسم المستخدم...", "add_button": "إضافة", "cancel_add": "إلغاء إضافة المالك", - "add_owner": "+ إضافة مالك" + "add_owner": "+ إضافة مالك", + "show_more": "(عرض المزيد ({count}))", + "show_less": "(عرض أقل)" }, "downloads": { "title": "التنزيلات الأسبوعية", @@ -192,7 +224,9 @@ "end_date": "النهاية", "no_data": "لا تتوفر بيانات تنزيل", "loading": "جارٍ التحميل...", - "y_axis_label": "تنزيلات {granularity}ة" + "y_axis_label": "تنزيلات {granularity}ة", + "download_file": "تنزيل {fileType}", + "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية" }, "install_scripts": { "title": "سكربتات التثبيت", @@ -278,7 +312,7 @@ "updated": "آخر تحديث", "install": "تثبيت", "readme": "README", - "maintainers": "القائمون على الصيانة", + "maintainers": "المشرفون", "keywords": "الكلمات المفتاحية", "versions": "الإصدارات", "dependencies": "الاعتماديات" @@ -367,7 +401,7 @@ "cancel_add_user": "إلغاء إضافة المستخدم", "add_member": "+ إضافة عضو", "team_name_label": "اسم الفريق", - "team_name_placeholder": "اسم-الفريق...", + "team_name_placeholder": "اسم الفريق...", "create_button": "إنشاء", "no_match": "لا توجد فرق تطابق \"{query}\"", "cancel_create": "إلغاء إنشاء الفريق", @@ -480,7 +514,7 @@ "select_version": "اختر إصدارًا", "root": "الجذر", "lines": "{count} سطر", - "toggle_tree": "تبديل شجرة الملفات", + "toggle_tree": "إظهار/إخفاء شجرة الملفات", "close_tree": "إغلاق شجرة الملفات", "copy_link": "نسخ الرابط", "raw": "خام (Raw)", @@ -511,6 +545,112 @@ "label": "jsr" } }, + "filters": { + "title": "فلاتر", + "search": "بحث", + "search_scope": "نطاق البحث", + "search_placeholder_name": "فلترة حسب اسم الحزمة...", + "search_placeholder_description": "فلترة حسب الوصف...", + "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية...", + "search_placeholder_all": "فلترة حسب الكل أو استخدم name: desc: kw:", + "scope_name": "الإسم", + "scope_name_description": "بحث في أسماء الحزم فقط", + "scope_description": "الوصف", + "scope_description_description": "بحث في الأوصاف فقط", + "scope_keywords": "الكلمات المفتاحية", + "scope_keywords_description": "بحث في الكلمات المفتاحية فقط", + "scope_all": "الكل", + "scope_all_description": "بحث في جميع الحقول، يدعم المحددات name: desc: kw:", + "weekly_downloads": "التنزيلات الأسبوعية", + "updated_within": "تم التحديث خلال", + "security": "الأمان", + "keywords": "الكلمات المفتاحية", + "more_keywords": "+{count} المزيد", + "clear_all": "مسح الكل", + "remove_filter": "إزالة فلتر {label}", + "download_range": { + "any": "أي", + "lt100": "< 100", + "100_1k": "100 - 1K", + "1k_10k": "1K - 10K", + "10k_100k": "10K - 100K", + "gt100k": "> 100K" + }, + "updated": { + "any": "أي وقت", + "week": "الأسبوع الماضي", + "month": "الشهر الماضي", + "quarter": "آخر 3 أشهر", + "year": "السنة الماضية" + }, + "security_options": { + "all": "جميع الحزم", + "secure": "بدون تحذيرات", + "insecure": "مع التحذيرات" + }, + "sort": { + "label": "فرز الحزم", + "toggle_direction": "قلب اتجاه الفرز", + "ascending": "تصاعدي", + "descending": "تنازلي", + "relevance": "الصلة", + "downloads_week": "التنزيلات/الأسبوع", + "downloads_day": "التنزيلات/اليوم", + "downloads_month": "التنزيلات/الشهر", + "downloads_year": "التنزيلات/السنة", + "updated": "آخر تحديث", + "name": "الاسم", + "quality": "الجودة", + "popularity": "الشعبية", + "maintenance": "الصيانة", + "score": "التنقيط" + }, + "columns": { + "title": "الأعمدة", + "show": "عرض الأعمدة", + "reset": "إعادة التعيين إلى الافتراضيات", + "coming_soon": "قريبًا", + "name": "الاسم", + "version": "الإصدار", + "description": "الوصف", + "downloads": "التنزيلات/الأسبوع", + "updated": "آخر تحديث", + "maintainers": "المشرفون", + "keywords": "الكلمات المفتاحية", + "quality_score": "درجة الجودة", + "popularity_score": "درجة الشعبية", + "maintenance_score": "درجة الصيانة", + "combined_score": "الدرجة المجمعة", + "security": "الأمان" + }, + "view_mode": { + "label": "وضع العرض", + "cards": "عرض البطاقات", + "table": "عرض الجدول" + }, + "pagination": { + "mode_label": "وضع التصفح", + "infinite": "غير منتهي", + "paginated": "مقسم إلى صفحات", + "items_per_page": "عدد العناصر في الصفحة", + "per_page": "{count} / صفحة", + "all_yolo": "الكل (إنما هي حياة واحدة)", + "showing": "{start}-{end} من {total}", + "previous": "الصفحة السابقة", + "next": "الصفحة التالية", + "nav_label": "التصفح" + }, + "count": { + "showing_filtered": "{filtered} من {total} حزمة", + "showing_all": "{total} حزمة | حزمة واحدة | حزمتان | {total} حزم | {total} حزمة | {total} حزمة", + "showing_paginated": "{pageSize} من {total} حزمة" + }, + "table": { + "security_warning": "تحذير أمني", + "secure": "آمن", + "no_packages": "لم يتم العثور على حزم" + } + }, "about": { "title": "حول", "heading": "حول", @@ -533,7 +673,7 @@ "already": "هناك بالفعل", "people": "أشخاص", "building": "يبنون", - "really": "جدا", + "really": "بحقّ", "cool": "رائعة", "package": "حزم", "managers": "مديري" From e57605225656c0789f19bceba01ed15ed69ac53c Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Thu, 29 Jan 2026 23:52:13 +0100 Subject: [PATCH 07/10] fix: add 0 pluralization to found_packages --- i18n/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/locales/en.json b/i18n/locales/en.json index b2e71c0c..6b8e359a 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -21,7 +21,7 @@ "button": "search", "clear": "Clear search", "searching": "Searching...", - "found_packages": "Found 1 package | Found {count} packages", + "found_packages": "No packages found | Found 1 package | Found {count} packages", "updating": "(updating...)", "no_results": "No packages found for \"{query}\"", "results": "Search results", From 4679470c0e39f1324fa696ef9490d15204d88aba Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 22:58:45 +0000 Subject: [PATCH 08/10] [autofix.ci] apply automated fixes --- lunaria/files/en-US.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lunaria/files/en-US.json b/lunaria/files/en-US.json index b2e71c0c..6b8e359a 100644 --- a/lunaria/files/en-US.json +++ b/lunaria/files/en-US.json @@ -21,7 +21,7 @@ "button": "search", "clear": "Clear search", "searching": "Searching...", - "found_packages": "Found 1 package | Found {count} packages", + "found_packages": "No packages found | Found 1 package | Found {count} packages", "updating": "(updating...)", "no_results": "No packages found for \"{query}\"", "results": "Search results", From 94e0610512ad49e0b7d89ef6b4697f034a25f331 Mon Sep 17 00:00:00 2001 From: Houssam Elbadissi Date: Fri, 30 Jan 2026 00:33:46 +0100 Subject: [PATCH 09/10] fix: add back @intlify/core-base --- package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/package.json b/package.json index 9e67700e..a3705739 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@deno/doc": "jsr:^0.189.1", "@iconify-json/simple-icons": "^1.2.67", "@iconify-json/vscode-icons": "^1.2.40", + "@intlify/core-base": "^11.2.8", "@intlify/shared": "^11.2.8", "@lunariajs/core": "https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@f07e1a3", "@nuxt/a11y": "1.0.0-alpha.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9dbf4332..c89f68db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@iconify-json/vscode-icons': specifier: ^1.2.40 version: 1.2.40 + '@intlify/core-base': + specifier: ^11.2.8 + version: 11.2.8 '@intlify/shared': specifier: ^11.2.8 version: 11.2.8 From 972acb00189591335106ad4a4b84345d03819910 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 29 Jan 2026 23:44:52 +0000 Subject: [PATCH 10/10] chore: add i18n config to knip entrypoint --- knip.json | 1 + 1 file changed, 1 insertion(+) diff --git a/knip.json b/knip.json index 1e2d48d7..f9a71bd3 100644 --- a/knip.json +++ b/knip.json @@ -19,6 +19,7 @@ "app/utils/**/*.ts!", "app/plugins/**/*.ts!", "app/components/**/*.vue!", + "config/**/*.ts!", "server/utils/**/*.ts!", "shared/**/*.ts!" ],