Skip to content

Commit b10e330

Browse files
authored
feat(react-ui): localize MediaHistory, AudioTransform, and Sound components (#10802)
- Replace hardcoded text with useTranslation hook in UI components - Add localization support for both English (en) and Indonesian (id) locales Signed-off-by: Dedy F. Setyawan <dedyfajars@gmail.com>
1 parent 4056283 commit b10e330

5 files changed

Lines changed: 164 additions & 65 deletions

File tree

core/http/react-ui/public/locales/en/media.json

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,22 @@
264264
"model": "Model",
265265
"prompt": "Prompt",
266266
"promptPlaceholder": "Describe the sound you want to generate...",
267+
"instrumental": "Instrumental",
268+
"bpm": "BPM",
267269
"duration": "Duration (seconds)",
268270
"language": "Language",
271+
"timesignature": "Time Signature",
272+
"keyscale": "Key/Scale",
269273
"vocalLanguage": "Vocal language",
270-
"lyrics": "Lyrics (optional)",
274+
"vocalLanguagePlaceholder": "e.g. English",
275+
"caption": "Caption",
276+
"lyrics": "Lyrics",
271277
"lyricsPlaceholder": "Lyrics for vocal generation",
272-
"advanced": "Advanced Settings",
278+
"simple": "Simple",
279+
"advanced": "Advanced",
273280
"seed": "Seed",
274-
"seedPlaceholder": "Random"
281+
"seedPlaceholder": "Random",
282+
"thinkMode": "Think mode"
275283
},
276284
"actions": {
277285
"generate": "Generate",
@@ -284,6 +292,45 @@
284292
"generateFailed": "Generation failed"
285293
}
286294
},
295+
"audioTransform": {
296+
"title": "Audio Transform",
297+
"labels": {
298+
"model": "Model",
299+
"audio": "Audio (required)",
300+
"reference": "Reference (optional)",
301+
"referenceHelp": "Loopback / far-end signal for echo cancellation, target speaker for voice conversion. Leave empty for unconditional transform.",
302+
"advancedParameters": "Advanced parameters",
303+
"advancedParametersHelp": "backend-specific (one key=value per line, e.g. noise_gate=true)",
304+
"advancedParametersPlaceholder": "# Optional. For LocalVQE:\n# noise_gate=true\n# noise_gate_threshold_dbfs=-50"
305+
},
306+
"input": {
307+
"upload": "Upload",
308+
"uploadDescription": "Drop a file here or",
309+
"uploadBrowse": "browse",
310+
"record": "Record",
311+
"startRecording": "Start recording",
312+
"stop": "Stop",
313+
"encoding": "Encoding...",
314+
"clear": "Clear",
315+
"microphoneUnavailable": "Microphone capture is unavailable in this browser.",
316+
"echoNotice": "Browsers often apply their own WebRTC echo cancellation and noise suppression by default. This usually results in worse performance than running LocalVQE on the raw audio.",
317+
"echoTest": "Echo test (record mic while playing reference)",
318+
"stopEchoTest": "Stop echo test"
319+
},
320+
"result": {
321+
"audio": "Audio",
322+
"reference": "Reference",
323+
"inputSpectrum": "Input spectrum",
324+
"outputSpectrum": "Output spectrum",
325+
"outputSpectrumHint": "Transform to compare attenuation",
326+
"output": "Output"
327+
},
328+
"actions": {
329+
"transform": "Transform",
330+
"processing": "Processing..."
331+
},
332+
"empty": "Choose an audio file (and optional reference) to transform"
333+
},
287334
"talk": {
288335
"title": "Talk",
289336
"subtitle": "Realtime voice conversation",

core/http/react-ui/public/locales/id/media.json

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,73 @@
9696
"model": "Model",
9797
"prompt": "Prompt",
9898
"promptPlaceholder": "Deskripsikan suara yang ingin Anda buat...",
99+
"instrumental": "Instrumental",
100+
"bpm": "Tempo",
99101
"duration": "Durasi (detik)",
100102
"language": "Bahasa",
103+
"timesignature": "Tanda birama",
104+
"keyscale": "Tangga nada",
101105
"vocalLanguage": "Bahasa vokal",
102-
"lyrics": "Lirik (opsional)",
103-
"lyricsPlaceholder": "Lirik untuk generasi vokal",
104-
"advanced": "Pengaturan Tingkat Lanjutan",
106+
"vocalLanguagePlaceholder": "cth. Bahasa Indonesia",
107+
"caption": "Takarir",
108+
"lyrics": "Lirik",
109+
"lyricsPlaceholder": "Lirik untuk menghasilkan vokal",
110+
"simple": "Sederhana",
111+
"advanced": "Tingkat Lanjutan",
105112
"seed": "Seed",
106-
"seedPlaceholder": "Acak"
113+
"seedPlaceholder": "Acak",
114+
"thinkMode": "Mode penalaran"
107115
},
108116
"actions": {
109117
"generate": "Hasilkan",
110118
"generating": "Menghasilkan..."
111119
},
112-
"empty": "Audio yang dihasilkan akan muncul di sini",
120+
"empty": "Suara yang dihasilkan akan muncul di sini",
113121
"toasts": {
114122
"noPrompt": "Silahkan masukkan prompt",
115123
"noModel": "Silahkan pilih model",
116124
"generateFailed": "Gagal menghasilkan"
117125
}
118126
},
127+
"audioTransform": {
128+
"title": "Transformasi Audio",
129+
"labels": {
130+
"model": "Model",
131+
"audio": "Audio (wajib)",
132+
"reference": "Referensi (opsional)",
133+
"referenceHelp": "Sinyal loopback / ujung jauh untuk pembatalan gema, atau pembicara target untuk konversi suara. Kosongkan untuk transformasi tanpa syarat.",
134+
"advancedParameters": "Parameter tingkat lanjut",
135+
"advancedParametersHelp": "Spesifik backend (satu key=value per baris, contoh: noise_gate=true)",
136+
"advancedParametersPlaceholder": "# Opsional. Untuk LocalVQE:\n# noise_gate=true\n# noise_gate_threshold_dbfs=-50"
137+
},
138+
"input": {
139+
"upload": "Unggah",
140+
"uploadDescription": "Tarik file di sini atau",
141+
"uploadBrowse": "jelajahi",
142+
"record": "Rekam",
143+
"startRecording": "Mulai merekam",
144+
"stop": "Selesai",
145+
"encoding": "Pengenkodean...",
146+
"clear": "Hapus",
147+
"microphoneUnavailable": "Perekaman mikrofon tidak tersedia di peramban ini.",
148+
"echoNotice": "Peramban sering kali menerapkan pembatalan gema dan penekanan derau WebRTC secara bawaan. Hal ini biasanya menghasilkan performa yang lebih buruk dibandingkan menjalankan LocalVQE pada audio mentah.",
149+
"echoTest": "Tes gema (rekam mik saat memutar referensi)",
150+
"stopEchoTest": "Hentikan tes gema"
151+
},
152+
"result": {
153+
"audio": "Audio",
154+
"reference": "Referensi",
155+
"inputSpectrum": "Input spektrum",
156+
"outputSpectrum": "Output spektrum",
157+
"outputSpectrumHint": "Transformasi untuk membandingkan atenuasi",
158+
"output": "Output"
159+
},
160+
"actions": {
161+
"transform": "Transformasi",
162+
"processing": "Memproses..."
163+
},
164+
"empty": "Pilih file audio (dan referensi opsional) untuk ditransformasikan"
165+
},
119166
"talk": {
120167
"title": "Percakapan",
121168
"subtitle": "Percakapan suara realtime",

core/http/react-ui/src/components/MediaHistory.jsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { memo, useState } from 'react'
22
import { relativeTime } from '../utils/format'
3+
import { useTranslation } from 'react-i18next'
34

45
const ICONS = {
56
image: 'fa-image',
@@ -10,6 +11,7 @@ const ICONS = {
1011
}
1112

1213
export default memo(function MediaHistory({ entries, selectedId, onSelect, onDelete, onClearAll, mediaType }) {
14+
const { t } = useTranslation('media')
1315
const [expanded, setExpanded] = useState(true)
1416

1517
return (
@@ -20,11 +22,11 @@ export default memo(function MediaHistory({ entries, selectedId, onSelect, onDel
2022
style={{ display: 'flex', alignItems: 'center' }}
2123
>
2224
<i className="fas fa-chevron-right" />
23-
<span style={{ flex: 1 }}>History ({entries.length})</span>
25+
<span style={{ flex: 1 }}>{t('history.title')} ({entries.length})</span>
2426
{entries.length > 0 && (
2527
<button
2628
className="media-history-clear-btn"
27-
title="Clear all"
29+
title={t('history.clearTitle')}
2830
onClick={(e) => { e.stopPropagation(); onClearAll() }}
2931
>
3032
<i className="fas fa-trash" />
@@ -34,7 +36,7 @@ export default memo(function MediaHistory({ entries, selectedId, onSelect, onDel
3436
{expanded && (
3537
<div className="media-history-list">
3638
{entries.length === 0 ? (
37-
<div className="media-history-empty">No history yet</div>
39+
<div className="media-history-empty">{t('history.empty')}</div>
3840
) : (
3941
entries.map(entry => (
4042
<div
@@ -59,7 +61,7 @@ export default memo(function MediaHistory({ entries, selectedId, onSelect, onDel
5961
</div>
6062
<button
6163
className="media-history-item-delete"
62-
title="Delete"
64+
title={t('history.deleteEntry')}
6365
onClick={(e) => { e.stopPropagation(); onDelete(entry.id) }}
6466
data-testid="media-history-delete"
6567
>

0 commit comments

Comments
 (0)