[READ-ONLY] a fast, modern browser for the npm registry

fix(i18n): various rtl and arabic fixes (#760)

authored by

Houssam Elbadissi and committed by
GitHub
52cd1da6 05538218

+155 -114
+3 -1
app/components/Compare/FacetCard.vue
··· 131 131 :datetime="value.display" 132 132 date-style="medium" 133 133 /> 134 - <template v-else>{{ value.display }}</template> 134 + <template v-else> 135 + <span dir="auto">{{ value.display }}</span> 136 + </template> 135 137 </span> 136 138 </template> 137 139 </span>
+6 -2
app/components/Compare/FacetRow.vue
··· 135 135 > 136 136 <!-- Date values use DateTime component for i18n and user settings --> 137 137 <DateTime v-if="value.type === 'date'" :datetime="value.display" date-style="medium" /> 138 - <template v-else>{{ value.display }}</template> 138 + <template v-else> 139 + <span dir="auto">{{ value.display }}</span> 140 + </template> 139 141 </span> 140 142 </TooltipApp> 141 143 <span ··· 146 148 > 147 149 <!-- Date values use DateTime component for i18n and user settings --> 148 150 <DateTime v-if="value.type === 'date'" :datetime="value.display" date-style="medium" /> 149 - <template v-else>{{ value.display }}</template> 151 + <template v-else> 152 + <span dir="auto">{{ value.display }}</span> 153 + </template> 150 154 </span> 151 155 </template> 152 156 </div>
+1
app/components/Header/ConnectorModal.vue
··· 108 108 109 109 <div 110 110 class="flex items-center p-3 bg-bg-muted border border-border rounded-lg font-mono text-sm" 111 + dir="ltr" 111 112 > 112 113 <span class="text-fg-subtle">$</span> 113 114 <span class="text-fg-subtle ms-2">pnpm npmx-connector</span>
+1
app/components/Package/Card.vue
··· 48 48 :prefetch-on="prefetch ? 'visibility' : 'interaction'" 49 49 class="decoration-none scroll-mt-48 scroll-mb-6 after:content-[''] after:absolute after:inset-0" 50 50 :data-result-index="index" 51 + dir="ltr" 51 52 >{{ result.package.name }}</NuxtLink 52 53 > 53 54 <span
+1 -1
app/components/Package/Compatibility.vue
··· 48 48 /> 49 49 {{ getName(engine) }} 50 50 </dt> 51 - <dd class="font-mono text-sm text-fg text-end" :title="version"> 51 + <dd class="font-mono text-sm text-fg text-end" :title="version" dir="ltr"> 52 52 {{ version }} 53 53 </dd> 54 54 </div>
+6 -1
app/components/Package/Dependencies.vue
··· 84 84 <NuxtLink 85 85 :to="packageRoute(dep)" 86 86 class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0 flex-1" 87 + dir="ltr" 87 88 > 88 89 {{ dep }} 89 90 </NuxtLink> 90 - <span class="flex items-center gap-1 max-w-[40%]"> 91 + <span class="flex items-center gap-1 max-w-[40%]" dir="ltr"> 91 92 <span 92 93 v-if="outdatedDeps[dep]" 93 94 class="shrink-0" ··· 167 168 <NuxtLink 168 169 :to="packageRoute(peer.name)" 169 170 class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate" 171 + dir="ltr" 170 172 > 171 173 {{ peer.name }} 172 174 </NuxtLink> ··· 182 184 :to="packageRoute(peer.name, peer.version)" 183 185 class="font-mono text-xs text-fg-subtle max-w-[40%] truncate" 184 186 :title="peer.version" 187 + dir="ltr" 185 188 > 186 189 {{ peer.version }} 187 190 </NuxtLink> ··· 226 229 <NuxtLink 227 230 :to="packageRoute(dep)" 228 231 class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0 flex-1" 232 + dir="ltr" 229 233 > 230 234 {{ dep }} 231 235 </NuxtLink> ··· 233 237 :to="packageRoute(dep, version)" 234 238 class="font-mono text-xs text-fg-subtle max-w-[40%] text-end truncate" 235 239 :title="version" 240 + dir="ltr" 236 241 > 237 242 {{ version }} 238 243 </NuxtLink>
+4 -1
app/components/Package/Maintainers.vue
··· 190 190 params: { username: maintainer.name }, 191 191 }" 192 192 class="link-subtle font-mono text-sm shrink-0" 193 + dir="ltr" 193 194 > 194 195 ~{{ maintainer.name }} 195 196 </NuxtLink> 196 - <span v-else class="font-mono text-sm text-fg-muted">{{ maintainer.email }}</span> 197 + <span v-else class="font-mono text-sm text-fg-muted" dir="ltr">{{ 198 + maintainer.email 199 + }}</span> 197 200 198 201 <!-- Access source badges --> 199 202 <span
+2 -1
app/components/Package/TableRow.vue
··· 53 53 <NuxtLink 54 54 :to="packageUrl" 55 55 class="font-mono text-sm text-fg hover:text-accent-fallback transition-colors duration-200" 56 + dir="ltr" 56 57 > 57 58 {{ pkg.name }} 58 59 </NuxtLink> ··· 60 61 61 62 <!-- Version --> 62 63 <td v-if="isColumnVisible('version')" class="py-2 px-3 font-mono text-xs text-fg-subtle"> 63 - {{ pkg.version }} 64 + <span dir="ltr">{{ pkg.version }}</span> 64 65 </td> 65 66 66 67 <!-- Description -->
+18 -6
app/components/Package/Versions.vue
··· 378 378 class="i-carbon-warning-hex w-3.5 h-3.5 shrink-0" 379 379 aria-hidden="true" 380 380 /> 381 - {{ row.primaryVersion.version }} 381 + <span dir="ltr"> 382 + {{ row.primaryVersion.version }} 383 + </span> 382 384 </NuxtLink> 383 385 </div> 384 386 <div v-if="row.tags.length" class="flex items-center gap-1 mt-0.5 flex-wrap"> ··· 437 439 class="i-carbon-warning-hex w-3 h-3 shrink-0" 438 440 aria-hidden="true" 439 441 /> 440 - {{ v.version }} 442 + <span dir="ltr"> 443 + {{ v.version }} 444 + </span> 441 445 </NuxtLink> 442 446 <div class="flex items-center gap-2 shrink-0"> 443 447 <DateTime ··· 542 546 class="i-carbon-warning-hex w-3 h-3 shrink-0" 543 547 aria-hidden="true" 544 548 /> 545 - {{ row.primaryVersion.version }} 549 + <span dir="ltr"> 550 + {{ row.primaryVersion.version }} 551 + </span> 546 552 </NuxtLink> 547 553 <div class="flex items-center gap-2 shrink-0 pe-2"> 548 554 <DateTime ··· 618 624 class="i-carbon-warning-hex w-3 h-3 shrink-0" 619 625 aria-hidden="true" 620 626 /> 621 - {{ group.versions[0]?.version }} 627 + <span dir="ltr"> 628 + {{ group.versions[0]?.version }} 629 + </span> 622 630 </NuxtLink> 623 631 </div> 624 632 <div class="flex items-center gap-2 shrink-0 pe-2"> ··· 679 687 class="i-carbon-warning-hex w-3 h-3 shrink-0" 680 688 aria-hidden="true" 681 689 /> 682 - {{ group.versions[0]?.version }} 690 + <span dir="ltr"> 691 + {{ group.versions[0]?.version }} 692 + </span> 683 693 </NuxtLink> 684 694 </div> 685 695 <div class="flex items-center gap-2 shrink-0 pe-2"> ··· 736 746 class="i-carbon-warning-hex w-3 h-3 shrink-0" 737 747 aria-hidden="true" 738 748 /> 739 - {{ v.version }} 749 + <span dir="ltr"> 750 + {{ v.version }} 751 + </span> 740 752 </NuxtLink> 741 753 <div class="flex items-center gap-2 shrink-0 pe-2"> 742 754 <DateTime
+2 -2
app/components/PaginationControls.vue
··· 200 200 :aria-label="$t('filters.pagination.previous')" 201 201 @click="goPrev" 202 202 > 203 - <span class="i-carbon-chevron-left w-4 h-4" aria-hidden="true" /> 203 + <span class="i-carbon-chevron-left rtl-flip w-4 h-4" aria-hidden="true" /> 204 204 </button> 205 205 206 206 <!-- Page numbers --> ··· 230 230 :aria-label="$t('filters.pagination.next')" 231 231 @click="goNext" 232 232 > 233 - <span class="i-carbon-chevron-right w-4 h-4" aria-hidden="true" /> 233 + <span class="i-carbon-chevron-right rtl-flip w-4 h-4" aria-hidden="true" /> 234 234 </button> 235 235 </nav> 236 236 </div>
+3
app/components/ReadmeTocDropdown.vue
··· 198 198 activeId === node.id ? 'text-fg font-medium' : 'text-fg-muted', 199 199 highlightedIndex === getIndex(node.id) ? 'bg-bg-elevated' : 'hover:bg-bg-elevated', 200 200 ]" 201 + dir="auto" 201 202 @click="select(node.id)" 202 203 @mouseenter="highlightedIndex = getIndex(node.id)" 203 204 > ··· 214 215 activeId === child.id ? 'text-fg font-medium' : 'text-fg-subtle', 215 216 highlightedIndex === getIndex(child.id) ? 'bg-bg-elevated' : 'hover:bg-bg-elevated', 216 217 ]" 218 + dir="auto" 217 219 @click="select(child.id)" 218 220 @mouseenter="highlightedIndex = getIndex(child.id)" 219 221 > ··· 233 235 ? 'bg-bg-elevated' 234 236 : 'hover:bg-bg-elevated', 235 237 ]" 238 + dir="auto" 236 239 @click="select(grandchild.id)" 237 240 @mouseenter="highlightedIndex = getIndex(grandchild.id)" 238 241 >
+1
app/components/SearchSuggestionCard.vue
··· 31 31 <div class="flex items-center gap-2"> 32 32 <span 33 33 class="font-mono text-sm sm:text-base font-medium text-fg group-hover:text-fg transition-colors" 34 + dir="ltr" 34 35 > 35 36 {{ type === 'user' ? '~' : '@' }}{{ name }} 36 37 </span>
+5 -3
app/components/VersionSelector.vue
··· 476 476 @click="isOpen = !isOpen" 477 477 @keydown="handleButtonKeydown" 478 478 > 479 - <span>{{ currentVersion }}</span> 479 + <span dir="ltr">{{ currentVersion }}</span> 480 480 <span 481 481 v-if="currentVersion === latestVersion" 482 482 class="text-xs px-1.5 py-0.5 rounded badge-green font-sans font-medium" ··· 558 558 class="flex-1 truncate hover:text-fg transition-colors" 559 559 @click="isOpen = false" 560 560 > 561 - {{ group.primaryVersion.version }} 561 + <span dir="ltr"> 562 + {{ group.primaryVersion.version }} 563 + </span> 562 564 </NuxtLink> 563 565 564 566 <!-- Tags --> ··· 597 599 ]" 598 600 @click="isOpen = false" 599 601 > 600 - <span class="truncate">{{ v.version }}</span> 602 + <span class="truncate" dir="ltr">{{ v.version }}</span> 601 603 <span v-if="v.tags?.length" class="flex items-center gap-1 shrink-0"> 602 604 <span 603 605 v-for="tag in v.tags"
+1
app/pages/about.vue
··· 223 223 /> 224 224 <span 225 225 class="pointer-events-none absolute -top-9 inset-is-1/2 -translate-x-1/2 whitespace-nowrap rounded-md bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900 text-xs px-2 py-1 shadow-lg opacity-0 scale-95 transition-all duration-150 group-hover:opacity-100 group-hover:scale-100" 226 + dir="ltr" 226 227 > 227 228 @{{ contributor.login }} 228 229 </span>
+6 -3
app/pages/package-code/[...path].vue
··· 336 336 v{{ version }} 337 337 </span> 338 338 <span class="text-fg-subtle shrink-0">/</span> 339 - <span class="font-mono text-sm text-fg-muted shrink-0">code</span> 339 + <span class="font-mono text-sm text-fg-muted shrink-0">{{ 340 + $t('package.links.code') 341 + }}</span> 340 342 </div> 341 343 342 344 <!-- Breadcrumb navigation --> 343 345 <nav 344 346 :aria-label="$t('code.file_path')" 345 347 class="flex items-center gap-1 font-mono text-sm overflow-x-auto" 348 + dir="ltr" 346 349 > 347 350 <NuxtLink 348 351 v-if="filePath" ··· 390 393 </div> 391 394 392 395 <!-- Main content: file tree + file viewer --> 393 - <div v-else-if="fileTree" class="flex flex-1"> 396 + <div v-else-if="fileTree" class="flex flex-1" dir="ltr"> 394 397 <!-- File tree sidebar - sticky with internal scroll --> 395 398 <aside 396 399 class="w-64 lg:w-72 border-ie border-border shrink-0 hidden md:block bg-bg-subtle sticky top-28 self-start h-[calc(100vh-7rem)] overflow-y-auto" ··· 436 439 </button> 437 440 </div> 438 441 <div class="flex items-center gap-3 text-sm"> 439 - <span class="text-fg-muted">{{ 442 + <span class="text-fg-muted" dir="auto">{{ 440 443 $t('code.lines', { count: fileContent.lines }) 441 444 }}</span> 442 445 <span v-if="currentNode?.size" class="text-fg-subtle">{{
+1 -1
app/pages/package-docs/[...path].vue
··· 158 158 </div> 159 159 </header> 160 160 161 - <div class="flex"> 161 + <div class="flex" dir="ltr"> 162 162 <!-- Sidebar TOC --> 163 163 <aside 164 164 v-if="docsData?.toc && !showEmptyState"
+6 -4
app/pages/package/[[org]]/[name].vue
··· 515 515 <h1 516 516 class="font-mono text-2xl sm:text-3xl font-medium min-w-0 break-words" 517 517 :title="pkg.name" 518 + dir="ltr" 518 519 > 519 520 <NuxtLink 520 521 v-if="orgName" ··· 553 554 > 554 555 <!-- Version resolution indicator (e.g., "latest → 4.2.0") --> 555 556 <template v-if="requestedVersion && resolvedVersion !== requestedVersion"> 556 - <span class="font-mono text-fg-muted text-sm">{{ requestedVersion }}</span> 557 + <span class="font-mono text-fg-muted text-sm" dir="ltr">{{ requestedVersion }}</span> 557 558 <span class="i-carbon:arrow-right rtl-flip w-3 h-3" aria-hidden="true" /> 558 559 </template> 559 560 ··· 561 562 v-if="requestedVersion && resolvedVersion !== requestedVersion" 562 563 :to="packageRoute(pkg.name, resolvedVersion)" 563 564 :title="$t('package.view_permalink')" 565 + dir="ltr" 564 566 >{{ resolvedVersion }}</NuxtLink 565 567 > 566 - <span v-else>v{{ resolvedVersion }}</span> 568 + <span dir="ltr" v-else>v{{ resolvedVersion }}</span> 567 569 568 570 <template v-if="hasProvenance(displayVersion) && provenanceBadgeMounted"> 569 571 <TooltipApp ··· 945 947 </dt> 946 948 <dd class="font-mono text-sm text-fg"> 947 949 <!-- Package size (greyed out) --> 948 - <span class="text-fg-muted"> 950 + <span class="text-fg-muted" dir="ltr"> 949 951 <span v-if="displayVersion?.dist?.unpackedSize"> 950 952 {{ formatBytes(displayVersion.dist.unpackedSize) }} 951 953 </span> ··· 965 967 aria-hidden="true" 966 968 /> 967 969 </span> 968 - <span v-else-if="installSize?.totalSize"> 970 + <span v-else-if="installSize?.totalSize" dir="ltr"> 969 971 {{ formatBytes(installSize.totalSize) }} 970 972 </span> 971 973 <span v-else class="text-fg-subtle">-</span>
+44 -44
i18n/locales/ar.json
··· 6 6 } 7 7 }, 8 8 "version": "الإصدار", 9 - "built_at": "تم البناء في {0}", 9 + "built_at": "تم البناء {0}", 10 10 "alt_logo": "شعار npmx", 11 11 "tagline": "متصفح أفضل لسجل npm", 12 12 "non_affiliation_disclaimer": "غير مرتبط بشركة npm, Inc.", ··· 20 20 }, 21 21 "search": { 22 22 "label": "ابحث عن حزم npm", 23 - "placeholder": "ابحث عن الحزم...", 23 + "placeholder": "ابحث عن الحزم…", 24 24 "button": "بحث", 25 25 "clear": "مسح البحث", 26 - "searching": "جارٍ البحث...", 26 + "searching": "جارٍ البحث…", 27 27 "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", 28 - "updating": "(جارٍ التحديث...)", 28 + "updating": "(جارٍ التحديث…)", 29 29 "no_results": "لم يتم العثور على حزم لـ \"{query}\"", 30 30 "title": "بحث", 31 31 "title_search": "بحث: {search}", ··· 87 87 "i18n": { 88 88 "missing_keys": "{count} ترجمات مفقودة | ترجمة واحدة مفقودة | ترجمتان مفقودتان | {count} ترجمات مفقودة | {count} ترجمة مفقودة | {count} ترجمة مفقودة", 89 89 "copy_keys": "نسخ المفاتيح", 90 - "show_more_keys": "عرض المزيد ({count})...", 90 + "show_more_keys": "عرض المزيد ({count})…", 91 91 "contribute_hint": "ساعد في تحسين هذه الترجمة عن طريق إضافة المفاتيح المفقودة.", 92 92 "edit_on_github": "تعديل على GitHub", 93 93 "view_guide": "دليل الترجمة" 94 94 }, 95 95 "common": { 96 - "loading": "جارٍ التحميل...", 97 - "loading_more": "جارٍ تحميل المزيد...", 98 - "loading_packages": "جارٍ تحميل الحزم...", 96 + "loading": "جارٍ التحميل…", 97 + "loading_more": "جارٍ تحميل المزيد…", 98 + "loading_packages": "جارٍ تحميل الحزم…", 99 99 "end_of_results": "نهاية النتائج", 100 100 "try_again": "حاول مرة أخرى", 101 101 "close": "إغلاق", ··· 284 284 "via": "عبر {teams}", 285 285 "remove_owner": "إزالة {name} كمالك", 286 286 "username_to_add": "اسم المستخدم لإضافته كمالك", 287 - "username_placeholder": "اسم المستخدم...", 287 + "username_placeholder": "اسم المستخدم…", 288 288 "add_button": "إضافة", 289 289 "cancel_add": "إلغاء إضافة المالك", 290 290 "add_owner": "+ إضافة مالك", ··· 306 306 "start_date": "البداية", 307 307 "end_date": "النهاية", 308 308 "no_data": "لا تتوفر بيانات تنزيل", 309 - "loading": "جارٍ التحميل...", 309 + "loading": "جارٍ التحميل…", 310 310 "y_axis_label": "تنزيلات {granularity}ة", 311 311 "download_file": "تنزيل {fileType}", 312 312 "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية" ··· 376 376 "revoke_access": "سحب وصول {name}", 377 377 "no_access": "لا يوجد وصول فريق مُعدّ", 378 378 "select_team_label": "اختر فريقًا", 379 - "loading_teams": "جارٍ تحميل الفرق...", 379 + "loading_teams": "جارٍ تحميل الفرق…", 380 380 "select_team": "اختر فريقًا", 381 381 "permission_label": "مستوى الصلاحية", 382 382 "permission": { ··· 389 389 }, 390 390 "list": { 391 391 "filter_label": "فلترة الحزم", 392 - "filter_placeholder": "فلتر الحزم...", 392 + "filter_placeholder": "فلتر الحزم…", 393 393 "sort_label": "ترتيب الحزم", 394 394 "showing_count": "يعرض {filtered} من أصل {total} حزمة" 395 395 }, ··· 416 416 }, 417 417 "connector": { 418 418 "status": { 419 - "connecting": "جارٍ الاتصال...", 419 + "connecting": "جارٍ الاتصال…", 420 420 "connected_as": "متصل كـ ~{user}", 421 421 "connected": "متصل", 422 422 "connect_cli": "ربط واجهة سطر الأوامر المحلية", ··· 439 439 "copied": "تم النسخ", 440 440 "paste_token": "ثم الصق الرمز أدناه للاتصال:", 441 441 "token_label": "الرمز", 442 - "token_placeholder": "الصق الرمز هنا...", 442 + "token_placeholder": "الصق الرمز هنا…", 443 443 "advanced": "خيارات متقدمة", 444 444 "port_label": "المنفذ", 445 445 "warning": "تحذير!", 446 446 "warning_text": "يسمح هذا لـ npmx بالوصول إلى npm CLI لديك. لا تتصل إلا بالمواقع التي تثق بها.", 447 447 "connect": "اتصال", 448 - "connecting": "جارٍ الاتصال..." 448 + "connecting": "جارٍ الاتصال…" 449 449 } 450 450 }, 451 451 "operations": { ··· 458 458 "active_label": "العمليات النشطة", 459 459 "otp_required": "رمز OTP مطلوب", 460 460 "otp_prompt": "أدخل رمز OTP للمتابعة", 461 - "otp_placeholder": "أدخل رمز OTP...", 461 + "otp_placeholder": "أدخل رمز OTP…", 462 462 "otp_label": "كلمة المرور وحيدة الاستخدام (OTP)", 463 463 "retry_otp": "إعادة المحاولة باستخدام OTP", 464 - "retrying": "جارٍ إعادة المحاولة...", 464 + "retrying": "جارٍ إعادة المحاولة…", 465 465 "approve_operation": "الموافقة على العملية", 466 466 "remove_operation": "إزالة العملية", 467 467 "approve_all": "الموافقة على الكل", 468 468 "execute": "تنفيذ", 469 - "executing": "جارٍ التنفيذ...", 469 + "executing": "جارٍ التنفيذ…", 470 470 "log": "السجل", 471 471 "log_label": "سجل العمليات المكتملة", 472 472 "remove_from_log": "إزالة من السجل" ··· 477 477 "title": "الفرق", 478 478 "refresh": "تحديث الفرق", 479 479 "filter_label": "فلترة الفرق", 480 - "filter_placeholder": "فلتر الفرق...", 480 + "filter_placeholder": "فلتر الفرق…", 481 481 "sort_by": "الترتيب حسب", 482 - "loading": "جارٍ تحميل الفرق...", 482 + "loading": "جارٍ تحميل الفرق…", 483 483 "no_teams": "لم يتم العثور على فرق", 484 484 "list_label": "فرق المؤسسة", 485 485 "delete_team": "حذف الفريق {name}", ··· 488 488 "no_members": "لا يوجد أعضاء", 489 489 "remove_user": "إزالة {user} من الفريق", 490 490 "username_to_add": "اسم المستخدم لإضافته إلى {team}", 491 - "username_placeholder": "اسم المستخدم...", 491 + "username_placeholder": "اسم المستخدم…", 492 492 "add_button": "إضافة", 493 493 "cancel_add_user": "إلغاء إضافة المستخدم", 494 494 "add_member": "+ إضافة عضو", 495 495 "team_name_label": "اسم الفريق", 496 - "team_name_placeholder": "اسم الفريق...", 496 + "team_name_placeholder": "اسم الفريق…", 497 497 "create_button": "إنشاء", 498 498 "no_match": "لا توجد فرق تطابق \"{query}\"", 499 499 "cancel_create": "إلغاء إنشاء الفريق", ··· 503 503 "title": "الأعضاء", 504 504 "refresh": "تحديث الأعضاء", 505 505 "filter_label": "فلترة الأعضاء", 506 - "filter_placeholder": "فلتر الأعضاء...", 506 + "filter_placeholder": "فلتر الأعضاء…", 507 507 "filter_by_role": "فلترة حسب الدور", 508 508 "filter_by_team": "فلترة حسب الفريق", 509 509 "all_teams": "كل الفرق", 510 510 "sort_by": "الترتيب حسب", 511 - "loading": "جارٍ تحميل الأعضاء...", 511 + "loading": "جارٍ تحميل الأعضاء…", 512 512 "no_members": "لم يتم العثور على أعضاء", 513 513 "list_label": "أعضاء المؤسسة", 514 514 "change_role_for": "تغيير الدور لـ {name}", ··· 516 516 "view_team": "عرض فريق {team}", 517 517 "no_match": "لا يوجد أعضاء يطابقون عوامل الفلترة", 518 518 "username_label": "اسم المستخدم", 519 - "username_placeholder": "اسم المستخدم...", 519 + "username_placeholder": "اسم المستخدم…", 520 520 "role_label": "الدور", 521 521 "role": { 522 522 "all": "الكل", ··· 541 541 "no_match": "لا توجد حزم تطابق \"{query}\"", 542 542 "not_found": "لم يتم العثور على المؤسسة", 543 543 "not_found_message": "المؤسسة \"{'@'}{name}\" غير موجودة على npm", 544 - "filter_placeholder": "فلتر {count} حزمة..." 544 + "filter_placeholder": "فلتر {count} حزمة…" 545 545 } 546 546 }, 547 547 "user": { 548 548 "combobox": { 549 549 "add_to_org_hint": "(سيُضاف أيضًا إلى المؤسسة)", 550 550 "press_enter_to_add": "اضغط Enter لإضافة {'@'}{username}", 551 - "default_placeholder": "اسم المستخدم...", 551 + "default_placeholder": "اسم المستخدم…", 552 552 "suggestions_label": "اقتراحات المستخدمين" 553 553 }, 554 554 "page": { ··· 557 557 "no_packages_hint": "قد لا يكون هذا المستخدم موجودًا أو قد لا يحتوي على حزم عامة.", 558 558 "failed_to_load": "فشل تحميل حزم المستخدم", 559 559 "no_match": "لا توجد حزم تطابق \"{query}\"", 560 - "filter_placeholder": "فلتر {count} حزمة..." 560 + "filter_placeholder": "فلتر {count} حزمة…" 561 561 }, 562 562 "orgs_page": { 563 563 "title": "المؤسسات", ··· 567 567 "connect_hint_suffix": "للبدء.", 568 568 "own_orgs_only": "يمكنك عرض مؤسساتك أنت فقط.", 569 569 "view_your_orgs": "عرض مؤسساتك", 570 - "loading": "جارٍ تحميل المؤسسات...", 570 + "loading": "جارٍ تحميل المؤسسات…", 571 571 "empty": "لم يتم العثور على مؤسسات.", 572 572 "empty_hint": "يتم اكتشاف المؤسسات من حزمك ذات النطاق (scoped).", 573 573 "count": "{count} مؤسسة | مؤسسة واحدة | مؤسستان | {count} مؤسسات | {count} مؤسسة | {count} مؤسسة", ··· 593 593 "publish_hint": "سيؤدي هذا إلى نشر حزمة مصغرة كعنصر نائب (placeholder).", 594 594 "preview_json": "معاينة package.json", 595 595 "claim_button": "حجز اسم الحزمة", 596 - "publishing": "جارٍ النشر...", 597 - "checking": "جارٍ التحقق من التوفر...", 596 + "publishing": "جارٍ النشر…", 597 + "checking": "جارٍ التحقق من التوفر…", 598 598 "failed_to_check": "فشل التحقق من توفر الاسم", 599 599 "failed_to_claim": "فشل حجز الحزمة" 600 600 } ··· 617 617 "unavailable_hint": "قد يكون الملف كبيرًا جدًا أو غير متاح", 618 618 "version_required": "الإصدار مطلوب لتصفح الكود", 619 619 "go_to_package": "الانتقال إلى الحزمة", 620 - "loading_tree": "جارٍ تحميل شجرة الملفات...", 620 + "loading_tree": "جارٍ تحميل شجرة الملفات…", 621 621 "failed_to_load_tree": "فشل تحميل الملفات لهذا الإصدار من الحزمة", 622 622 "back_to_package": "العودة إلى الحزمة", 623 623 "table": { ··· 646 646 "title": "فلاتر", 647 647 "search": "بحث", 648 648 "search_scope": "نطاق البحث", 649 - "search_placeholder_name": "فلترة حسب اسم الحزمة...", 650 - "search_placeholder_description": "فلترة حسب الوصف...", 651 - "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية...", 649 + "search_placeholder_name": "فلترة حسب اسم الحزمة…", 650 + "search_placeholder_description": "فلترة حسب الوصف…", 651 + "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية…", 652 652 "search_placeholder_all": "فلتر حسب الكل أو استخدم name: desc: kw:", 653 653 "scope_name": "الإسم", 654 654 "scope_name_description": "بحث في أسماء الحزم فقط", ··· 786 786 "contributors": { 787 787 "title": "المساهمون", 788 788 "description": "npmx هو مشروع مفتوح المصدر بالكامل، تم بناؤه بواسطة مجتمع مذهل من المساهمين.", 789 - "loading": "جارٍ تحميل المساهمين...", 789 + "loading": "جارٍ تحميل المساهمين…", 790 790 "error": "فشل تحميل المساهمين", 791 791 "view_profile": "عرض بروفايل {name} على GitHub" 792 792 }, ··· 818 818 "atmosphere_desc": "ميزات اجتماعية وهوية", 819 819 "connect_npm_cli": "الاتصال بـ npm CLI", 820 820 "connect_atmosphere": "الاتصال بـ Atmosphere", 821 - "connecting": "جارٍ الاتصال...", 821 + "connecting": "جارٍ الاتصال…", 822 822 "ops": "{count} عملية | عملية واحدة | عمليتان | {count} عمليات | {count} عملية | {count} عملية", 823 823 "disconnect": "قطع الاتصال" 824 824 }, ··· 843 843 "packages": "الحزم", 844 844 "packages_dropdown": { 845 845 "title": "حزمك", 846 - "loading": "جارٍ التحميل...", 846 + "loading": "جارٍ التحميل…", 847 847 "error": "فشل تحميل الحزم", 848 848 "empty": "لا توجد حزم", 849 849 "view_all": "عرض الكل" ··· 851 851 "orgs": "المؤسسات", 852 852 "orgs_dropdown": { 853 853 "title": "مؤسساتك", 854 - "loading": "جارٍ التحميل...", 854 + "loading": "جارٍ التحميل…", 855 855 "error": "فشل تحميل المؤسسات", 856 856 "empty": "لا توجد مؤسسات", 857 857 "view_all": "عرض الكل" ··· 868 868 "section_packages": "الحزم", 869 869 "section_facets": "المحاور", 870 870 "section_comparison": "المقارنة", 871 - "loading": "جارٍ تحميل بيانات الحزم...", 871 + "loading": "جارٍ تحميل بيانات الحزم…", 872 872 "error": "فشل تحميل بيانات الحزم. الرجاء المحاولة مرة أخرى.", 873 873 "empty_title": "اختر حزمًا للمقارنة", 874 874 "empty_description": "ابحث وأضف حزمتين على الأقل أعلاه لعرض مقارنة جنبًا إلى جنب لمقاييسها." 875 875 }, 876 876 "selector": { 877 877 "search_label": "ابحث عن حزم", 878 - "search_first": "ابحث عن حزمة...", 879 - "search_add": "أضف حزمة أخرى...", 880 - "searching": "جارٍ البحث...", 878 + "search_first": "ابحث عن حزمة…", 879 + "search_add": "أضف حزمة أخرى…", 880 + "searching": "جارٍ البحث…", 881 881 "remove_package": "إزالة {package}", 882 882 "packages_selected": "{count}/{max} حزمة محددة.", 883 883 "add_hint": "أضف حزمتين على الأقل للمقارنة.", 884 - "loading_versions": "جارٍ تحميل الإصدارات...", 884 + "loading_versions": "جارٍ تحميل الإصدارات…", 885 885 "select_version": "اختر إصدارًا" 886 886 }, 887 887 "no_dependency": {
+44 -44
lunaria/files/ar-EG.json
··· 6 6 } 7 7 }, 8 8 "version": "الإصدار", 9 - "built_at": "تم البناء في {0}", 9 + "built_at": "تم البناء {0}", 10 10 "alt_logo": "شعار npmx", 11 11 "tagline": "متصفح أفضل لسجل npm", 12 12 "non_affiliation_disclaimer": "غير مرتبط بشركة npm, Inc.", ··· 20 20 }, 21 21 "search": { 22 22 "label": "ابحث عن حزم npm", 23 - "placeholder": "ابحث عن الحزم...", 23 + "placeholder": "ابحث عن الحزم…", 24 24 "button": "بحث", 25 25 "clear": "مسح البحث", 26 - "searching": "جارٍ البحث...", 26 + "searching": "جارٍ البحث…", 27 27 "found_packages": "تم العثور على {count} حزمة | تم العثور على حزمة واحدة | تم العثور على حزمتين | تم العثور على {count} حزم | تم العثور على {count} حزمة | تم العثور على {count} حزمة", 28 - "updating": "(جارٍ التحديث...)", 28 + "updating": "(جارٍ التحديث…)", 29 29 "no_results": "لم يتم العثور على حزم لـ \"{query}\"", 30 30 "title": "بحث", 31 31 "title_search": "بحث: {search}", ··· 87 87 "i18n": { 88 88 "missing_keys": "{count} ترجمات مفقودة | ترجمة واحدة مفقودة | ترجمتان مفقودتان | {count} ترجمات مفقودة | {count} ترجمة مفقودة | {count} ترجمة مفقودة", 89 89 "copy_keys": "نسخ المفاتيح", 90 - "show_more_keys": "عرض المزيد ({count})...", 90 + "show_more_keys": "عرض المزيد ({count})…", 91 91 "contribute_hint": "ساعد في تحسين هذه الترجمة عن طريق إضافة المفاتيح المفقودة.", 92 92 "edit_on_github": "تعديل على GitHub", 93 93 "view_guide": "دليل الترجمة" 94 94 }, 95 95 "common": { 96 - "loading": "جارٍ التحميل...", 97 - "loading_more": "جارٍ تحميل المزيد...", 98 - "loading_packages": "جارٍ تحميل الحزم...", 96 + "loading": "جارٍ التحميل…", 97 + "loading_more": "جارٍ تحميل المزيد…", 98 + "loading_packages": "جارٍ تحميل الحزم…", 99 99 "end_of_results": "نهاية النتائج", 100 100 "try_again": "حاول مرة أخرى", 101 101 "close": "إغلاق", ··· 284 284 "via": "عبر {teams}", 285 285 "remove_owner": "إزالة {name} كمالك", 286 286 "username_to_add": "اسم المستخدم لإضافته كمالك", 287 - "username_placeholder": "اسم المستخدم...", 287 + "username_placeholder": "اسم المستخدم…", 288 288 "add_button": "إضافة", 289 289 "cancel_add": "إلغاء إضافة المالك", 290 290 "add_owner": "+ إضافة مالك", ··· 306 306 "start_date": "البداية", 307 307 "end_date": "النهاية", 308 308 "no_data": "لا تتوفر بيانات تنزيل", 309 - "loading": "جارٍ التحميل...", 309 + "loading": "جارٍ التحميل…", 310 310 "y_axis_label": "تنزيلات {granularity}ة", 311 311 "download_file": "تنزيل {fileType}", 312 312 "toggle_annotator": "إظهار/إخفاء الشروح التوضيحية" ··· 376 376 "revoke_access": "سحب وصول {name}", 377 377 "no_access": "لا يوجد وصول فريق مُعدّ", 378 378 "select_team_label": "اختر فريقًا", 379 - "loading_teams": "جارٍ تحميل الفرق...", 379 + "loading_teams": "جارٍ تحميل الفرق…", 380 380 "select_team": "اختر فريقًا", 381 381 "permission_label": "مستوى الصلاحية", 382 382 "permission": { ··· 389 389 }, 390 390 "list": { 391 391 "filter_label": "فلترة الحزم", 392 - "filter_placeholder": "فلتر الحزم...", 392 + "filter_placeholder": "فلتر الحزم…", 393 393 "sort_label": "ترتيب الحزم", 394 394 "showing_count": "يعرض {filtered} من أصل {total} حزمة" 395 395 }, ··· 416 416 }, 417 417 "connector": { 418 418 "status": { 419 - "connecting": "جارٍ الاتصال...", 419 + "connecting": "جارٍ الاتصال…", 420 420 "connected_as": "متصل كـ ~{user}", 421 421 "connected": "متصل", 422 422 "connect_cli": "ربط واجهة سطر الأوامر المحلية", ··· 439 439 "copied": "تم النسخ", 440 440 "paste_token": "ثم الصق الرمز أدناه للاتصال:", 441 441 "token_label": "الرمز", 442 - "token_placeholder": "الصق الرمز هنا...", 442 + "token_placeholder": "الصق الرمز هنا…", 443 443 "advanced": "خيارات متقدمة", 444 444 "port_label": "المنفذ", 445 445 "warning": "تحذير!", 446 446 "warning_text": "يسمح هذا لـ npmx بالوصول إلى npm CLI لديك. لا تتصل إلا بالمواقع التي تثق بها.", 447 447 "connect": "اتصال", 448 - "connecting": "جارٍ الاتصال..." 448 + "connecting": "جارٍ الاتصال…" 449 449 } 450 450 }, 451 451 "operations": { ··· 458 458 "active_label": "العمليات النشطة", 459 459 "otp_required": "رمز OTP مطلوب", 460 460 "otp_prompt": "أدخل رمز OTP للمتابعة", 461 - "otp_placeholder": "أدخل رمز OTP...", 461 + "otp_placeholder": "أدخل رمز OTP…", 462 462 "otp_label": "كلمة المرور وحيدة الاستخدام (OTP)", 463 463 "retry_otp": "إعادة المحاولة باستخدام OTP", 464 - "retrying": "جارٍ إعادة المحاولة...", 464 + "retrying": "جارٍ إعادة المحاولة…", 465 465 "approve_operation": "الموافقة على العملية", 466 466 "remove_operation": "إزالة العملية", 467 467 "approve_all": "الموافقة على الكل", 468 468 "execute": "تنفيذ", 469 - "executing": "جارٍ التنفيذ...", 469 + "executing": "جارٍ التنفيذ…", 470 470 "log": "السجل", 471 471 "log_label": "سجل العمليات المكتملة", 472 472 "remove_from_log": "إزالة من السجل" ··· 477 477 "title": "الفرق", 478 478 "refresh": "تحديث الفرق", 479 479 "filter_label": "فلترة الفرق", 480 - "filter_placeholder": "فلتر الفرق...", 480 + "filter_placeholder": "فلتر الفرق…", 481 481 "sort_by": "الترتيب حسب", 482 - "loading": "جارٍ تحميل الفرق...", 482 + "loading": "جارٍ تحميل الفرق…", 483 483 "no_teams": "لم يتم العثور على فرق", 484 484 "list_label": "فرق المؤسسة", 485 485 "delete_team": "حذف الفريق {name}", ··· 488 488 "no_members": "لا يوجد أعضاء", 489 489 "remove_user": "إزالة {user} من الفريق", 490 490 "username_to_add": "اسم المستخدم لإضافته إلى {team}", 491 - "username_placeholder": "اسم المستخدم...", 491 + "username_placeholder": "اسم المستخدم…", 492 492 "add_button": "إضافة", 493 493 "cancel_add_user": "إلغاء إضافة المستخدم", 494 494 "add_member": "+ إضافة عضو", 495 495 "team_name_label": "اسم الفريق", 496 - "team_name_placeholder": "اسم الفريق...", 496 + "team_name_placeholder": "اسم الفريق…", 497 497 "create_button": "إنشاء", 498 498 "no_match": "لا توجد فرق تطابق \"{query}\"", 499 499 "cancel_create": "إلغاء إنشاء الفريق", ··· 503 503 "title": "الأعضاء", 504 504 "refresh": "تحديث الأعضاء", 505 505 "filter_label": "فلترة الأعضاء", 506 - "filter_placeholder": "فلتر الأعضاء...", 506 + "filter_placeholder": "فلتر الأعضاء…", 507 507 "filter_by_role": "فلترة حسب الدور", 508 508 "filter_by_team": "فلترة حسب الفريق", 509 509 "all_teams": "كل الفرق", 510 510 "sort_by": "الترتيب حسب", 511 - "loading": "جارٍ تحميل الأعضاء...", 511 + "loading": "جارٍ تحميل الأعضاء…", 512 512 "no_members": "لم يتم العثور على أعضاء", 513 513 "list_label": "أعضاء المؤسسة", 514 514 "change_role_for": "تغيير الدور لـ {name}", ··· 516 516 "view_team": "عرض فريق {team}", 517 517 "no_match": "لا يوجد أعضاء يطابقون عوامل الفلترة", 518 518 "username_label": "اسم المستخدم", 519 - "username_placeholder": "اسم المستخدم...", 519 + "username_placeholder": "اسم المستخدم…", 520 520 "role_label": "الدور", 521 521 "role": { 522 522 "all": "الكل", ··· 541 541 "no_match": "لا توجد حزم تطابق \"{query}\"", 542 542 "not_found": "لم يتم العثور على المؤسسة", 543 543 "not_found_message": "المؤسسة \"{'@'}{name}\" غير موجودة على npm", 544 - "filter_placeholder": "فلتر {count} حزمة..." 544 + "filter_placeholder": "فلتر {count} حزمة…" 545 545 } 546 546 }, 547 547 "user": { 548 548 "combobox": { 549 549 "add_to_org_hint": "(سيُضاف أيضًا إلى المؤسسة)", 550 550 "press_enter_to_add": "اضغط Enter لإضافة {'@'}{username}", 551 - "default_placeholder": "اسم المستخدم...", 551 + "default_placeholder": "اسم المستخدم…", 552 552 "suggestions_label": "اقتراحات المستخدمين" 553 553 }, 554 554 "page": { ··· 557 557 "no_packages_hint": "قد لا يكون هذا المستخدم موجودًا أو قد لا يحتوي على حزم عامة.", 558 558 "failed_to_load": "فشل تحميل حزم المستخدم", 559 559 "no_match": "لا توجد حزم تطابق \"{query}\"", 560 - "filter_placeholder": "فلتر {count} حزمة..." 560 + "filter_placeholder": "فلتر {count} حزمة…" 561 561 }, 562 562 "orgs_page": { 563 563 "title": "المؤسسات", ··· 567 567 "connect_hint_suffix": "للبدء.", 568 568 "own_orgs_only": "يمكنك عرض مؤسساتك أنت فقط.", 569 569 "view_your_orgs": "عرض مؤسساتك", 570 - "loading": "جارٍ تحميل المؤسسات...", 570 + "loading": "جارٍ تحميل المؤسسات…", 571 571 "empty": "لم يتم العثور على مؤسسات.", 572 572 "empty_hint": "يتم اكتشاف المؤسسات من حزمك ذات النطاق (scoped).", 573 573 "count": "{count} مؤسسة | مؤسسة واحدة | مؤسستان | {count} مؤسسات | {count} مؤسسة | {count} مؤسسة", ··· 593 593 "publish_hint": "سيؤدي هذا إلى نشر حزمة مصغرة كعنصر نائب (placeholder).", 594 594 "preview_json": "معاينة package.json", 595 595 "claim_button": "حجز اسم الحزمة", 596 - "publishing": "جارٍ النشر...", 597 - "checking": "جارٍ التحقق من التوفر...", 596 + "publishing": "جارٍ النشر…", 597 + "checking": "جارٍ التحقق من التوفر…", 598 598 "failed_to_check": "فشل التحقق من توفر الاسم", 599 599 "failed_to_claim": "فشل حجز الحزمة" 600 600 } ··· 617 617 "unavailable_hint": "قد يكون الملف كبيرًا جدًا أو غير متاح", 618 618 "version_required": "الإصدار مطلوب لتصفح الكود", 619 619 "go_to_package": "الانتقال إلى الحزمة", 620 - "loading_tree": "جارٍ تحميل شجرة الملفات...", 620 + "loading_tree": "جارٍ تحميل شجرة الملفات…", 621 621 "failed_to_load_tree": "فشل تحميل الملفات لهذا الإصدار من الحزمة", 622 622 "back_to_package": "العودة إلى الحزمة", 623 623 "table": { ··· 646 646 "title": "فلاتر", 647 647 "search": "بحث", 648 648 "search_scope": "نطاق البحث", 649 - "search_placeholder_name": "فلترة حسب اسم الحزمة...", 650 - "search_placeholder_description": "فلترة حسب الوصف...", 651 - "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية...", 649 + "search_placeholder_name": "فلترة حسب اسم الحزمة…", 650 + "search_placeholder_description": "فلترة حسب الوصف…", 651 + "search_placeholder_keywords": "فلترة حسب الكلمات المفتاحية…", 652 652 "search_placeholder_all": "فلتر حسب الكل أو استخدم name: desc: kw:", 653 653 "scope_name": "الإسم", 654 654 "scope_name_description": "بحث في أسماء الحزم فقط", ··· 786 786 "contributors": { 787 787 "title": "المساهمون", 788 788 "description": "npmx هو مشروع مفتوح المصدر بالكامل، تم بناؤه بواسطة مجتمع مذهل من المساهمين.", 789 - "loading": "جارٍ تحميل المساهمين...", 789 + "loading": "جارٍ تحميل المساهمين…", 790 790 "error": "فشل تحميل المساهمين", 791 791 "view_profile": "عرض بروفايل {name} على GitHub" 792 792 }, ··· 818 818 "atmosphere_desc": "ميزات اجتماعية وهوية", 819 819 "connect_npm_cli": "الاتصال بـ npm CLI", 820 820 "connect_atmosphere": "الاتصال بـ Atmosphere", 821 - "connecting": "جارٍ الاتصال...", 821 + "connecting": "جارٍ الاتصال…", 822 822 "ops": "{count} عملية | عملية واحدة | عمليتان | {count} عمليات | {count} عملية | {count} عملية", 823 823 "disconnect": "قطع الاتصال" 824 824 }, ··· 843 843 "packages": "الحزم", 844 844 "packages_dropdown": { 845 845 "title": "حزمك", 846 - "loading": "جارٍ التحميل...", 846 + "loading": "جارٍ التحميل…", 847 847 "error": "فشل تحميل الحزم", 848 848 "empty": "لا توجد حزم", 849 849 "view_all": "عرض الكل" ··· 851 851 "orgs": "المؤسسات", 852 852 "orgs_dropdown": { 853 853 "title": "مؤسساتك", 854 - "loading": "جارٍ التحميل...", 854 + "loading": "جارٍ التحميل…", 855 855 "error": "فشل تحميل المؤسسات", 856 856 "empty": "لا توجد مؤسسات", 857 857 "view_all": "عرض الكل" ··· 868 868 "section_packages": "الحزم", 869 869 "section_facets": "المحاور", 870 870 "section_comparison": "المقارنة", 871 - "loading": "جارٍ تحميل بيانات الحزم...", 871 + "loading": "جارٍ تحميل بيانات الحزم…", 872 872 "error": "فشل تحميل بيانات الحزم. الرجاء المحاولة مرة أخرى.", 873 873 "empty_title": "اختر حزمًا للمقارنة", 874 874 "empty_description": "ابحث وأضف حزمتين على الأقل أعلاه لعرض مقارنة جنبًا إلى جنب لمقاييسها." 875 875 }, 876 876 "selector": { 877 877 "search_label": "ابحث عن حزم", 878 - "search_first": "ابحث عن حزمة...", 879 - "search_add": "أضف حزمة أخرى...", 880 - "searching": "جارٍ البحث...", 878 + "search_first": "ابحث عن حزمة…", 879 + "search_add": "أضف حزمة أخرى…", 880 + "searching": "جارٍ البحث…", 881 881 "remove_package": "إزالة {package}", 882 882 "packages_selected": "{count}/{max} حزمة محددة.", 883 883 "add_hint": "أضف حزمتين على الأقل للمقارنة.", 884 - "loading_versions": "جارٍ تحميل الإصدارات...", 884 + "loading_versions": "جارٍ تحميل الإصدارات…", 885 885 "select_version": "اختر إصدارًا" 886 886 }, 887 887 "no_dependency": {