Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,14 @@ For example to check if all Japanese translation keys are up-to-date, run:
pnpm i18n:check ja-JP
```

To automatically add missing keys with English placeholders, use `--fix`:

```bash
pnpm i18n:check:fix fr-FR
```

This will add missing keys with `"EN TEXT TO REPLACE: {english text}"` as placeholder values, making it easier to see what needs translation.

#### Country variants (advanced)

Most languages only need a single locale file. Country variants are only needed when you want to support regional differences (e.g., `es-ES` for Spain vs `es-419` for Latin America).
Expand Down
65 changes: 59 additions & 6 deletions i18n/locales/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,11 @@
"vulns": "Vulnérabilités",
"updated": "Mis à jour",
"view_dependency_graph": "Voir le graphe de dépendances",
"inspect_dependency_tree": "Inspecter l'arbre de dépendances"
"inspect_dependency_tree": "Inspecter l'arbre de dépendances",
"size_tooltip": {
"unpacked": "{size} taille décompressée (ce paquet)",
"total": "{size} taille totale décompressée (incluant les {count} dépendances pour linux-x64)"
}
},
"links": {
"repo": "dépôt",
Expand Down Expand Up @@ -177,14 +181,18 @@
"other_versions": "Autres versions",
"more_tagged": "{count} de plus avec tag",
"all_covered": "Toutes les versions sont couvertes par les tags ci-dessus",
"deprecated_title": "{version} (dépréciée)"
"deprecated_title": "{version} (dépréciée)",
"view_all": "Voir la version | Voir les {count} versions"
},
"dependencies": {
"title": "Dépendances ({count})",
"list_label": "Dépendances du paquet",
"show_all": "afficher les {count} dépendances",
"optional": "optionnelle",
"view_vulnerabilities": "Voir les vulnérabilités"
"view_vulnerabilities": "Voir les vulnérabilités",
"outdated_major": "{count} version majeure en retard (dernière : {latest}) | {count} versions majeures en retard (dernière : {latest})",
"outdated_minor": "{count} version mineure en retard (dernière : {latest}) | {count} versions mineures en retard (dernière : {latest})",
"outdated_patch": "Mise à jour patch disponible (dernière : {latest})"
},
"peer_dependencies": {
"title": "Dépendances peer ({count})",
Expand Down Expand Up @@ -245,7 +253,8 @@
"no_esm": "Pas de support des ES Modules",
"types_included": "Types inclus",
"types_available": "Types disponibles via {package}",
"no_types": "Pas de types TypeScript"
"no_types": "Pas de types TypeScript",
"types_label": "Types"
},
"license": {
"view_spdx": "Voir le texte de la licence sur SPDX"
Expand Down Expand Up @@ -320,13 +329,25 @@
"maintainers": "Mainteneurs",
"keywords": "Mots-clés",
"versions": "Versions",
"dependencies": "Dépendances"
"dependencies": "Dépendances",
"get_started": "Commencer"
},
"sort": {
"downloads": "Plus téléchargés",
"updated": "Récemment mis à jour",
"name_asc": "Nom (A-Z)",
"name_desc": "Nom (Z-A)"
},
"copy_name": "Copier le nom du paquet",
"replacement": {
"title": "Vous n'avez peut-être pas besoin de cette dépendance.",
"native": "Ceci peut être remplacé par {replacement}, disponible depuis Node {nodeVersion}.",
"simple": "La {community} a signalé ce paquet comme redondant, avec ce conseil : {replacement}.",
"documented": "La {community} a signalé que ce paquet a des alternatives plus performantes.",
"none": "Ce paquet a été signalé comme n'étant plus nécessaire, et sa fonctionnalité est probablement disponible nativement dans tous les moteurs.",
"learn_more": "En savoir plus",
"mdn": "MDN",
"community": "communauté"
}
},
"connector": {
Expand Down Expand Up @@ -356,7 +377,8 @@
"warning": "ATTENTION",
"warning_text": "Cela permet à npmx d'accéder à votre CLI npm. Ne vous connectez qu'aux sites de confiance.",
"connect": "Connecter",
"connecting": "Connexion..."
"connecting": "Connexion...",
"connected_as_user": "Connecté·e en tant que ~{user}"
}
},
"operations": {
Expand Down Expand Up @@ -730,5 +752,36 @@
"empty": "Aucune organisation trouvée",
"view_all": "Tout voir"
}
},
"version": "Version",
"built_at": "compilé {0}",
"alt_logo": "Logo npmx",
"account_menu": {
"connect": "connexion",
"account": "Compte",
"npm_cli": "npm CLI",
"atmosphere": "Atmosphère",
"npm_cli_desc": "Gérer les paquets et orgs",
"atmosphere_desc": "Fonctionnalités sociales et identité",
"connect_npm_cli": "Connexion à npm CLI",
"connect_atmosphere": "Connexion à Atmosphère",
"connecting": "Connexion en cours...",
"ops": "{count} op | {count} ops",
"disconnect": "Déconnexion"
},
"auth": {
"modal": {
"title": "Atmosphère",
"connected_as": "Connecté·e en tant que {'@'}{handle}",
"disconnect": "Déconnexion",
"connect_prompt": "Connectez-vous avec votre compte Atmosphère",
"handle_label": "Identifiant",
"handle_placeholder": "alice.npmx.social",
"connect": "Connexion",
"create_account": "Créer un nouveau compte",
"connect_bluesky": "Connexion avec Bluesky",
"what_is_atmosphere": "Qu'est-ce qu'un compte Atmosphère ?",
"atmosphere_explanation": "{npmx} utilise {atproto} pour alimenter plusieurs de ses fonctionnalités sociales, permettant aux utilisateurs de posséder leurs données et d'utiliser un seul compte pour toutes les applications compatibles. Une fois votre compte créé, vous pouvez utiliser d'autres applications comme {bluesky} ou {tangled} avec le même compte."
}
}
}
65 changes: 59 additions & 6 deletions lunaria/files/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,11 @@
"vulns": "Vulnérabilités",
"updated": "Mis à jour",
"view_dependency_graph": "Voir le graphe de dépendances",
"inspect_dependency_tree": "Inspecter l'arbre de dépendances"
"inspect_dependency_tree": "Inspecter l'arbre de dépendances",
"size_tooltip": {
"unpacked": "{size} taille décompressée (ce paquet)",
"total": "{size} taille totale décompressée (incluant les {count} dépendances pour linux-x64)"
}
},
"links": {
"repo": "dépôt",
Expand Down Expand Up @@ -177,14 +181,18 @@
"other_versions": "Autres versions",
"more_tagged": "{count} de plus avec tag",
"all_covered": "Toutes les versions sont couvertes par les tags ci-dessus",
"deprecated_title": "{version} (dépréciée)"
"deprecated_title": "{version} (dépréciée)",
"view_all": "Voir la version | Voir les {count} versions"
},
"dependencies": {
"title": "Dépendances ({count})",
"list_label": "Dépendances du paquet",
"show_all": "afficher les {count} dépendances",
"optional": "optionnelle",
"view_vulnerabilities": "Voir les vulnérabilités"
"view_vulnerabilities": "Voir les vulnérabilités",
"outdated_major": "{count} version majeure en retard (dernière : {latest}) | {count} versions majeures en retard (dernière : {latest})",
"outdated_minor": "{count} version mineure en retard (dernière : {latest}) | {count} versions mineures en retard (dernière : {latest})",
"outdated_patch": "Mise à jour patch disponible (dernière : {latest})"
},
"peer_dependencies": {
"title": "Dépendances peer ({count})",
Expand Down Expand Up @@ -245,7 +253,8 @@
"no_esm": "Pas de support des ES Modules",
"types_included": "Types inclus",
"types_available": "Types disponibles via {package}",
"no_types": "Pas de types TypeScript"
"no_types": "Pas de types TypeScript",
"types_label": "Types"
},
"license": {
"view_spdx": "Voir le texte de la licence sur SPDX"
Expand Down Expand Up @@ -320,13 +329,25 @@
"maintainers": "Mainteneurs",
"keywords": "Mots-clés",
"versions": "Versions",
"dependencies": "Dépendances"
"dependencies": "Dépendances",
"get_started": "Commencer"
},
"sort": {
"downloads": "Plus téléchargés",
"updated": "Récemment mis à jour",
"name_asc": "Nom (A-Z)",
"name_desc": "Nom (Z-A)"
},
"copy_name": "Copier le nom du paquet",
"replacement": {
"title": "Vous n'avez peut-être pas besoin de cette dépendance.",
"native": "Ceci peut être remplacé par {replacement}, disponible depuis Node {nodeVersion}.",
"simple": "La {community} a signalé ce paquet comme redondant, avec ce conseil : {replacement}.",
"documented": "La {community} a signalé que ce paquet a des alternatives plus performantes.",
"none": "Ce paquet a été signalé comme n'étant plus nécessaire, et sa fonctionnalité est probablement disponible nativement dans tous les moteurs.",
"learn_more": "En savoir plus",
"mdn": "MDN",
"community": "communauté"
}
},
"connector": {
Expand Down Expand Up @@ -356,7 +377,8 @@
"warning": "ATTENTION",
"warning_text": "Cela permet à npmx d'accéder à votre CLI npm. Ne vous connectez qu'aux sites de confiance.",
"connect": "Connecter",
"connecting": "Connexion..."
"connecting": "Connexion...",
"connected_as_user": "Connecté·e en tant que ~{user}"
}
},
"operations": {
Expand Down Expand Up @@ -730,5 +752,36 @@
"empty": "Aucune organisation trouvée",
"view_all": "Tout voir"
}
},
"version": "Version",
"built_at": "compilé {0}",
"alt_logo": "Logo npmx",
"account_menu": {
"connect": "connexion",
"account": "Compte",
"npm_cli": "npm CLI",
"atmosphere": "Atmosphère",
"npm_cli_desc": "Gérer les paquets et orgs",
"atmosphere_desc": "Fonctionnalités sociales et identité",
"connect_npm_cli": "Connexion à npm CLI",
"connect_atmosphere": "Connexion à Atmosphère",
"connecting": "Connexion en cours...",
"ops": "{count} op | {count} ops",
"disconnect": "Déconnexion"
},
"auth": {
"modal": {
"title": "Atmosphère",
"connected_as": "Connecté·e en tant que {'@'}{handle}",
"disconnect": "Déconnexion",
"connect_prompt": "Connectez-vous avec votre compte Atmosphère",
"handle_label": "Identifiant",
"handle_placeholder": "alice.npmx.social",
"connect": "Connexion",
"create_account": "Créer un nouveau compte",
"connect_bluesky": "Connexion avec Bluesky",
"what_is_atmosphere": "Qu'est-ce qu'un compte Atmosphère ?",
"atmosphere_explanation": "{npmx} utilise {atproto} pour alimenter plusieurs de ses fonctionnalités sociales, permettant aux utilisateurs de posséder leurs données et d'utiliser un seul compte pour toutes les applications compatibles. Une fois votre compte créé, vous pouvez utiliser d'autres applications comme {bluesky} ou {tangled} avec le même compte."
}
}
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"dev": "nuxt dev",
"dev:docs": "pnpm run --filter npmx-docs dev --port=3001",
"i18n:check": "node --experimental-transform-types scripts/compare-translations.ts",
"i18n:check:fix": "node --experimental-transform-types scripts/compare-translations.ts --fix",
Copy link
Copy Markdown
Member

@danielroe danielroe Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should run this in autofix.yml then 🙏

it already automatically strips unused keys, and it would be convenient if it also added new ones. maybe we don't even need the --fix suffix?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this PR, the translated text would be:

"create_account": "EN TEXT TO REPLACE: Create a new account"

To me, this is something you run manually when you want to update translations:

  • Fill in all missing keys
  • Have the English text by default, so you can immediately see what needs to be translated without switching files or hunting for keys

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahhh, makes sense!

"knip": "knip",
"knip:fix": "knip --fix",
"knip:production": "knip --production",
Expand Down
Loading