diff --git a/app/components/PackageVersions.vue b/app/components/PackageVersions.vue
index 8200a0b4..f2e087c1 100644
--- a/app/components/PackageVersions.vue
+++ b/app/components/PackageVersions.vue
@@ -508,7 +508,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 9490fc26..17ae8fc0 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')
}}
diff --git a/config/i18n.ts b/config/i18n.ts
index 9da86517..23b17ae1 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-EG',
+ 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..ef1feec9
--- /dev/null
+++ b/i18n/locales/ar.json
@@ -0,0 +1,728 @@
+{
+ "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}\"",
+ "results": "نتائج البحث",
+ "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": {
+ "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": "ألوان الموقع",
+ "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": "جارٍ التحميل...",
+ "loading_more": "جارٍ تحميل المزيد...",
+ "loading_packages": "جارٍ تحميل الحزم...",
+ "end_of_results": "نهاية النتائج",
+ "try_again": "حاول مرة أخرى",
+ "close": "إغلاق",
+ "retry": "إعادة المحاولة",
+ "copy": "نسخ",
+ "copied": "تم النسخ!",
+ "skip_link": "تخطي إلى المحتوى الرئيسي",
+ "close_modal": "إغلاق النافذة",
+ "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": "عرض الرابط الدائم لهذا الإصدار",
+ "navigation": "تصفح الحزمة",
+ "deprecation": {
+ "package": "تم إهمال هذه الحزمة.",
+ "version": "تم إهمال هذا الإصدار.",
+ "no_reason": "لم يتم تقديم سبب"
+ },
+ "stats": {
+ "license": "الترخيص",
+ "deps": "الاعتماديات",
+ "install_size": "حجم التثبيت",
+ "vulns": "الثغرات",
+ "updated": "آخر تحديث",
+ "view_dependency_graph": "عرض مخطط الاعتماديات",
+ "inspect_dependency_tree": "فحص شجرة الاعتماديات"
+ },
+ "links": {
+ "repo": "المستودع",
+ "homepage": "الصفحة الرئيسية",
+ "issues": "المشكلات",
+ "jsr": "jsr",
+ "code": "الكود",
+ "docs": "التوثيق",
+ "fund": "التمويل"
+ },
+ "docs": {
+ "not_available": "التوثيق غير متوفر",
+ "not_available_detail": "لم نتمكن من إنشاء التوثيق لهذا الإصدار."
+ },
+ "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": "اختياري",
+ "view_vulnerabilities": "عرض الثغرات"
+ },
+ "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": "+ إضافة مالك",
+ "show_more": "(عرض المزيد ({count}))",
+ "show_less": "(عرض أقل)"
+ },
+ "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}ة",
+ "download_file": "تنزيل {fileType}",
+ "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية"
+ },
+ "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"
+ }
+ },
+ "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": "حول",
+ "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/i18n/locales/en.json b/i18n/locales/en.json
index da3b00ec..d1d3b954 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": "No packages found | Found 1 package | Found {count} packages",
"updating": "(updating...)",
"no_results": "No packages found for \"{query}\"",
"results": "Search results",
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!"
],
diff --git a/lunaria/files/ar.json b/lunaria/files/ar.json
new file mode 100644
index 00000000..ef1feec9
--- /dev/null
+++ b/lunaria/files/ar.json
@@ -0,0 +1,728 @@
+{
+ "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}\"",
+ "results": "نتائج البحث",
+ "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": {
+ "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": "ألوان الموقع",
+ "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": "جارٍ التحميل...",
+ "loading_more": "جارٍ تحميل المزيد...",
+ "loading_packages": "جارٍ تحميل الحزم...",
+ "end_of_results": "نهاية النتائج",
+ "try_again": "حاول مرة أخرى",
+ "close": "إغلاق",
+ "retry": "إعادة المحاولة",
+ "copy": "نسخ",
+ "copied": "تم النسخ!",
+ "skip_link": "تخطي إلى المحتوى الرئيسي",
+ "close_modal": "إغلاق النافذة",
+ "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": "عرض الرابط الدائم لهذا الإصدار",
+ "navigation": "تصفح الحزمة",
+ "deprecation": {
+ "package": "تم إهمال هذه الحزمة.",
+ "version": "تم إهمال هذا الإصدار.",
+ "no_reason": "لم يتم تقديم سبب"
+ },
+ "stats": {
+ "license": "الترخيص",
+ "deps": "الاعتماديات",
+ "install_size": "حجم التثبيت",
+ "vulns": "الثغرات",
+ "updated": "آخر تحديث",
+ "view_dependency_graph": "عرض مخطط الاعتماديات",
+ "inspect_dependency_tree": "فحص شجرة الاعتماديات"
+ },
+ "links": {
+ "repo": "المستودع",
+ "homepage": "الصفحة الرئيسية",
+ "issues": "المشكلات",
+ "jsr": "jsr",
+ "code": "الكود",
+ "docs": "التوثيق",
+ "fund": "التمويل"
+ },
+ "docs": {
+ "not_available": "التوثيق غير متوفر",
+ "not_available_detail": "لم نتمكن من إنشاء التوثيق لهذا الإصدار."
+ },
+ "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": "اختياري",
+ "view_vulnerabilities": "عرض الثغرات"
+ },
+ "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": "+ إضافة مالك",
+ "show_more": "(عرض المزيد ({count}))",
+ "show_less": "(عرض أقل)"
+ },
+ "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}ة",
+ "download_file": "تنزيل {fileType}",
+ "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية"
+ },
+ "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"
+ }
+ },
+ "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": "حول",
+ "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 da3b00ec..d1d3b954 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": "No packages found | Found 1 package | Found {count} packages",
"updating": "(updating...)",
"no_results": "No packages found for \"{query}\"",
"results": "Search results",
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