Skip to content

Commit 45a14b3

Browse files
JiroMusikclaude
andcommitted
Fix Settings: add i18n translations for image generation, model dropdown
- Add imageGeneration/imageProvider/imageModel/imageApiKey translations (de/en/es) - Replace text input with model dropdown (DALL-E 2/3, Gemini Imagen, SD3 variants) - Remove hardcoded German fallbacks, use proper t() keys Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 11c339c commit 45a14b3

4 files changed

Lines changed: 39 additions & 19 deletions

File tree

src/i18n/locales/de.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,13 @@
272272
"themeCustom": "Eigenes",
273273
"uploadCss": "CSS-Datei hochladen",
274274
"customCssLoaded": "CSS geladen",
275-
"customCssActive": "Eigenes CSS aktiv ({{size}} Zeichen)"
275+
"customCssActive": "Eigenes CSS aktiv ({{size}} Zeichen)",
276+
"imageGeneration": "Bildgenerierung",
277+
"imageProvider": "Bild-Anbieter",
278+
"imageModel": "Bild-Modell",
279+
"imageModelHint": "Leer lassen für Standardmodell",
280+
"imageApiKey": "Bild API-Schlüssel",
281+
"imageApiKeyPlaceholder": "API Key für {{provider}}"
276282
},
277283
"shopping": {
278284
"title": "Einkaufsliste",

src/i18n/locales/en.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,13 @@
267267
"themeCustom": "Custom",
268268
"uploadCss": "Upload CSS file",
269269
"customCssLoaded": "CSS loaded",
270-
"customCssActive": "Custom CSS active ({{size}} characters)"
270+
"customCssActive": "Custom CSS active ({{size}} characters)",
271+
"imageGeneration": "Image Generation",
272+
"imageProvider": "Image Provider",
273+
"imageModel": "Image Model",
274+
"imageModelHint": "Leave empty for default model",
275+
"imageApiKey": "Image API Key",
276+
"imageApiKeyPlaceholder": "API Key for {{provider}}"
271277
},
272278
"shopping": {
273279
"title": "Shopping List",

src/i18n/locales/es.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,13 @@
267267
"themeCustom": "Personalizado",
268268
"uploadCss": "Subir archivo CSS",
269269
"customCssLoaded": "CSS cargado",
270-
"customCssActive": "CSS personalizado activo ({{size}} caracteres)"
270+
"customCssActive": "CSS personalizado activo ({{size}} caracteres)",
271+
"imageGeneration": "Generación de imágenes",
272+
"imageProvider": "Proveedor de imágenes",
273+
"imageModel": "Modelo de imagen",
274+
"imageModelHint": "Dejar vacío para modelo predeterminado",
275+
"imageApiKey": "Clave API de imagen",
276+
"imageApiKeyPlaceholder": "Clave API para {{provider}}"
271277
},
272278
"shopping": {
273279
"title": "Lista de compras",

src/pages/Settings.tsx

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ const INITIAL_PROVIDERS = [
1414
];
1515

1616
const IMAGE_PROVIDERS = [
17-
{ id: 'openai', name: 'OpenAI (DALL-E)', defaultModel: 'dall-e-3' },
18-
{ id: 'gemini', name: 'Gemini Imagen', defaultModel: 'gemini-2.0-flash-preview-image-generation' },
19-
{ id: 'stability', name: 'Stability AI', defaultModel: 'sd3.5-large' },
17+
{ id: 'openai', name: 'OpenAI (DALL-E)', models: ['dall-e-3', 'dall-e-2'] },
18+
{ id: 'gemini', name: 'Gemini Imagen', models: ['gemini-2.0-flash-preview-image-generation', 'imagen-3.0-generate-002'] },
19+
{ id: 'stability', name: 'Stability AI', models: ['sd3.5-large', 'sd3.5-medium', 'sd3-large'] },
2020
];
2121

2222
export default function Settings() {
@@ -339,13 +339,13 @@ export default function Settings() {
339339
<span className="bg-amber-100 text-amber-600 p-2 rounded-lg mr-3">
340340
<ImagePlus size={20} />
341341
</span>
342-
{t('settings.imageGeneration') || 'Bildgenerierung'}
342+
{t('settings.imageGeneration')}
343343
</h2>
344344

345345
<div className="space-y-4">
346346
<div>
347347
<label className="block text-sm font-medium text-gray-700 mb-1">
348-
{t('settings.imageProvider') || 'Anbieter'}
348+
{t('settings.imageProvider')}
349349
</label>
350350
<select
351351
value={settings.image_provider}
@@ -354,7 +354,7 @@ export default function Settings() {
354354
setSettings({
355355
...settings,
356356
image_provider: e.target.value,
357-
image_model: ''
357+
image_model: imgProvider?.models[0] || ''
358358
});
359359
}}
360360
className="w-full border border-gray-200 rounded-xl px-4 py-3 focus:ring-2 focus:ring-emerald-500 outline-none bg-white"
@@ -367,30 +367,32 @@ export default function Settings() {
367367

368368
<div>
369369
<label className="block text-sm font-medium text-gray-700 mb-1">
370-
{t('settings.imageModel') || 'Modell'}
370+
{t('settings.imageModel')}
371371
</label>
372-
<input
373-
type="text"
374-
value={settings.image_model}
372+
<select
373+
value={settings.image_model || currentImageProvider?.models[0] || ''}
375374
onChange={e => setSettings({...settings, image_model: e.target.value})}
376-
className="w-full border border-gray-200 rounded-xl px-4 py-3 focus:ring-2 focus:ring-emerald-500 outline-none"
377-
placeholder={currentImageProvider?.defaultModel || 'dall-e-3'}
378-
/>
375+
className="w-full border border-gray-200 rounded-xl px-4 py-3 focus:ring-2 focus:ring-emerald-500 outline-none bg-white"
376+
>
377+
{currentImageProvider?.models.map(m => (
378+
<option key={m} value={m}>{m}</option>
379+
))}
380+
</select>
379381
<p className="text-xs text-gray-500 mt-1">
380-
{t('settings.imageModelHint') || 'Leer lassen für Standardmodell'}
382+
{t('settings.imageModelHint')}
381383
</p>
382384
</div>
383385

384386
<div>
385387
<label className="block text-sm font-medium text-gray-700 mb-1 flex items-center">
386-
<Key size={14} className="mr-1" /> {t('settings.imageApiKey') || 'API-Schlüssel'}
388+
<Key size={14} className="mr-1" /> {t('settings.imageApiKey')}
387389
</label>
388390
<input
389391
type="password"
390392
value={settings.image_api_key}
391393
onChange={e => setSettings({...settings, image_api_key: e.target.value})}
392394
className="w-full border border-gray-200 rounded-xl px-4 py-3 focus:ring-2 focus:ring-emerald-500 outline-none"
393-
placeholder={`API Key für ${currentImageProvider?.name || 'OpenAI (DALL-E)'}`}
395+
placeholder={t('settings.imageApiKeyPlaceholder', { provider: currentImageProvider?.name || 'OpenAI' })}
394396
/>
395397
</div>
396398
</div>

0 commit comments

Comments
 (0)