refactor: move onboarding brand form translations out of settings.brand

The onboarding Brand page was reusing settings.brand.* keys, which
coupled two unrelated pages: a rename in Settings would silently break
onboarding, and the two pages might want to diverge copy later (e.g.
more welcoming language during first-run vs terse settings labels).

Duplicated the relevant keys (field labels, placeholders, tone
options, content language copy) into onboarding.brand.* across
en/pt-BR/es. The Settings workspace page keeps using
settings.brand.* — they're the source of truth for that page now.

No behavior change; just separation of ownership.
This commit is contained in:
Paulo Castellano 2026-04-16 11:18:18 -03:00
parent a65632d580
commit 9c80b6cfce
4 changed files with 67 additions and 16 deletions

View file

@ -48,6 +48,23 @@
'autofill_error' => 'We could not read that site. Please fill in manually.',
'autofill_missing_url' => 'Add your website URL first.',
'logo_captured' => 'Logo captured from your site.',
'website' => 'Website',
'website_placeholder' => 'https://yourbrand.com',
'brand_description' => 'Description',
'brand_description_placeholder' => 'Tell us about your brand, what you do, and who your audience is...',
'tone' => 'Tone of voice',
'tone_professional' => 'Professional',
'tone_casual' => 'Casual',
'tone_friendly' => 'Friendly',
'tone_bold' => 'Bold',
'tone_inspirational' => 'Inspirational',
'tone_humorous' => 'Humorous',
'tone_educational' => 'Educational',
'voice_notes' => 'Voice notes',
'voice_notes_placeholder' => 'Additional writing guidelines, words to avoid, style preferences...',
'content_language' => 'Content language',
'content_language_description' => 'Language used for AI-generated captions, hashtags, and any text inside generated images or videos.',
],
'connect' => [

View file

@ -48,6 +48,23 @@
'autofill_error' => 'No pudimos leer ese sitio. Complétalo manualmente.',
'autofill_missing_url' => 'Ingresa primero la URL de tu sitio.',
'logo_captured' => 'Logo capturado desde tu sitio.',
'website' => 'Sitio web',
'website_placeholder' => 'https://tumarca.com',
'brand_description' => 'Descripción',
'brand_description_placeholder' => 'Cuéntanos sobre tu marca, lo que haces y quién es tu audiencia...',
'tone' => 'Tono de voz',
'tone_professional' => 'Profesional',
'tone_casual' => 'Casual',
'tone_friendly' => 'Amigable',
'tone_bold' => 'Audaz',
'tone_inspirational' => 'Inspirador',
'tone_humorous' => 'Humorístico',
'tone_educational' => 'Educativo',
'voice_notes' => 'Notas de voz',
'voice_notes_placeholder' => 'Directrices adicionales de escritura, palabras a evitar, preferencias de estilo...',
'content_language' => 'Idioma del contenido',
'content_language_description' => 'Idioma usado en los subtítulos, hashtags y cualquier texto dentro de imágenes o videos generados por IA.',
],
'connect' => [

View file

@ -48,6 +48,23 @@
'autofill_error' => 'Não conseguimos ler esse site. Preencha manualmente.',
'autofill_missing_url' => 'Informe a URL do seu site primeiro.',
'logo_captured' => 'Logo capturado do seu site.',
'website' => 'Site',
'website_placeholder' => 'https://suamarca.com',
'brand_description' => 'Descrição',
'brand_description_placeholder' => 'Conte sobre sua marca, o que você faz e quem é seu público...',
'tone' => 'Tom de voz',
'tone_professional' => 'Profissional',
'tone_casual' => 'Casual',
'tone_friendly' => 'Amigável',
'tone_bold' => 'Ousado',
'tone_inspirational' => 'Inspirador',
'tone_humorous' => 'Bem-humorado',
'tone_educational' => 'Educacional',
'voice_notes' => 'Notas de voz',
'voice_notes_placeholder' => 'Diretrizes adicionais de escrita, palavras a evitar, preferências de estilo...',
'content_language' => 'Idioma do conteúdo',
'content_language_description' => 'Idioma usado nas legendas, hashtags e em qualquer texto dentro de imagens ou vídeos gerados por AI.',
],
'connect' => [

View file

@ -117,13 +117,13 @@ const runAutofill = async () => {
>
<form class="flex flex-col gap-5" @submit.prevent="submit">
<div class="grid gap-2">
<Label for="brand_website">{{ $t('settings.brand.website') }}</Label>
<Label for="brand_website">{{ $t('onboarding.brand.website') }}</Label>
<div class="flex gap-2">
<Input
id="brand_website"
v-model="form.brand_website"
type="url"
:placeholder="trans('settings.brand.website_placeholder')"
:placeholder="trans('onboarding.brand.website_placeholder')"
class="flex-1"
/>
<Button
@ -145,11 +145,11 @@ const runAutofill = async () => {
</div>
<div class="grid gap-2">
<Label for="brand_description">{{ $t('settings.brand.brand_description') }}</Label>
<Label for="brand_description">{{ $t('onboarding.brand.brand_description') }}</Label>
<Textarea
id="brand_description"
v-model="form.brand_description"
:placeholder="trans('settings.brand.brand_description_placeholder')"
:placeholder="trans('onboarding.brand.brand_description_placeholder')"
rows="3"
/>
<InputError :message="form.errors.brand_description" />
@ -157,26 +157,26 @@ const runAutofill = async () => {
<div class="grid gap-4 sm:grid-cols-2">
<div class="grid gap-2">
<Label for="brand_tone">{{ $t('settings.brand.tone') }}</Label>
<Label for="brand_tone">{{ $t('onboarding.brand.tone') }}</Label>
<Select v-model="form.brand_tone">
<SelectTrigger id="brand_tone" class="w-full">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="professional">{{ $t('settings.brand.tone_professional') }}</SelectItem>
<SelectItem value="casual">{{ $t('settings.brand.tone_casual') }}</SelectItem>
<SelectItem value="friendly">{{ $t('settings.brand.tone_friendly') }}</SelectItem>
<SelectItem value="bold">{{ $t('settings.brand.tone_bold') }}</SelectItem>
<SelectItem value="inspirational">{{ $t('settings.brand.tone_inspirational') }}</SelectItem>
<SelectItem value="humorous">{{ $t('settings.brand.tone_humorous') }}</SelectItem>
<SelectItem value="educational">{{ $t('settings.brand.tone_educational') }}</SelectItem>
<SelectItem value="professional">{{ $t('onboarding.brand.tone_professional') }}</SelectItem>
<SelectItem value="casual">{{ $t('onboarding.brand.tone_casual') }}</SelectItem>
<SelectItem value="friendly">{{ $t('onboarding.brand.tone_friendly') }}</SelectItem>
<SelectItem value="bold">{{ $t('onboarding.brand.tone_bold') }}</SelectItem>
<SelectItem value="inspirational">{{ $t('onboarding.brand.tone_inspirational') }}</SelectItem>
<SelectItem value="humorous">{{ $t('onboarding.brand.tone_humorous') }}</SelectItem>
<SelectItem value="educational">{{ $t('onboarding.brand.tone_educational') }}</SelectItem>
</SelectContent>
</Select>
<InputError :message="form.errors.brand_tone" />
</div>
<div class="grid gap-2">
<Label for="content_language">{{ $t('settings.brand.content_language') }}</Label>
<Label for="content_language">{{ $t('onboarding.brand.content_language') }}</Label>
<Select v-model="form.content_language">
<SelectTrigger id="content_language" class="w-full">
<SelectValue />
@ -192,15 +192,15 @@ const runAutofill = async () => {
</div>
<p class="-mt-2 text-xs text-muted-foreground">
{{ $t('settings.brand.content_language_description') }}
{{ $t('onboarding.brand.content_language_description') }}
</p>
<div class="grid gap-2">
<Label for="brand_voice_notes">{{ $t('settings.brand.voice_notes') }}</Label>
<Label for="brand_voice_notes">{{ $t('onboarding.brand.voice_notes') }}</Label>
<Textarea
id="brand_voice_notes"
v-model="form.brand_voice_notes"
:placeholder="trans('settings.brand.voice_notes_placeholder')"
:placeholder="trans('onboarding.brand.voice_notes_placeholder')"
rows="3"
/>
<InputError :message="form.errors.brand_voice_notes" />