chore(translations): apply translation validation pass across 16 locales#159
Conversation
Ran secrets/validate-translations.mjs against every non-en locale and
applied the model-suggested fixes after spot-checking each claim
against en.json. Net: 16 files, ~340 individual corrections.
Categories applied:
- Literal-MT false friends in music UI: cover → entrance fee, track →
footprint, plays → games, library → public library / bookshelf,
pitch translated as key/tone, queue as generic waiting line, bitrate
as flow rate, etc. Caught across most locales.
- Plural / grammar bugs: Russian *_few backfilled (one/few/many is
three distinct forms), Turkish nouns kept singular after a number
({{count}} parça not parçalar), Korean dropped the spurious 들
pluraliser after counts, Japanese counter words corrected (曲 for
tracks, 枚 for albums, 件 for items, 組 for artists).
- Untranslated UI jargon left in English on recent feature adds
(player bar, covers, tray, local-first, EQ preset names, mood-radio
category titles, equalizer presets).
- Placeholder integrity: rescued an es.json `<nombre>` rename that
would have broken the runtime substitution, fixed hi.json `<नाम>`
variant of the same shape.
- Korean register normalisation: -습니다 / -ㅂ니다 endings for
actions and noun forms for labels in Settings + modals, dropped
casual -해요.
- Chinese punctuation: half-width → full-width in CJK strings.
- Reversed-meaning fixes: trackActions.addToPlaylistNamed /
removeFromPlaylistNamed were reading "add the playlist to the
track" in FR and similar — restored "Add to {{name}}" semantics.
Categories deliberately skipped:
- player.controls.repeatAll / repeatOne — the model flagged these as
source typos but en.json is intentional (aria-label cycle-next
pattern: the label describes what the NEXT click does, not the
current state). Verified usage in PlaybackControls.tsx.
- Brand identifiers "Daily Mix" and "On Repeat" left verbatim — same
policy as WaveFlow / Last.fm / Deezer / ReplayGain / LRCLIB / BPM in
CLAUDE.md (smart-playlist family names are part of the product
surface, not localisable copy).
- Pure terminology renames from §5 of each report (titre vs morceau in
FR, etc.) — informational suggestions, not bugs.
- Pure register style swings when the rest of the locale wasn't
consistent enough to call one form canonical.
Structural check via bun secrets/validate-translations.mjs --dry-run
clean afterwards: zero missing keys, zero broken placeholders, zero
real extra keys (the AR _zero/_two/_few/_many and RU _few plural
variants the script flags are legitimate i18next per-locale plural
forms, not bugs).
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughCe PR met à jour de manière cohérente les chaînes de localisation dans 16 fichiers JSON de langues différentes (arabe, allemand, espagnol, français, hindi, indonésien, italien, japonais, coréen, néerlandais, portugais brésilien, portugais, russe, turc, chinois simplifié et traditionnel). Les changements sont uniquement des valeurs i18n : reformulations, harmonisation terminologique, pluralisations et traductions de termes audio/UI. ChangesMise à jour multilingue d'interface utilisateur WaveFlow
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/i18n/locales/ar.json`:
- Around line 692-706: The Arabic translations use "أغنية" in
count_zero/count_one/count_other but "مقطع" in
upNext_zero/upNext_one/upNext_other, creating inconsistent terminology; pick one
term (e.g., change upNext_* to use "أغنية" to match count_*) and update the
values for upNext_zero, upNext_one, and upNext_other to use the same word and
placeholders (keep "{{count}}" and the existing "التالي" prefix), ensuring
plural forms remain consistent with the count_* keys.
In `@src/i18n/locales/fr.json`:
- Around line 427-435: Le bloc de traductions sous le namespace "liked" est
incohérent: vous avez adopté "Titres aimés / coups de cœur" pour
title/unlike/like mais emptyTitle et emptyDescription utilisent encore
"liké/likez"; mettez-les en accord en modifiant les clés emptyTitle et
emptyDescription pour employer la même terminologie (par ex. emptyTitle ->
"Aucun titre aimé" et emptyDescription -> "Les morceaux que vous aimez
apparaîtront ici. Explorez votre bibliothèque et ajoutez-les à vos coups de
cœur."), en gardant les clés existantes (emptyTitle, emptyDescription) pour
éviter de casser les références.
In `@src/i18n/locales/nl.json`:
- Around line 68-77: Update the Dutch translation for the key missingFields to
use the new term “Gedeeld geheim” so the form text matches
secretLabel/secretPlaceholder; locate the JSON entry for "missingFields" and
replace the phrase "secret" with "Gedeeld geheim" (e.g., make it read something
like "Vul API-sleutel, Gedeeld geheim, gebruikersnaam en wachtwoord in.") to
keep terminology consistent with secretLabel and secretPlaceholder.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 241fa0fb-bea0-4cb4-8f8b-b86a188d160e
📒 Files selected for processing (16)
src/i18n/locales/ar.jsonsrc/i18n/locales/de.jsonsrc/i18n/locales/es.jsonsrc/i18n/locales/fr.jsonsrc/i18n/locales/hi.jsonsrc/i18n/locales/id.jsonsrc/i18n/locales/it.jsonsrc/i18n/locales/ja.jsonsrc/i18n/locales/ko.jsonsrc/i18n/locales/nl.jsonsrc/i18n/locales/pt-BR.jsonsrc/i18n/locales/pt.jsonsrc/i18n/locales/ru.jsonsrc/i18n/locales/tr.jsonsrc/i18n/locales/zh-CN.jsonsrc/i18n/locales/zh-TW.json
Three small consistency fixes flagged on PR #159 review: - ar.json `queue.upNext_one/_other`: terminology drift between `count_*` ("أغنية") and `upNext_*` ("مقطع") inside the same namespace. Aligned `upNext_*` on "أغنية" — the active translation for the count fields plus the rest of the music-player surface. - fr.json `liked.emptyTitle/emptyDescription`: rewrite kept `title/like/unlike` on "Titres aimés / Coups de cœur" but left the empty-state strings on franglais "liké / likez". Both now match the "aimés / coups de cœur" choice. - nl.json `lastfm.missingFields`: the form's `secretLabel` / `secretPlaceholder` were already on "Gedeeld geheim" but the validation error still referenced the bare English "secret". Same noun across the form now. Dry-run validation clean on all three locales afterwards.
|
@coderabbitai Addressed all 3 findings in 0d7030a. All three verified valid against current code and fixed minimally. ar.json fr.json nl.json Dry-run validation clean on all three locales — 0 missing keys, 0 broken placeholders, 0 real extra keys. |
|
Tip For best results, initiate chat on the files or code changes.
🐇 ✨ |
Summary
Ran
secrets/validate-translations.mjsagainst every non-enlocale, then dispatched 4 parallel agents to apply the model-suggested fixes after spot-checking each claim againsten.json.~340 corrections across 16 locales, 521 insertions / 492 deletions, no structural breakage afterwards.
What got applied
*_fewbackfilled (one/few/many is three distinct forms), Turkish nouns kept singular after a number ({{count}} parçanotparçalar), Korean dropped the spurious들pluraliser, Japanese counter words corrected (曲for tracks,枚for albums,件for items,組for artists).es.json<nombre>rename +hi.json<नाम>variant of the same shape (would have broken runtime template substitution).-습니다 / -ㅂ니다for actions and noun forms for labels in Settings + modals, dropped casual-해요.trackActions.addToPlaylistNamed/removeFromPlaylistNamedwere reading "add the playlist to the track" in FR and similar locales → restoredAdd to "{{name}}"semantics.What got deliberately skipped (and why)
player.controls.repeatAll/repeatOne— the model flagged these as source typos in multiple locale reports, buten.jsonis intentional: it's the aria-label cycle-next pattern (the label describes what the NEXT click does, not the current state). Verified usage inPlaybackControls.tsx:99-104. Left every locale alone.Daily MixandOn Repeatleft verbatim across all locales. Same policy asWaveFlow / Last.fm / Deezer / ReplayGain / LRCLIB / BPMper CLAUDE.md — smart-playlist family names are part of the product surface, not localisable copy.tu↔vousstyle swings applied only when the rest of the locale was already consistent and this row was a slip-up (FR specifically). Skipped elsewhere when the locale didn't have a clear canonical register.Validation
Clean afterwards across all 16 locales:
_zero/_two/_few/_manyand RU_fewplural variants the script flags as "extra" are legitimate i18next per-locale plural forms — EN doesn't have them but the locales need them per CLDR plural rules)Test plan
bun secrets/validate-translations.mjs --dry-run— cleanSummary by CodeRabbit