feat(i18n): migrate hardcoded German strings to t() across 104 components/pages — AST-based batch with re-parse gate, 423 new de.json keys; tsc clean; vitest failures byte-identical to clean-tree baseline (pre-existing)

This commit is contained in:
Agent Zero
2026-08-27 01:43:06 +02:00
parent 5680179260
commit 4cb5298768
105 changed files with 1204 additions and 459 deletions
+9 -9
View File
@@ -215,7 +215,7 @@ function AutomationForm({
onChange={(e) => updateField('name', e.target.value)}
required
className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
placeholder="My Automation"
placeholder={t('automationDashboard.myautomation')}
/>
</div>
<div>
@@ -227,7 +227,7 @@ function AutomationForm({
onChange={(e) => updateField('description', e.target.value)}
rows={2}
className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
placeholder="Optional description"
placeholder={t('automationDashboard.optionaldescription')}
/>
</div>
</div>
@@ -255,7 +255,7 @@ function AutomationForm({
value={form.trigger_config.event_name || ''}
onChange={(e) => updateField('trigger_config', { ...form.trigger_config, event_name: e.target.value })}
className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
placeholder="contact.created"
placeholder={t('automationDashboard.contactcreated')}
/>
</div>
)}
@@ -271,7 +271,7 @@ function AutomationForm({
className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
placeholder="0 9 * * *"
/>
<p className="text-xs text-secondary-400 mt-1">Cron expression (e.g. 0 9 * * * for daily at 9am)</p>
<p className="text-xs text-secondary-400 mt-1">{t('automationDashboard.cronexpressioneg09')}</p>
</div>
)}
@@ -294,7 +294,7 @@ function AutomationForm({
type="text"
value={cond.field}
onChange={(e) => updateCondition(i, 'field', e.target.value)}
placeholder="Field"
placeholder={t('automationDashboard.field')}
className="flex-1 rounded-lg border border-secondary-300 px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
/>
<Select
@@ -307,14 +307,14 @@ function AutomationForm({
type="text"
value={cond.value}
onChange={(e) => updateCondition(i, 'value', e.target.value)}
placeholder="Value"
placeholder={t('automationDashboard.value')}
className="flex-1 rounded-lg border border-secondary-300 px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
/>
<button
type="button"
onClick={() => removeCondition(i)}
className="text-danger-500 hover:text-danger-700 p-1"
aria-label="Remove condition"
aria-label={t('automationDashboard.removecondition')}
>
<XCircle className="h-4 w-4" />
</button>
@@ -353,14 +353,14 @@ function AutomationForm({
// ignore invalid JSON while typing
}
}}
placeholder='{"url": "..."}'
placeholder={t('automationDashboard.url')}
className="flex-1 rounded-lg border border-secondary-300 px-3 py-1.5 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary-500"
/>
<button
type="button"
onClick={() => removeAction(i)}
className="text-danger-500 hover:text-danger-700 p-1"
aria-label="Remove action"
aria-label={t('automationDashboard.removeaction')}
>
<XCircle className="h-4 w-4" />
</button>