diff --git a/app/pages/about.vue b/app/pages/about.vue index e6dde0c85..4df5bfda4 100644 --- a/app/pages/about.vue +++ b/app/pages/about.vue @@ -1,5 +1,5 @@ + + diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json index 5ed1a9856..4c9453b13 100644 --- a/i18n/locales/ar.json +++ b/i18n/locales/ar.json @@ -142,6 +142,9 @@ }, "scroll_to_top": "التمرير إلى الأعلى" }, + "profile": { + "invite": {} + }, "package": { "not_found": "لم يتم العثور على الحزمة", "not_found_message": "تعذّر العثور على الحزمة.", @@ -157,6 +160,7 @@ "version": "تم إهمال هذا الإصدار.", "no_reason": "لم يتم تقديم سبب" }, + "size_increase": {}, "replacement": { "title": "قد لا تحتاج إلى هذه التبعية.", "native": "يمكن استبدالها بـ {replacement}، المتوفرة منذ Node {nodeVersion}.", @@ -304,7 +308,8 @@ "filter_help": "مساعدة فلتر نطاق semver", "filter_tooltip": "فلترة الإصدارات باستخدام {link}. مثلاً ^3.0.0 يعرض كل إصدارات 3.x.", "filter_tooltip_link": "نطاق semver", - "no_matches": "لا توجد إصدارات تطابق هذا النطاق" + "no_matches": "لا توجد إصدارات تطابق هذا النطاق", + "copy_alt": {} }, "dependencies": { "title": "التبعيات ({count})", @@ -364,7 +369,8 @@ "downloads": "التنزيلات", "likes": "الإعجابات", "contributors": "المساهمون" - } + }, + "copy_alt": {} }, "downloads": { "title": "التنزيلات الأسبوعية", @@ -811,9 +817,10 @@ "managers": "مديري" } }, + "sponsors": {}, + "oss_partners": {}, "team": { "title": "الفريق", - "governance": "الحوكمة", "role_steward": "راعي", "role_maintainer": "مشرف", "sponsor": "راعي", @@ -823,8 +830,7 @@ "title": "المساهمون", "description": "npmx هو مشروع مفتوح المصدر بالكامل، تم بناؤه بواسطة مجتمع مذهل من المساهمين.", "loading": "جارٍ تحميل المساهمين…", - "error": "فشل تحميل المساهمين", - "view_profile": "عرض بروفايل {name} على GitHub" + "error": "فشل تحميل المساهمين" }, "get_involved": { "title": "كن جزءًا من npmx", @@ -1010,7 +1016,9 @@ "trends": { "title": "مقارنة التوجهات" } - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "title": "سياسة الخصوصية", diff --git a/i18n/locales/az-AZ.json b/i18n/locales/az-AZ.json index 2f6f7649a..0fa7af2fb 100644 --- a/i18n/locales/az-AZ.json +++ b/i18n/locales/az-AZ.json @@ -187,6 +187,9 @@ }, "scroll_to_top": "Yuxarı qayıt" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Paket Tapılmadı", "not_found_message": "Paket tapıla bilmədi.", @@ -901,7 +904,6 @@ }, "team": { "title": "Komanda", - "governance": "İdarəetmə", "role_steward": "idarəçi", "role_maintainer": "dəstəkçi", "sponsor": "sponsor", @@ -911,8 +913,7 @@ "title": "Əməkdaşlar", "description": "npmx tam açıq mənbəlidir, möhtəşəm əməkdaşlar icması tərəfindən hazırlanır. Bizə qoşulun və həmişə istədiyimiz npm baxış təcrübəsini birlikdə quraq.", "loading": "Əməkdaşlar yüklənir...", - "error": "Əməkdaşlar yüklənə bilmədi", - "view_profile": "{name} GitHub profilinə bax" + "error": "Əməkdaşlar yüklənə bilmədi" }, "get_involved": { "title": "Qatılın", diff --git a/i18n/locales/bg-BG.json b/i18n/locales/bg-BG.json index 78719069c..2590a2e82 100644 --- a/i18n/locales/bg-BG.json +++ b/i18n/locales/bg-BG.json @@ -122,6 +122,7 @@ "edit_on_github": "Редактиране в GitHub", "view_guide": "Ръководство за превод" }, + "error": {}, "common": { "loading": "Зареждане...", "loading_more": "Зареждане на още...", @@ -892,7 +893,6 @@ }, "team": { "title": "Отбор", - "governance": "Управление", "role_steward": "управител", "role_maintainer": "поддържащ", "sponsor": "спонсор", @@ -902,8 +902,7 @@ "title": "... и {count} сътрудник повече | ... и {count} сътрудници повече", "description": "npmx е изцяло с отворен код, изграден от невероятна общност от сътрудници. Присъединете се към нас и нека изградим npm браузър изживяването, което винаги сме искали, заедно.", "loading": "Зареждане на сътрудници...", - "error": "Неуспешно зареждане на сътрудници", - "view_profile": "Преглед на GitHub профила на {name}" + "error": "Неуспешно зареждане на сътрудници" }, "get_involved": { "title": "Включете се", diff --git a/i18n/locales/bn-IN.json b/i18n/locales/bn-IN.json index 479c3f7b0..b9744f11c 100644 --- a/i18n/locales/bn-IN.json +++ b/i18n/locales/bn-IN.json @@ -109,6 +109,9 @@ }, "scroll_to_top": "উপরে স্ক্রল করুন" }, + "profile": { + "invite": {} + }, "package": { "not_found": "প্যাকেজ পাওয়া যায়নি", "not_found_message": "প্যাকেজ পাওয়া যায়নি।", @@ -123,6 +126,7 @@ "version": "এই ভার্সনটি নিষ্ক্রিয় করা হয়েছে।", "no_reason": "কোনো কারণ দেওয়া হয়নি" }, + "size_increase": {}, "replacement": { "title": "আপনার এই ডিপেনডেন্সির প্রয়োজন নাও হতে পারে।", "native": "এটিকে {replacement} দিয়ে প্রতিস্থাপন করা যেতে পারে, যা Node {nodeVersion} থেকে উপলব্ধ।", @@ -219,7 +223,8 @@ "more_tagged": "{count}টি আরো ট্যাগ করা", "all_covered": "সব ভার্সন উপরের ট্যাগ দ্বারা আবৃত", "deprecated_title": "{version} (নিষ্ক্রিয়)", - "view_all": "{count}টি ভার্সন দেখুন | সব {count}টি ভার্সন দেখুন" + "view_all": "{count}টি ভার্সন দেখুন | সব {count}টি ভার্সন দেখুন", + "copy_alt": {} }, "dependencies": { "title": "নির্ভরতা ({count})", @@ -268,7 +273,8 @@ "date_range_multiline": "{start}\nথেকে {end}", "download_file": "{fileType} ডাউনলোড করুন", "toggle_annotator": "অ্যানোটেটর টগল করুন", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "সাপ্তাহিক ডাউনলোড" @@ -697,13 +703,14 @@ "managers": "ম্যানেজার" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "অবদানকারী", "description": "npmx সম্পূর্ণ ওপেন সোর্স, অসাধারণ অবদানকারীদের কমিউনিটি দ্বারা নির্মিত। আমাদের সাথে যোগ দিন এবং একসাথে আমাদের সবসময় চাওয়া npm ব্রাউজিং অভিজ্ঞতা তৈরি করি।", "loading": "অবদানকারী লোড হচ্ছে...", - "error": "অবদানকারী লোড করতে ব্যর্থ", - "view_profile": "{name}-এর GitHub প্রোফাইল দেখুন" + "error": "অবদানকারী লোড করতে ব্যর্থ" }, "get_involved": { "title": "যোগ দিন", @@ -828,7 +835,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/cs-CZ.json b/i18n/locales/cs-CZ.json index 41791d087..c8dc22b97 100644 --- a/i18n/locales/cs-CZ.json +++ b/i18n/locales/cs-CZ.json @@ -209,6 +209,9 @@ "compose_text": "Ahoj {'@'}{handle}! Viděl jsi už npmx.dev? Je to prohlížeč pro npm registr, který je rychlý, moderní a open-source.\nhttps://npmx.dev" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "Balíček nenalezen", "not_found_message": "Balíček nebyl nalezen.", @@ -936,7 +939,6 @@ }, "team": { "title": "Tým", - "governance": "Správa", "role_steward": "Vedoucí", "role_maintainer": "Správce", "sponsor": "Sponzor", @@ -946,8 +948,7 @@ "title": "Přispěvatelé | {count} přispěvatelé | {count} přispěvatelů", "description": "npmx je plně open source, postavený úžasnou komunitou přispěvatelů. Přidejte se k nám a společně vytvořme npm prohlížeč, jaký jsme vždy chtěli.", "loading": "Načítání přispěvatelů...", - "error": "Nepodařilo se načíst přispěvatele", - "view_profile": "Zobrazit GitHub profil uživatele {name}" + "error": "Nepodařilo se načíst přispěvatele" }, "get_involved": { "title": "Zapojte se", diff --git a/i18n/locales/de-DE.json b/i18n/locales/de-DE.json index 0dc56065c..de3343e96 100644 --- a/i18n/locales/de-DE.json +++ b/i18n/locales/de-DE.json @@ -132,6 +132,7 @@ "edit_on_github": "Auf GitHub bearbeiten", "view_guide": "Übersetzungsleitfaden" }, + "error": {}, "common": { "loading": "Lädt...", "loading_more": "Lädt mehr...", @@ -209,6 +210,9 @@ "more_replies": "{count} weitere Antwort anzeigen | {count} weitere Antworten anzeigen" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "Paket nicht gefunden", "not_found_message": "Das Paket konnte nicht gefunden werden.", @@ -936,7 +940,6 @@ }, "team": { "title": "Team", - "governance": "Verwaltung", "role_steward": "Verwalter", "role_maintainer": "Maintainer", "sponsor": "Sponsor", @@ -946,8 +949,7 @@ "title": "... und {count} weiterer Mitwirkender | ... und {count} weitere Mitwirkende", "description": "npmx ist komplett Open Source und wird von einer großartigen Community von Mitwirkenden entwickelt. Mach mit und lass uns gemeinsam das npm-Browsing-Erlebnis gestalten, das wir uns schon immer gewünscht haben.", "loading": "Mitwirkende werden geladen...", - "error": "Mitwirkende konnten nicht geladen werden", - "view_profile": "GitHub-Profil von {name} anzeigen" + "error": "Mitwirkende konnten nicht geladen werden" }, "get_involved": { "title": "Mitmachen", diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 5bc57ea17..afa54a1a5 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -936,18 +936,22 @@ }, "team": { "title": "Team", - "governance": "Governance", "role_steward": "steward", "role_maintainer": "maintainer", "sponsor": "sponsor", "sponsor_aria": "Sponsor {name} on GitHub" }, "contributors": { - "title": "... and {count} more contributor | ... and {count} more contributors", + "title": "{count} contributor | {count} contributors", "description": "npmx is fully open source, built by an amazing community of contributors. Join us and let's build the npm browsing experience we always wanted, together.", "loading": "Loading contributors...", "error": "Failed to load contributors", - "view_profile": "View {name}'s GitHub profile" + "avatar": "{name}'s avatar", + "view_profile_detailed": "View {name}'s GitHub profile{role}{works_at}{location}", + "separator": " — ", + "role": "{separator}{role} at npmx.dev", + "works_at": "{separator}works at {company}", + "location": "{separator}based in {location}" }, "get_involved": { "title": "Get involved", diff --git a/i18n/locales/es.json b/i18n/locales/es.json index 02ed71d17..9e0c09f7a 100644 --- a/i18n/locales/es.json +++ b/i18n/locales/es.json @@ -892,7 +892,6 @@ }, "team": { "title": "Equipo", - "governance": "Gobernanza", "role_steward": "Administrador", "role_maintainer": "Mantenedor", "sponsor": "Patrocinar", @@ -903,7 +902,12 @@ "description": "npmx es completamente de código abierto, construido por una increíble comunidad de colaboradores. Únete a nosotros y construyamos juntos la experiencia de navegación de npm que siempre quisimos.", "loading": "Cargando colaboradores...", "error": "Error al cargar colaboradores", - "view_profile": "Ver perfil de GitHub de {name}" + "avatar": "avatar de {name}", + "view_profile_detailed": "Ver el perfil de GitHub de {name}{role}{works_at}{location}", + "separator": " — ", + "role": "{separator}{role} en npmx.dev", + "works_at": "{separator}trabaja en {company}", + "location": "{separator}ubicado en {location}" }, "get_involved": { "title": "Involúcrate", diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json index bbe2af2f0..6c394d9b9 100644 --- a/i18n/locales/fr-FR.json +++ b/i18n/locales/fr-FR.json @@ -209,6 +209,9 @@ "compose_text": "Salut {'@'}{handle} ! As-tu déjà testé npmx.dev ? C'est un navigateur pour le registre npm : rapide, moderne et open source.\nhttps://npmx.dev" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "Paquet introuvable", "not_found_message": "Le paquet n'a pas pu être trouvé.", @@ -936,7 +939,6 @@ }, "team": { "title": "Équipe", - "governance": "Gouvernance", "role_steward": "pilote", "role_maintainer": "mainteneur", "sponsor": "sponsor", @@ -946,8 +948,7 @@ "title": "Contributeurs", "description": "npmx est entièrement open source, construit par une incroyable communauté de contributeurs. Rejoignez-nous et construisons l'expérience de navigation pour npm dont nous avons toujours rêvés, ensemble.", "loading": "Chargement des contributeurs...", - "error": "Échec du chargement des contributeurs", - "view_profile": "Voir le profil GitHub de {name}" + "error": "Échec du chargement des contributeurs" }, "get_involved": { "title": "Participer", diff --git a/i18n/locales/hi-IN.json b/i18n/locales/hi-IN.json index c7bc09ca4..fe4565755 100644 --- a/i18n/locales/hi-IN.json +++ b/i18n/locales/hi-IN.json @@ -110,6 +110,9 @@ }, "scroll_to_top": "शीर्ष पर स्क्रॉल करें" }, + "profile": { + "invite": {} + }, "package": { "not_found": "पैकेज नहीं मिला", "not_found_message": "पैकेज नहीं मिल सका।", @@ -124,6 +127,7 @@ "version": "यह संस्करण डेप्रीकेट कर दिया गया है।", "no_reason": "कोई कारण प्रदान नहीं किया गया" }, + "size_increase": {}, "replacement": { "title": "आपको इस निर्भरता की आवश्यकता नहीं हो सकती।", "native": "इसे {replacement} से बदला जा सकता है, जो Node {nodeVersion} से उपलब्ध है।", @@ -220,7 +224,8 @@ "more_tagged": "{count} और टैग किए गए", "all_covered": "सभी संस्करण ऊपर के टैग्स द्वारा कवर किए गए हैं", "deprecated_title": "{version} (डेप्रीकेटेड)", - "view_all": "{count} संस्करण देखें | सभी {count} संस्करण देखें" + "view_all": "{count} संस्करण देखें | सभी {count} संस्करण देखें", + "copy_alt": {} }, "dependencies": { "title": "निर्भरताएँ ({count})", @@ -269,7 +274,8 @@ "date_range_multiline": "{start}\nसे {end}", "download_file": "{fileType} डाउनलोड करें", "toggle_annotator": "एनोटेटर टॉगल करें", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "साप्ताहिक डाउनलोड्स" @@ -698,13 +704,14 @@ "managers": "मैनेजर" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "योगदानकर्ता", "description": "npmx पूरी तरह से ओपन सोर्स है, जो योगदानकर्ताओं के एक अद्भुत समुदाय द्वारा बनाया गया है। हमसे जुड़ें और आइए एक साथ वह npm ब्राउज़िंग अनुभव बनाएं जो हमेशा से चाहते थे।", "loading": "योगदानकर्ता लोड हो रहे हैं...", - "error": "योगदानकर्ता लोड करने में विफल", - "view_profile": "{name} की GitHub प्रोफ़ाइल देखें" + "error": "योगदानकर्ता लोड करने में विफल" }, "get_involved": { "title": "शामिल हों", @@ -829,7 +836,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/hu-HU.json b/i18n/locales/hu-HU.json index c24450e5f..1cedb2a28 100644 --- a/i18n/locales/hu-HU.json +++ b/i18n/locales/hu-HU.json @@ -122,6 +122,7 @@ "edit_on_github": "Szerkesztés GitHub-on", "view_guide": "Fordítási útmutató" }, + "error": {}, "common": { "loading": "Betöltés...", "loading_more": "Továbbiak betöltése...", @@ -892,7 +893,6 @@ }, "team": { "title": "Csapat", - "governance": "Irányítás", "role_steward": "gondnok", "role_maintainer": "karbantartó", "sponsor": "szponzor", @@ -902,8 +902,7 @@ "title": "... és {count} további közreműködő | ... és {count} további közreműködő", "description": "Az npmx teljes mértékben nyílt forráskódú, egy csodálatos közreműködői közösség által. Csatlakozz hozzánk, és építsük fel együtt azt az npm böngészési élményt, amire mindig is vágytunk.", "loading": "Közreműködők betöltése...", - "error": "Nem sikerült betölteni a közreműködőket", - "view_profile": "{name} GitHub profiljának megtekintése" + "error": "Nem sikerült betölteni a közreműködőket" }, "get_involved": { "title": "Vegyél részt", diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json index bed349446..b5f4bd114 100644 --- a/i18n/locales/id-ID.json +++ b/i18n/locales/id-ID.json @@ -146,6 +146,9 @@ }, "scroll_to_top": "Kembali ke atas" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Paket Tidak Ditemukan", "not_found_message": "Paket tidak dapat ditemukan.", @@ -870,7 +873,6 @@ }, "team": { "title": "Tim", - "governance": "Tata Kelola", "role_steward": "pengurus", "role_maintainer": "pemelihara", "sponsor": "sponsor", @@ -880,8 +882,7 @@ "title": "Kontributor", "description": "npmx sepenuhnya sumber terbuka (open source), dibangun oleh komunitas kontributor yang luar biasa. Bergabunglah dengan kami dan mari bangun pengalaman menjelajah npm yang selalu kita inginkan, bersama-sama.", "loading": "Memuat kontributor...", - "error": "Gagal memuat kontributor", - "view_profile": "Lihat profil GitHub {name}" + "error": "Gagal memuat kontributor" }, "get_involved": { "title": "Ikut terlibat", diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json index 76506bb84..98aa20cbc 100644 --- a/i18n/locales/it-IT.json +++ b/i18n/locales/it-IT.json @@ -142,6 +142,9 @@ }, "scroll_to_top": "Torna su" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Pacchetto Non Trovato", "not_found_message": "Impossibile trovare il pacchetto.", @@ -229,9 +232,9 @@ "title": "Inizia", "pm_label": "Gestore di pacchetti", "copy_command": "Copia comando di installazione", - "view_types": "Vedi {package}", "copy_dev_command": "Copia comando di installazione dev", - "dev_dependency_hint": "Di solito installato come dev dependency" + "dev_dependency_hint": "Di solito installato come dev dependency", + "view_types": "Vedi {package}" }, "create": { "title": "Crea nuovo progetto", @@ -298,7 +301,8 @@ "more_tagged": "{count} altri taggati", "all_covered": "Tutte le versioni sono coperte dai tag sopra", "deprecated_title": "{version} (deprecato)", - "view_all": "Visualizza {count} versione | Visualizza tutte le {count} versioni" + "view_all": "Visualizza {count} versione | Visualizza tutte le {count} versioni", + "copy_alt": {} }, "dependencies": { "title": "Dipendenza ({count}) | Dipendenze ({count})", @@ -352,7 +356,8 @@ "y_axis_label": "{granularity} {facet}", "items": { "downloads": "Download" - } + }, + "copy_alt": {} }, "downloads": { "title": "Download settimanali", @@ -795,13 +800,14 @@ "managers": "gestori di pacchetti" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "{count} Collaboratore | {count} Collaboratori", "description": "npmx è completamente open source, costruito da una straordinaria comunità di collaboratori. Unisciti a noi e costruiamo insieme l'esperienza di navigazione npm che abbiamo sempre voluto.", "loading": "Caricamento collaboratori...", - "error": "Impossibile caricare i collaboratori", - "view_profile": "Visualizza il profilo GitHub di {name}" + "error": "Impossibile caricare i collaboratori" }, "get_involved": { "title": "Partecipa", @@ -985,7 +991,9 @@ "up_to_you": "A tua scelta!" }, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "title": "Informativa sulla privacy", diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json index 46d417b76..04958a67e 100644 --- a/i18n/locales/ja-JP.json +++ b/i18n/locales/ja-JP.json @@ -209,6 +209,9 @@ "compose_text": "{'@'}{handle} さん、npmx.devはもうチェックしましたか? 高速でモダンなオープンソースのnpmレジストリブラウザです。\nhttps://npmx.dev" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "パッケージが見つかりません", "not_found_message": "パッケージが見つかりませんでした。", @@ -936,7 +939,6 @@ }, "team": { "title": "チーム", - "governance": "ガバナンス", "role_steward": "スチュワード", "role_maintainer": "メンテナ", "sponsor": "スポンサー", @@ -946,8 +948,7 @@ "title": "コントリビューター", "description": "npmxは完全にオープンソースです。素晴らしいコントリビューターのコミュニティにより開発されています。", "loading": "コントリビューターを読み込み中...", - "error": "コントリビューターの読み込みに失敗しました", - "view_profile": "{name} のGitHubプロフィールを表示" + "error": "コントリビューターの読み込みに失敗しました" }, "get_involved": { "title": "参加するには", diff --git a/i18n/locales/kn-IN.json b/i18n/locales/kn-IN.json index 6a1cee3f2..2a482dfc8 100644 --- a/i18n/locales/kn-IN.json +++ b/i18n/locales/kn-IN.json @@ -110,6 +110,9 @@ }, "scroll_to_top": "ಮೇಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ" }, + "profile": { + "invite": {} + }, "package": { "not_found": "ಪ್ಯಾಕೇಜ್ ಕಂಡುಬಂದಿಲ್ಲ", "not_found_message": "ಪ್ಯಾಕೇಜ್ ಕಂಡುಬಂದಿಲ್ಲ.", @@ -124,6 +127,7 @@ "version": "ಈ ಆವೃತ್ತಿ ಅಮಾನ್ಯಗೊಳಿಸಲಾಗಿದೆ.", "no_reason": "ಕಾರಣ ನೀಡಲಾಗಿಲ್ಲ" }, + "size_increase": {}, "replacement": { "title": "ನಿಮಗೆ ಈ ಅವಲಂಬನೆ ಅಗತ್ಯವಿಲ್ಲದಿರಬಹುದು.", "native": "ಇದನ್ನು {replacement} ಮೂಲಕ ಬದಲಾಯಿಸಬಹುದು, ಇದು Node {nodeVersion} ರಿಂದ ಲಭ್ಯವಿದೆ.", @@ -220,7 +224,8 @@ "more_tagged": "{count} ಇನ್ನಷ್ಟು ಟ್ಯಾಗ್ ಮಾಡಲಾಗಿದೆ", "all_covered": "ಎಲ್ಲಾ ಆವೃತ್ತಿಗಳು ಮೇಲಿನ ಟ್ಯಾಗ್‌ಗಳಿಂದ ಒಳಗೊಂಡಿವೆ", "deprecated_title": "{version} (ಅಮಾನ್ಯಗೊಳಿಸಲಾಗಿದೆ)", - "view_all": "{count} ಆವೃತ್ತಿ ನೋಡಿ | ಎಲ್ಲಾ {count} ಆವೃತ್ತಿಗಳನ್ನು ನೋಡಿ" + "view_all": "{count} ಆವೃತ್ತಿ ನೋಡಿ | ಎಲ್ಲಾ {count} ಆವೃತ್ತಿಗಳನ್ನು ನೋಡಿ", + "copy_alt": {} }, "dependencies": { "title": "ಅವಲಂಬನೆಗಳು ({count})", @@ -269,7 +274,8 @@ "date_range_multiline": "{start}\nರಿಂದ {end}", "download_file": "{fileType} ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", "toggle_annotator": "ಅನೋಟೇಟರ್ ಟಾಗಲ್ ಮಾಡಿ", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "ವಾರದ ಡೌನ್‌ಲೋಡ್‌ಗಳು" @@ -698,13 +704,14 @@ "managers": "ನಿರ್ವಾಹಕರು" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "ಸಹಯೋಗಿಗಳು", "description": "npmx ಸಂಪೂರ್ಣ ಓಪನ್ ಸೋರ್ಸ್ ಆಗಿದ್ದು, ಅದ್ಭುತ ಸಹಯೋಗಿಗಳ ಸಮುದಾಯದಿಂದ ನಿರ್ಮಿಸಲಾಗಿದೆ. ನಮ್ಮೊಂದಿಗೆ ಸೇರಿ ಮತ್ತು ನಾವು ಯಾವಾಗಲೂ ಬಯಸಿದ npm ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಒಟ್ಟಿಗೆ ನಿರ್ಮಿಸೋಣ.", "loading": "ಸಹಯೋಗಿಗಳು ಲೋಡ್ ಆಗುತ್ತಿದ್ದಾರೆ...", - "error": "ಸಹಯೋಗಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ", - "view_profile": "{name} ಅವರ GitHub ಪ್ರೊಫೈಲ್ ನೋಡಿ" + "error": "ಸಹಯೋಗಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ" }, "get_involved": { "title": "ಸೇರಿಕೊಳ್ಳಿ", @@ -829,7 +836,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/nb-NO.json b/i18n/locales/nb-NO.json index 6ed21cfca..4543a331e 100644 --- a/i18n/locales/nb-NO.json +++ b/i18n/locales/nb-NO.json @@ -141,6 +141,9 @@ }, "scroll_to_top": "Rull til toppen" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Pakke ikke funnet", "not_found_message": "Pakken kunne ikke finnes.", @@ -155,6 +158,7 @@ "version": "Denne versjonen er utfaset.", "no_reason": "Ingen årsak oppgitt" }, + "size_increase": {}, "replacement": { "title": "Du trenger kanskje ikke denne avhengigheten.", "native": "Denne kan erstattes med {replacement}, tilgjengelig siden Node {nodeVersion}.", @@ -268,7 +272,8 @@ "more_tagged": "{count} flere tagget", "all_covered": "Alle versjoner dekkes av taggene over", "deprecated_title": "{version} (utfaset)", - "view_all": "Vis {count} versjon | Vis alle {count} versjoner" + "view_all": "Vis {count} versjon | Vis alle {count} versjoner", + "copy_alt": {} }, "dependencies": { "title": "Avhengighet ({count}) | Avhengigheter ({count})", @@ -322,7 +327,8 @@ "y_axis_label": "{granularity} {facet}", "items": { "downloads": "Nedlastinger" - } + }, + "copy_alt": {} }, "downloads": { "title": "Ukentlige nedlastinger", @@ -765,13 +771,14 @@ "managers": "pakkebehandlere" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "{count} Bidragsyter | {count} Bidragsytere", "description": "npmx er fullstendig åpen kildekode, bygget av et fantastisk fellesskap av bidragsytere. Bli med oss og la oss bygge npm-opplevelsen vi alltid har ønsket oss, sammen.", "loading": "Laster bidragsytere...", - "error": "Kunne ikke laste bidragsytere", - "view_profile": "Vis {name}s GitHub-profil" + "error": "Kunne ikke laste bidragsytere" }, "get_involved": { "title": "Bli involvert", @@ -957,7 +964,9 @@ "trends": { "title": "Ukentlige nedlastinger" } - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/ne-NP.json b/i18n/locales/ne-NP.json index 9427484fe..db3ca4a4c 100644 --- a/i18n/locales/ne-NP.json +++ b/i18n/locales/ne-NP.json @@ -110,6 +110,9 @@ }, "scroll_to_top": "माथि स्क्रोल गर्नुहोस्" }, + "profile": { + "invite": {} + }, "package": { "not_found": "प्याकेज फेला परेन", "not_found_message": "प्याकेज फेला पार्न सकिएन।", @@ -124,6 +127,7 @@ "version": "यो संस्करण अप्रचलित (deprecated) गरिएको छ।", "no_reason": "कारण दिइएको छैन" }, + "size_increase": {}, "replacement": { "title": "तपाईंलाई यो डिपेन्डेन्सी आवश्यक नपर्न सक्छ।", "native": "Node {nodeVersion} देखि उपलब्ध {replacement} ले यसलाई प्रतिस्थापन गर्न सक्छ।", @@ -206,7 +210,8 @@ "more_tagged": "{count} थप ट्याग गरिएको", "all_covered": "माथिका ट्यागले सबै संस्करणहरू कभर गर्छन्", "deprecated_title": "{version} (deprecated)", - "view_all": "{count} संस्करण हेर्नुहोस् | सबै {count} संस्करणहरू हेर्नुहोस्" + "view_all": "{count} संस्करण हेर्नुहोस् | सबै {count} संस्करणहरू हेर्नुहोस्", + "copy_alt": {} }, "dependencies": { "title": "डिपेन्डेन्सीहरू ({count})", @@ -255,7 +260,8 @@ "date_range_multiline": "{start}\nदेखि {end}", "download_file": "{fileType} डाउनलोड गर्नुहोस्", "toggle_annotator": "एनोटेटर टगल गर्नुहोस्", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "साप्ताहिक डाउनलोड" @@ -683,13 +689,14 @@ "managers": "म्यानेजरहरू बनाइरहेका छन्" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "कन्ट्रिब्युटरहरू", "description": "npmx पूर्ण रूपमा ओपन सोर्स हो, अद्भुत कन्ट्रिब्युटर समुदायले बनाएको। हामीसँग जोडिनुहोस् र हामीले चाहेको npm ब्राउजिङ अनुभव सँगै बनाऔँ।", "loading": "कन्ट्रिब्युटरहरू लोड हुँदैछन्...", - "error": "कन्ट्रिब्युटरहरू लोड गर्न असफल", - "view_profile": "{name} को GitHub प्रोफाइल हेर्नुहोस्" + "error": "कन्ट्रिब्युटरहरू लोड गर्न असफल" }, "get_involved": { "title": "सहभागी हुनुहोस्", @@ -814,7 +821,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/pl-PL.json b/i18n/locales/pl-PL.json index 048e6fbaf..ab48a0ab8 100644 --- a/i18n/locales/pl-PL.json +++ b/i18n/locales/pl-PL.json @@ -146,6 +146,9 @@ }, "scroll_to_top": "Przewiń na górę" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Nie znaleziono pakietu", "not_found_message": "Nie udało się znaleźć pakietu.", @@ -870,7 +873,6 @@ }, "team": { "title": "Zespół", - "governance": "Zarządzanie", "role_steward": "steward", "role_maintainer": "maintainer", "sponsor": "sponsor", @@ -880,8 +882,7 @@ "title": "Współtwórcy", "description": "npmx jest w pełni open source, tworzony przez niesamowitą społeczność współtwórców. Dołącz do nas — zbudujmy razem przeglądanie npm takie, jakiego zawsze chcieliśmy.", "loading": "Ładowanie współtwórców...", - "error": "Nie udało się wczytać współtwórców", - "view_profile": "Zobacz profil GitHub użytkownika {name}" + "error": "Nie udało się wczytać współtwórców" }, "get_involved": { "title": "Zaangażuj się", diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json index 0d008131e..875e2a7c0 100644 --- a/i18n/locales/pt-BR.json +++ b/i18n/locales/pt-BR.json @@ -111,6 +111,9 @@ }, "scroll_to_top": "Rolar para o topo" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Pacote não encontrado", "not_found_message": "O pacote não pôde ser encontrado.", @@ -125,6 +128,7 @@ "version": "Esta versão foi descontinuada.", "no_reason": "Nenhum motivo fornecido" }, + "size_increase": {}, "replacement": { "title": "Você pode não precisar desta dependência.", "native": "Isso pode ser substituído por {replacement}, disponível desde Node {nodeVersion}.", @@ -221,7 +225,8 @@ "more_tagged": "{count} mais marcadas", "all_covered": "Todas as versões estão cobertas pelas tags acima", "deprecated_title": "{version} (descontinuada)", - "view_all": "Ver {count} versão | Ver todas as {count} versões" + "view_all": "Ver {count} versão | Ver todas as {count} versões", + "copy_alt": {} }, "dependencies": { "title": "Dependências ({count})", @@ -270,7 +275,8 @@ "date_range_multiline": "{start}\npara {end}", "download_file": "Baixar {fileType}", "toggle_annotator": "Alternar anotador", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "Downloads Semanais" @@ -699,13 +705,14 @@ "managers": "gerenciadores de pacotes" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "Contribuidores", "description": "npmx é totalmente de código aberto, construído por uma comunidade incrível de contribuidores. Junte-se a nós e vamos construir juntos a experiência de navegação npm que sempre quisemos.", "loading": "Carregando contribuidores...", - "error": "Falha ao carregar contribuidores", - "view_profile": "Ver perfil do GitHub de {name}" + "error": "Falha ao carregar contribuidores" }, "get_involved": { "title": "Envolva-se", @@ -830,7 +837,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json index ee400df62..c774dd90e 100644 --- a/i18n/locales/ru-RU.json +++ b/i18n/locales/ru-RU.json @@ -142,6 +142,9 @@ }, "scroll_to_top": "Прокрутить наверх" }, + "profile": { + "invite": {} + }, "package": { "not_found": "Пакет не найден", "not_found_message": "Пакет не удалось найти.", @@ -865,7 +868,6 @@ }, "team": { "title": "Команда", - "governance": "Управление", "role_steward": "управляющий", "role_maintainer": "мейнтейнер", "sponsor": "спонсировать", @@ -875,8 +877,7 @@ "title": "Контрибьюторы", "description": "npmx полностью открыт, он создан потрясающим сообществом контрибьюторов. Присоединяйтесь, и давайте вместе создадим опыт просмотра npm, о котором мы всегда мечтали.", "loading": "Загрузка контрибьюторов...", - "error": "Не удалось загрузить контрибьюторов", - "view_profile": "Посмотреть профиль {name} на GitHub" + "error": "Не удалось загрузить контрибьюторов" }, "get_involved": { "title": "Присоединяйтесь", diff --git a/i18n/locales/ta-IN.json b/i18n/locales/ta-IN.json index d0a0babf2..d139d0d20 100644 --- a/i18n/locales/ta-IN.json +++ b/i18n/locales/ta-IN.json @@ -141,6 +141,9 @@ }, "scroll_to_top": "மேலே செல்" }, + "profile": { + "invite": {} + }, "package": { "not_found": "தொகுப்பு கிடைக்கவில்லை", "not_found_message": "தொகுப்பைக் கண்டுபிடிக்க இயலவில்லை.", @@ -155,6 +158,7 @@ "version": "இந்தப் பதிப்பு நிறுத்தப்பட்டது.", "no_reason": "காரணம் வழங்கப்படவில்லை" }, + "size_increase": {}, "replacement": { "title": "இந்த சார்பு உங்களுக்குத் தேவைப்படாமல் இருக்கலாம்.", "native": "இதை {replacement} மூலம் மாற்றலாம், Node {nodeVersion} முதல் கிடைக்கிறது.", @@ -287,7 +291,8 @@ "more_tagged": "{count} மேலும் குறியிடப்பட்டவை", "all_covered": "அனைத்து பதிப்புகளும் மேலே உள்ள குறிச்சொற்களால் உள்ளடக்கப்பட்டுள்ளன", "deprecated_title": "{version} (நிறுத்தப்பட்டது)", - "view_all": "{count} பதிப்பைக் காண்க | அனைத்து {count} பதிப்புகளையும் காண்க" + "view_all": "{count} பதிப்பைக் காண்க | அனைத்து {count} பதிப்புகளையும் காண்க", + "copy_alt": {} }, "dependencies": { "title": "சார்பு ({count}) | சார்புகள் ({count})", @@ -341,7 +346,8 @@ "y_axis_label": "{granularity} {facet}", "items": { "downloads": "பதிவிறக்கங்கள்" - } + }, + "copy_alt": {} }, "downloads": { "title": "வாராந்திர பதிவிறக்கங்கள்", @@ -785,13 +791,14 @@ "managers": "மேலாளர்கள்" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "{count} பங்களிப்பாளர் | {count} பங்களிப்பாளர்கள்", "description": "npmx முழுமையாக திறந்த மூலமாகும், அற்புதமான பங்களிப்பாளர்கள் சமூகத்தால் உருவாக்கப்பட்டது. எங்களுடன் சேர்ந்து நாம் எப்போதும் விரும்பிய npm உலாவல் அனுபவத்தை ஒன்றாகக் கட்டமைப்போம்.", "loading": "பங்களிப்பாளர்களை ஏற்றுகிறது...", - "error": "பங்களிப்பாளர்களை ஏற்ற இயலவில்லை", - "view_profile": "{name}-இன் GitHub சுயவிவரத்தைக் காண்க" + "error": "பங்களிப்பாளர்களை ஏற்ற இயலவில்லை" }, "get_involved": { "title": "பங்கேற்கவும்", @@ -977,7 +984,9 @@ "trends": { "title": "வாராந்திர பதிவிறக்கங்கள்" } - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "title": "தனியுரிமைக் கொள்கை", diff --git a/i18n/locales/te-IN.json b/i18n/locales/te-IN.json index 6afb9aff7..b68ee7639 100644 --- a/i18n/locales/te-IN.json +++ b/i18n/locales/te-IN.json @@ -110,6 +110,9 @@ }, "scroll_to_top": "పైకి స్క్రోల్ చేయండి" }, + "profile": { + "invite": {} + }, "package": { "not_found": "ప్యాకేజ్ కనుగొనబడలేదు", "not_found_message": "ప్యాకేజ్ కనుగొనబడలేదు.", @@ -124,6 +127,7 @@ "version": "ఈ వెర్షన్ డిప్రికేట్ చేయబడింది.", "no_reason": "కారణం అందించబడలేదు" }, + "size_increase": {}, "replacement": { "title": "మీకు ఈ డిపెండెన్సీ అవసరం లేకపోవచ్చు.", "native": "దీనిని {replacement} తో భర్తీ చేయవచ్చు, ఇది Node {nodeVersion} నుండి అందుబాటులో ఉంది.", @@ -220,7 +224,8 @@ "more_tagged": "{count} మరిన్ని ట్యాగ్ చేయబడ్డాయి", "all_covered": "అన్ని వెర్షన్‌లు పైన ఉన్న ట్యాగ్‌ల ద్వారా కవర్ చేయబడ్డాయి", "deprecated_title": "{version} (డిప్రికేటెడ్)", - "view_all": "{count} వెర్షన్‌లను వీక్షించండి | అన్ని {count} వెర్షన్‌లను వీక్షించండి" + "view_all": "{count} వెర్షన్‌లను వీక్షించండి | అన్ని {count} వెర్షన్‌లను వీక్షించండి", + "copy_alt": {} }, "dependencies": { "title": "డిపెండెన్సీలు ({count})", @@ -269,7 +274,8 @@ "date_range_multiline": "{start}\nనుండి {end}", "download_file": "{fileType} డౌన్‌లోడ్ చేయండి", "toggle_annotator": "అనోటేటర్‌ను టాగుల్ చేయండి", - "items": {} + "items": {}, + "copy_alt": {} }, "downloads": { "title": "వారపు డౌన్‌లోడ్‌లు" @@ -698,13 +704,14 @@ "managers": "మేనేజర్‌లు" } }, + "sponsors": {}, + "oss_partners": {}, "team": {}, "contributors": { "title": "కంట్రిబ్యూటర్‌లు", "description": "npmx పూర్తిగా ఓపెన్ సోర్స్, అద్భుతమైన కంట్రిబ్యూటర్‌ల కమ్యూనిటీ ద్వారా నిర్మించబడింది. మాతో చేరండి మరియు మేము ఎప్పుడూ కోరుకున్న npm బ్రౌజింగ్ అనుభవాన్ని కలిసి సృష్టిద్దాం.", "loading": "కంట్రిబ్యూటర్‌లు లోడ్ అవుతున్నారు...", - "error": "కంట్రిబ్యూటర్‌లను లోడ్ చేయడంలో విఫలమైంది", - "view_profile": "{name} యొక్క GitHub ప్రొఫైల్‌ను వీక్షించండి" + "error": "కంట్రిబ్యూటర్‌లను లోడ్ చేయడంలో విఫలమైంది" }, "get_involved": { "title": "చేరండి", @@ -829,7 +836,9 @@ }, "values": {}, "trends": {} - } + }, + "file_filter_option": {}, + "filter": {} }, "privacy_policy": { "cookies": { diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json index 81246c99d..e0230ff8f 100644 --- a/i18n/locales/tr-TR.json +++ b/i18n/locales/tr-TR.json @@ -73,6 +73,18 @@ "instant_search_turn_off": "kapat", "instant_search_advisory": "{label} {state} — {action}" }, + "nav": { + "main_navigation": "Ana", + "popular_packages": "Popüler paketler", + "settings": "ayarlar", + "compare": "karşılaştır", + "back": "geri", + "menu": "Menü", + "mobile_menu": "Navigasyon menüsü", + "open_menu": "Menüyü aç", + "links": "Bağlantılar", + "tap_to_search": "Aramak için dokunun" + }, "blog": { "title": "Blog", "heading": "blog", @@ -98,18 +110,6 @@ "more_replies": "{count} yanıt daha..." } }, - "nav": { - "main_navigation": "Ana", - "popular_packages": "Popüler paketler", - "settings": "ayarlar", - "compare": "karşılaştır", - "back": "geri", - "menu": "Menü", - "mobile_menu": "Navigasyon menüsü", - "open_menu": "Menüyü aç", - "links": "Bağlantılar", - "tap_to_search": "Aramak için dokunun" - }, "settings": { "title": "ayarlar", "tagline": "npmx deneyiminizi kişiselleştirin", @@ -936,7 +936,6 @@ }, "team": { "title": "Ekip", - "governance": "Yönetişim", "role_steward": "Yönetici", "role_maintainer": "Geliştirici", "sponsor": "Sponsor", @@ -946,8 +945,7 @@ "title": "Katkıda Bulunanlar", "description": "npmx'i harika yapan tüm katkıda bulunanlara teşekkürler", "loading": "Katkıda bulunanlar yükleniyor...", - "error": "Katkıda bulunanlar yüklenemedi", - "view_profile": "Profili görüntüle" + "error": "Katkıda bulunanlar yüklenemedi" }, "get_involved": { "title": "Katılın", @@ -961,15 +959,15 @@ "description": "Discord'da topluluğa katılın", "cta": "Discord'a katıl" }, - "follow": { - "title": "Takip edin", - "description": "Güncellemeler için bizi takip edin", - "cta": "Bluesky'da takip et" - }, "builders": { "title": "Yapımcılar", "description": "Yapımcı topluluğumuza katılın ve npmx'in geleceğini şekillendirin", "cta": "Yapımcı sohbetine katıl" + }, + "follow": { + "title": "Takip edin", + "description": "Güncellemeler için bizi takip edin", + "cta": "Bluesky'da takip et" } } }, @@ -1022,7 +1020,6 @@ } }, "compare": { - "compare_versions_title": "Sürümleri karşılaştır", "packages": { "title": "Paketleri Karşılaştır", "tagline": "npm paketlerini yan yana karşılaştırın", @@ -1147,6 +1144,7 @@ "lines_hidden": "{count} satır gizlendi", "file_too_large": "Dosya çok büyük", "file_size_warning": "Dosya boyutu {size}", + "compare_versions_title": "Sürümleri karşılaştır", "summary": "Özet", "deps_count": "{count} bağımlılık", "dependencies": "Bağımlılıklar", diff --git a/i18n/locales/uk-UA.json b/i18n/locales/uk-UA.json index 796e41846..0f01837b4 100644 --- a/i18n/locales/uk-UA.json +++ b/i18n/locales/uk-UA.json @@ -209,6 +209,9 @@ "compose_text": "Привіт, {'@'}{handle}! Ти вже перевірив npmx.dev? Це швидкий сучасний браузер для реєстру npm з відкритим кодом.\nhttps://npmx.dev" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "Пакет не знайдено", "not_found_message": "Пакет не вдалося знайти.", @@ -936,7 +939,6 @@ }, "team": { "title": "Команда", - "governance": "Управління", "role_steward": "стюард", "role_maintainer": "супроводжувач", "sponsor": "спонсор", @@ -946,8 +948,7 @@ "title": "... та ще {count} учасник | ... та ще {count} учасників", "description": "npmx має повністю відкритий код, створений дивовижною спільнотою учасників. Приєднуйтеся до нас і давайте разом створювати досвід перегляду npm, який ми завжди хотіли мати.", "loading": "Завантаження учасників...", - "error": "Не вдалося завантажити учасників", - "view_profile": "Переглянути профіль {name} на GitHub" + "error": "Не вдалося завантажити учасників" }, "get_involved": { "title": "Долучитися", diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json index ee7d0a379..2a6bfb9d1 100644 --- a/i18n/locales/zh-CN.json +++ b/i18n/locales/zh-CN.json @@ -209,6 +209,9 @@ "compose_text": "嗨 {'@'}{handle}!您用过 npmx.dev 吗?它是一个快速、现代且开源的 npm registry 浏览器。\nhttps://npmx.dev" } }, + "profile": { + "invite": {} + }, "package": { "not_found": "未找到包", "not_found_message": "找不到此包。", @@ -936,7 +939,6 @@ }, "team": { "title": "团队", - "governance": "治理", "role_steward": "管理者", "role_maintainer": "维护者", "sponsor": "赞助", @@ -946,8 +948,7 @@ "title": "{count} 位贡献者", "description": "npmx 是完全开源的,由令人惊叹的社区贡献者们共同构建。", "loading": "正在加载贡献者…", - "error": "无法加载贡献者", - "view_profile": "查看 {name} 的 GitHub 个人资料" + "error": "无法加载贡献者" }, "get_involved": { "title": "加入我们", diff --git a/i18n/locales/zh-TW.json b/i18n/locales/zh-TW.json index bf648cc7e..2417812ba 100644 --- a/i18n/locales/zh-TW.json +++ b/i18n/locales/zh-TW.json @@ -891,7 +891,6 @@ }, "team": { "title": "團隊", - "governance": "治理", "role_steward": "管理者", "role_maintainer": "維護者", "sponsor": "贊助", @@ -901,8 +900,7 @@ "title": "{count} 位貢獻者", "description": "npmx 完全開源,由令人驚豔的社群貢獻者共同建立。", "loading": "正在載入貢獻者…", - "error": "無法載入貢獻者", - "view_profile": "檢視 {name} 的 GitHub 個人檔案" + "error": "無法載入貢獻者" }, "get_involved": { "title": "加入我們", diff --git a/i18n/schema.json b/i18n/schema.json index 4ed08a60b..df98edf3c 100644 --- a/i18n/schema.json +++ b/i18n/schema.json @@ -2812,9 +2812,6 @@ "title": { "type": "string" }, - "governance": { - "type": "string" - }, "role_steward": { "type": "string" }, @@ -2845,7 +2842,22 @@ "error": { "type": "string" }, - "view_profile": { + "avatar": { + "type": "string" + }, + "view_profile_detailed": { + "type": "string" + }, + "separator": { + "type": "string" + }, + "role": { + "type": "string" + }, + "works_at": { + "type": "string" + }, + "location": { "type": "string" } }, diff --git a/server/api/contributors.get.ts b/server/api/contributors.get.ts index 639350d35..42d81175e 100644 --- a/server/api/contributors.get.ts +++ b/server/api/contributors.get.ts @@ -1,6 +1,20 @@ +import sanitize from 'sanitize-html' + export type Role = 'steward' | 'maintainer' | 'contributor' -export interface GitHubContributor { +export interface GitHubUserData { + name: string | null + bio: string | null + company: string | null + companyHTML: string | null + location: string | null + websiteUrl: string | null + twitterUsername: string | null + blueskyHandle: string | null + mastodonUrl: string | null +} + +export interface GitHubContributor extends GitHubUserData { login: string id: number avatar_url: string @@ -10,11 +24,45 @@ export interface GitHubContributor { sponsors_url: string | null } -type GitHubAPIContributor = Omit +/** + * Raw data coming from the GitHub REST API (/contributors). + * We exclude 'role', 'sponsors_url' AND all fields that only exist in GraphQL. + */ +type GitHubAPIContributor = Omit // Fallback when no GitHub token is available (e.g. preview environments). // Only stewards are shown as maintainers; everyone else is a contributor. -const FALLBACK_STEWARDS = new Set(['danielroe', 'patak-dev']) +const FALLBACK_STEWARDS = new Set(['danielroe', 'patak-cat']) + +const DEFAULT_USER_INFO: GitHubUserData = { + name: null, + bio: null, + company: null, + companyHTML: null, + location: null, + websiteUrl: null, + twitterUsername: null, + blueskyHandle: null, + mastodonUrl: null, +} + +// Configure sanitize-html for GitHub's companyHTML and company fields +const SANITIZE_HTML_OPTIONS: sanitize.IOptions = { + allowedTags: ['a', 'span', 'strong', 'em', 'code'], + allowedAttributes: { + a: ['href', 'target', 'rel'], + }, + transformTags: { + a: (tagName, attribs) => ({ + tagName, + attribs: { + ...attribs, + target: '_blank', + rel: 'noopener noreferrer', + }, + }), + }, +} interface TeamMembers { steward: Set @@ -61,51 +109,127 @@ async function fetchTeamMembers(token: string): Promise { } /** - * Batch-query GitHub GraphQL API to check which users have sponsors enabled. + * Sanitizes GitHub HTML to remove XSS vectors while preserving safe formatting. + * Applies to both rich companyHTML and plain-text company fields. + */ +function sanitizeGitHubHTML(html: string | null): string | null { + if (!html) return null + + const cleaned = sanitize(html.trim(), SANITIZE_HTML_OPTIONS) + return cleaned === '' ? null : cleaned +} + +/** + * Handles "undefined" strings, empty values, or purely whitespace strings. + * Prevents UI issues with empty icons or broken conditional logic. + */ +function cleanString(val: string | null, url = false): string | null { + if (!val || val === 'undefined' || val.trim() === '') return null + val = val.trim() + if (!url) { + return val + } + return val.startsWith('https://') || val.startsWith('http://') ? val : null +} + +/** + * Batch-query GitHub GraphQL API to check which users have sponsors enabled and getting user info. * Returns a Set of logins that have a sponsors listing. */ -async function fetchSponsorable(token: string, logins: string[]): Promise> { +async function fetchGitHubUserData( + token: string, + logins: string[], + usersData: Map, +): Promise> { if (logins.length === 0) return new Set() - // Build aliased GraphQL query: user0: user(login: "x") { hasSponsorsListing login } - const fragments = logins.map( - (login, i) => `user${i}: user(login: "${login}") { hasSponsorsListing login }`, - ) - const query = `{ ${fragments.join('\n')} }` + const sponsorable = new Set() + const chunkSize = 100 - try { - const response = await fetch('https://api.github.com/graphql', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json', - 'User-Agent': 'npmx', - }, - body: JSON.stringify({ query }), - }) + for (let i = 0; i < logins.length; i += chunkSize) { + const chunk = logins.slice(i, i + chunkSize) - if (!response.ok) { - console.warn(`Failed to fetch sponsors info: ${response.status}`) - return new Set() - } + // Build aliased GraphQL query: user0: user(login: "x") { hasSponsorsListing login } + const fragments = chunk.map( + (login, idx) => + `user${idx}: user(login: "${login}") { hasSponsorsListing login name bio company companyHTML location websiteUrl twitterUsername socialAccounts(first: 10) { nodes { provider url } } }`, + ) + const query = `{ ${fragments.join('\n')} }` - const json = (await response.json()) as { - data?: Record - } + try { + const response = await fetch('https://api.github.com/graphql', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json', + 'User-Agent': 'npmx', + }, + body: JSON.stringify({ query }), + }) + + if (!response.ok) { + console.warn(`Failed to fetch sponsors info (chunk ${i}): ${response.status}`) + continue + } + + const json = (await response.json()) as { + data?: Record< + string, + | (GitHubUserData & { + login: string + hasSponsorsListing: boolean + socialAccounts: { nodes: { provider: string; url: string }[] } + }) + | null + > + } + + if (json.data) { + for (const user of Object.values(json.data)) { + if (!user) continue + if (user.hasSponsorsListing) { + sponsorable.add(user.login) + } + + // Extract Bluesky and Mastodon from socialAccounts + let blueskyHandle: string | null = null + let mastodonUrl: string | null = null - const sponsorable = new Set() - if (json.data) { - for (const user of Object.values(json.data)) { - if (user?.hasSponsorsListing) { - sponsorable.add(user.login) + if (user.socialAccounts?.nodes) { + for (const account of user.socialAccounts.nodes) { + if (account.url.includes('bsky.app')) { + // Extract handle from URL: https://bsky.app/profile/handle.bsky.social + const match = account.url.match(/bsky\.app\/profile\/([^/?]+)/) + if (match) { + blueskyHandle = match[1] as string + } + } else if (account.provider === 'MASTODON') { + mastodonUrl = cleanString(account.url, true) + } + } + } + + // --- SERVER-SIDE SANITIZATION AND BATCHING --- + usersData.set(user.login, { + name: cleanString(user.name), + bio: cleanString(user.bio), + company: cleanString(user.company), + // Rich HTML sanitization for company mentions/orgs + companyHTML: sanitizeGitHubHTML(user.companyHTML), + location: cleanString(user.location), + websiteUrl: cleanString(user.websiteUrl, true), + twitterUsername: cleanString(user.twitterUsername), + blueskyHandle, + mastodonUrl, + }) } } + } catch (error) { + console.warn(`Failed to fetch sponsors info (chunk ${i}):`, error) } - return sponsorable - } catch (error) { - console.warn('Failed to fetch sponsors info:', error) - return new Set() } + + return sponsorable } function getRoleInfo(login: string, teams: TeamMembers): { role: Role; order: number } { @@ -167,26 +291,47 @@ export default defineCachedEventHandler( const filtered = allContributors.filter(c => !c.login.includes('[bot]')) - // Identify maintainers (stewards + maintainers) and check their sponsors status - const maintainerLogins = filtered - .filter(c => teams.steward.has(c.login) || teams.maintainer.has(c.login)) - .map(c => c.login) + const userData = new Map() const sponsorable = githubToken - ? await fetchSponsorable(githubToken, maintainerLogins) + ? await fetchGitHubUserData( + githubToken, + filtered.map(c => c.login), + userData, + ) : new Set() return filtered .map(c => { const { role, order } = getRoleInfo(c.login, teams) + const userInfo = userData.get(c.login) ?? DEFAULT_USER_INFO const sponsors_url = sponsorable.has(c.login) ? `https://github.com/sponsors/${c.login}` : null - Object.assign(c, { role, order, sponsors_url }) - return c as GitHubContributor & { order: number; sponsors_url: string | null; role: Role } + + // Construct the final object with only necessary fields + return { + id: c.id, + login: c.login, + name: userInfo.name, + avatar_url: c.avatar_url, + html_url: c.html_url, + role, + bio: userInfo.bio, + company: userInfo.company, + companyHTML: userInfo.companyHTML, + location: userInfo.location, + websiteUrl: userInfo.websiteUrl, + twitterUsername: userInfo.twitterUsername, + blueskyHandle: userInfo.blueskyHandle, + mastodonUrl: userInfo.mastodonUrl, + sponsors_url, + contributions: c.contributions, + order, // kept for sorting, removed in next step + } }) .sort((a, b) => a.order - b.order || b.contributions - a.contributions) - .map(({ order: _, ...rest }) => rest) + .map(({ order: _, ...rest }) => rest) as GitHubContributor[] }, { maxAge: 3600, // Cache for 1 hour