feat(i18n): localize EffectsChainEditor and built-in preset names

- Effect type labels (Chorus/Flanger, Reverb, Delay, Compressor, Gain,
  High-Pass, Low-Pass, Pitch Shift) and every param label (LFO speed,
  Modulation depth, Threshold, Ratio, etc.) go through
  `effects.types.<type>.{label,params.<param>}` with the backend string
  as defaultValue fallback.
- Chain-level controls: "Load preset…", "Add effect…", "Clear",
  Power/Remove button titles.
- Built-in preset names + descriptions (Robotic, Radio, Echo Chamber,
  Deep Voice) are translated client-side; user-created presets keep
  their original names.

Backend keeps returning English — frontend intercepts and translates
via key lookup, defaulting to the backend string so unknown
effects/params don't break.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
James Pine
2026-04-20 03:12:34 -07:00
co-authored by Claude Opus 4.7
parent 2b7973df8b
commit 2e962f6599
5 changed files with 238 additions and 22 deletions
+89
View File
@@ -90,6 +90,95 @@
"deleteFailed": "Failed to delete",
"previewFailed": "Preview failed",
"nameRequired": "Name required"
},
"chain": {
"loadPreset": "Load preset…",
"addEffect": "Add effect…",
"clear": "Clear",
"enable": "Enable",
"disable": "Disable",
"remove": "Remove"
},
"types": {
"chorus": {
"label": "Chorus / Flanger",
"params": {
"rate_hz": "LFO speed (Hz)",
"depth": "Modulation depth",
"feedback": "Feedback amount",
"centre_delay_ms": "Centre delay (ms)",
"mix": "Wet/dry mix"
}
},
"reverb": {
"label": "Reverb",
"params": {
"room_size": "Room size",
"damping": "High frequency damping",
"wet_level": "Wet level",
"dry_level": "Dry level",
"width": "Stereo width"
}
},
"delay": {
"label": "Delay",
"params": {
"delay_seconds": "Delay time (seconds)",
"feedback": "Feedback amount",
"mix": "Wet/dry mix"
}
},
"compressor": {
"label": "Compressor",
"params": {
"threshold_db": "Threshold (dB)",
"ratio": "Compression ratio",
"attack_ms": "Attack time (ms)",
"release_ms": "Release time (ms)"
}
},
"gain": {
"label": "Gain",
"params": {
"gain_db": "Gain (dB)"
}
},
"highpass": {
"label": "High-Pass Filter",
"params": {
"cutoff_frequency_hz": "Cutoff frequency (Hz)"
}
},
"lowpass": {
"label": "Low-Pass Filter",
"params": {
"cutoff_frequency_hz": "Cutoff frequency (Hz)"
}
},
"pitch_shift": {
"label": "Pitch Shift",
"params": {
"semitones": "Semitones to shift"
}
}
},
"builtinPresets": {
"Robotic": {
"name": "Robotic",
"description": "Metallic robotic voice (flanger with slow LFO and high feedback)"
},
"Radio": {
"name": "Radio",
"description": "Thin AM-radio voice with band-pass filtering and light compression"
},
"Echo Chamber": {
"name": "Echo Chamber",
"description": "Spacious reverb with trailing echo"
},
"Deep Voice": {
"name": "Deep Voice",
"description": "Lower pitch with added warmth"
}
}
},
"stories": {