Skip to content

Commit 01c90eb

Browse files
authored
Merge branch 'main' into fix-compare-deps
2 parents 2557997 + f5a7c14 commit 01c90eb

File tree

3 files changed

+226
-44
lines changed

3 files changed

+226
-44
lines changed

config/i18n.ts

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,26 @@ export const countryLocaleVariants: Record<string, (LocaleObjectData & { country
7878
],*/
7979
}
8080

81+
function createPluralRule(locale: string, mapping: Record<string, number>) {
82+
return (choice: number, choicesLength: number) => {
83+
const name = new Intl.PluralRules(locale).select(choice)
84+
const plural = mapping[name] || 0
85+
86+
// In case translation doesn't have all plural forms, use the last available form
87+
if (plural > choicesLength - 1) {
88+
if (import.meta.dev) {
89+
// oxlint-disable-next-line no-console -- warn logging
90+
console.warn(
91+
`Plural form index ${plural} for choice ${choice} exceeds available forms ${choicesLength} for locale ${locale}.`,
92+
)
93+
}
94+
return choicesLength - 1
95+
}
96+
97+
return plural
98+
}
99+
}
100+
81101
const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: string }))[] = [
82102
{
83103
code: 'en',
@@ -89,10 +109,7 @@ const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: str
89109
file: 'ar.json',
90110
name: 'العربية',
91111
dir: 'rtl',
92-
pluralRule: (choice: number) => {
93-
const name = new Intl.PluralRules('ar-EG').select(choice)
94-
return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name]
95-
},
112+
pluralRule: createPluralRule('ar-EG', { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }),
96113
},
97114
{
98115
code: 'az-AZ',
@@ -148,10 +165,7 @@ const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: str
148165
code: 'hu-HU',
149166
file: 'hu-HU.json',
150167
name: 'Magyar',
151-
pluralRule: (choice: number) => {
152-
const name = new Intl.PluralRules('hu-HU').select(choice)
153-
return { zero: 0, one: 0, two: 1, few: 1, many: 1, other: 1 }[name]
154-
},
168+
pluralRule: createPluralRule('hu-HU', { zero: 0, one: 0, two: 1, few: 1, many: 1, other: 1 }),
155169
},
156170
{
157171
code: 'zh-CN',
@@ -197,21 +211,13 @@ const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: str
197211
code: 'ru-RU',
198212
file: 'ru-RU.json',
199213
name: 'Русский',
200-
pluralRule: (choice: number) => {
201-
const name = new Intl.PluralRules('ru-RU').select(choice)
202-
return { zero: 2, one: 0, two: 1, few: 1, many: 2, other: 3 }[name]
203-
},
214+
pluralRule: createPluralRule('ru-RU', { zero: 2, one: 0, two: 1, few: 1, many: 2, other: 3 }),
204215
},
205216
{
206217
code: 'uk-UA',
207218
file: 'uk-UA.json',
208219
name: 'Українська',
209-
pluralRule: (choice: number) => {
210-
if (choice === 0) return 0
211-
212-
const name = new Intl.PluralRules('uk-UA').select(choice)
213-
return { zero: 0, one: 1, two: 0, few: 2, many: 3, other: 4 }[name]
214-
},
220+
pluralRule: createPluralRule('uk-UA', { zero: 0, one: 1, two: 0, few: 2, many: 3, other: 4 }),
215221
},
216222
/*{
217223
code: 'ru-RU',
@@ -226,10 +232,7 @@ const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: str
226232
code: 'cs-CZ',
227233
file: 'cs-CZ.json',
228234
name: 'Čeština',
229-
pluralRule: (choice: number) => {
230-
const name = new Intl.PluralRules('cs-CZ').select(choice)
231-
return { zero: 2, one: 0, two: 1, few: 1, many: 2, other: 2 }[name]
232-
},
235+
pluralRule: createPluralRule('cs-CZ', { zero: 2, one: 0, two: 1, few: 1, many: 2, other: 2 }),
233236
} /*
234237
{
235238
code: 'pl-PL',
@@ -287,12 +290,7 @@ const locales: (LocaleObjectData | (Omit<LocaleObjectData, 'code'> & { code: str
287290
code: 'pl-PL',
288291
file: 'pl-PL.json',
289292
name: 'Polski',
290-
pluralRule: (choice: number) => {
291-
if (choice === 0) return 0
292-
293-
const name = new Intl.PluralRules('pl-PL').select(choice)
294-
return { zero: 0, one: 1, two: 0, few: 2, many: 3, other: 4 }[name]
295-
},
293+
pluralRule: createPluralRule('pl-PL', { zero: 0, one: 1, two: 0, few: 2, many: 3, other: 4 }),
296294
},
297295
{
298296
code: 'pt-BR',

i18n/locales/fr-FR.json

Lines changed: 100 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
"chat": "espace de discussion"
2020
},
2121
"search": {
22-
"title": "Recherche",
2322
"label": "Rechercher des paquets npm",
2423
"placeholder": "rechercher des paquets...",
2524
"button": "rechercher",
@@ -28,6 +27,7 @@
2827
"found_packages": "{count} paquets trouvés",
2928
"updating": "(mise à jour...)",
3029
"no_results": "Aucun paquet trouvé pour « {query} »",
30+
"title": "Recherche",
3131
"not_taken": "{name} n'est pas pris",
3232
"claim_prompt": "Réserver ce nom de paquet sur npm",
3333
"claim_button": "Réserver « {name} »",
@@ -45,8 +45,8 @@
4545
"main_navigation": "Barre de navigation",
4646
"popular_packages": "Paquets populaires",
4747
"search": "recherche",
48-
"compare": "comparer",
4948
"settings": "paramètres",
49+
"compare": "comparer",
5050
"back": "Retour",
5151
"menu": "Menu",
5252
"mobile_menu": "Menu de navigation",
@@ -77,7 +77,8 @@
7777
"help_translate": "Aidez à traduire npmx",
7878
"accent_colors": "Couleurs d'accentuation",
7979
"clear_accent": "Supprimer la couleur d'accentuation",
80-
"translation_progress": "Progression de la traduction"
80+
"translation_progress": "Progression de la traduction",
81+
"background_themes": "Teinte de fond"
8182
},
8283
"i18n": {
8384
"missing_keys": "{count} traduction manquante | {count} traductions manquantes",
@@ -144,6 +145,7 @@
144145
"vulns": "Vulnérabilités",
145146
"published": "Publié",
146147
"published_tooltip": "Date de publication de {package}{'@'}{version}",
148+
"skills": "Compétences de l'agent",
147149
"view_dependency_graph": "Voir le graphe de dépendances",
148150
"inspect_dependency_tree": "Inspecter l'arbre de dépendances",
149151
"size_tooltip": {
@@ -152,7 +154,22 @@
152154
}
153155
},
154156
"skills": {
155-
"file_counts": {}
157+
"title": "Compétences de l'agent",
158+
"skills_available": "{count} compétence disponible | {count} compétences disponibles",
159+
"view": "Voir",
160+
"compatible_with": "Compatible avec {tool}",
161+
"install": "Installer",
162+
"installation_method": "Méthode d'installation",
163+
"learn_more": "En savoir plus",
164+
"available_skills": "Compétences disponibles",
165+
"click_to_expand": "Cliquer pour développer",
166+
"no_description": "Aucune description",
167+
"file_counts": {
168+
"scripts": "{count} script | {count} scripts",
169+
"refs": "{count} ref | {count} refs",
170+
"assets": "{count} asset | {count} assets"
171+
},
172+
"view_source": "Voir la source"
156173
},
157174
"links": {
158175
"repo": "dépôt",
@@ -176,7 +193,8 @@
176193
},
177194
"create": {
178195
"title": "Créer un nouveau projet",
179-
"copy_command": "Copier la commande de création"
196+
"copy_command": "Copier la commande de création",
197+
"view": "{packageName} a le même mainteneur. Cliquer pour plus de détails."
180198
},
181199
"run": {
182200
"title": "Exécuter",
@@ -185,7 +203,8 @@
185203
"readme": {
186204
"title": "Readme",
187205
"no_readme": "Aucun README disponible.",
188-
"view_on_github": "Voir sur GitHub"
206+
"view_on_github": "Voir sur GitHub",
207+
"toc_title": "Sommaire"
189208
},
190209
"keywords_title": "Mots-clés",
191210
"compatibility": "Compatibilité",
@@ -283,7 +302,8 @@
283302
"no_types": "Pas de types TypeScript"
284303
},
285304
"license": {
286-
"view_spdx": "Voir le texte de la licence sur SPDX"
305+
"view_spdx": "Voir le texte de la licence sur SPDX",
306+
"none": "Aucune"
287307
},
288308
"vulnerabilities": {
289309
"no_description": "Aucune description disponible",
@@ -378,6 +398,9 @@
378398
},
379399
"modal": {
380400
"title": "Connecteur local",
401+
"contributor_badge": "Contributeurs uniquement",
402+
"contributor_notice": "Le connecteur n'est pas encore publié sur npm. Consultez le {link} pour savoir comment l'exécuter localement.",
403+
"contributor_link": "guide de contribution",
381404
"connected": "Connecté·e",
382405
"connected_as_user": "Connecté·e en tant que ~{user}",
383406
"connected_hint": "Vous pouvez maintenant gérer les paquets et les organisations depuis l'interface web.",
@@ -575,7 +598,8 @@
575598
"markdown_view_mode": {
576599
"preview": "aperçu",
577600
"code": "code"
578-
}
601+
},
602+
"file_path": "Chemin du fichier"
579603
},
580604
"badges": {
581605
"provenance": {
@@ -611,6 +635,13 @@
611635
"more_keywords": "+{count} de plus",
612636
"clear_all": "Tout effacer",
613637
"remove_filter": "Supprimer le filtre {label}",
638+
"chips": {
639+
"search": "Rechercher",
640+
"downloads": "Téléchargements",
641+
"keyword": "Mot-clé",
642+
"security": "Sécurité",
643+
"updated": "Mis à jour"
644+
},
614645
"download_range": {
615646
"any": "Tous",
616647
"lt100": "< 100",
@@ -832,11 +863,72 @@
832863
"deselect_all": "Désélectionner toutes les facettes",
833864
"select_category": "Sélectionner toutes les facettes {category}",
834865
"deselect_category": "Désélectionner toutes les facettes {category}",
866+
"binary_only_tooltip": "Ce paquet expose des binaires et aucun export",
835867
"categories": {
836868
"performance": "Performance",
837869
"health": "Santé",
838870
"compatibility": "Compatibilité",
839871
"security": "Sécurité & Conformité"
872+
},
873+
"items": {
874+
"packageSize": {
875+
"label": "Taille du paquet",
876+
"description": "Taille du paquet lui-même (décompressé)"
877+
},
878+
"installSize": {
879+
"label": "Taille d'installation",
880+
"description": "Taille d'installation totale incluant toutes les dépendances"
881+
},
882+
"dependencies": {
883+
"label": "Dépendances directes",
884+
"description": "Nombre de dépendances directes"
885+
},
886+
"totalDependencies": {
887+
"label": "Dépendances totales",
888+
"description": "Nombre total de dépendances incluant les transitives"
889+
},
890+
"downloads": {
891+
"label": "Téléch./semaine",
892+
"description": "Nombre de téléchargements par semaine"
893+
},
894+
"lastUpdated": {
895+
"label": "Publié",
896+
"description": "Quand cette version a été publiée"
897+
},
898+
"deprecated": {
899+
"label": "Déprécié ?",
900+
"description": "Si le paquet est déprécié"
901+
},
902+
"engines": {
903+
"label": "Moteurs",
904+
"description": "Versions de Node.js requises"
905+
},
906+
"types": {
907+
"label": "Types",
908+
"description": "Définitions de types TypeScript"
909+
},
910+
"moduleFormat": {
911+
"label": "Format du module",
912+
"description": "Support ESM/CJS"
913+
},
914+
"license": {
915+
"label": "Licence",
916+
"description": "Licence du paquet"
917+
},
918+
"vulnerabilities": {
919+
"label": "Vulnérabilités",
920+
"description": "Vulnérabilités de sécurité connues"
921+
}
922+
},
923+
"values": {
924+
"any": "Tout",
925+
"none": "Aucun",
926+
"unknown": "Inconnu",
927+
"deprecated": "Déprécié",
928+
"not_deprecated": "Non",
929+
"types_included": "Inclus",
930+
"types_none": "Aucun",
931+
"vulnerabilities_summary": "{count} ({critical}C/{high}H)"
840932
}
841933
}
842934
}

0 commit comments

Comments
 (0)