docs/localization-pt-br.md
Rama main · réplica de lectura del repositorio original.
# Brazilian Portuguese (pt-BR) style guide and glossary
This guide sets the voice, mechanics and terminology for OpenMausBot in
Brazilian Portuguese. It extends [`localization.md`](localization.md), which
covers the catalog workflow and checks. When this guide and the English source
disagree about meaning, English wins. When they disagree about wording, this
guide wins.
## Purpose and scope
The guide covers every string a person reads in pt-BR:
- the interface catalog, `src/locales/pt-br.json`;
- text in the Electron shell that appears outside the window: the menu bar,
the tray, dialogs and system notifications;
- server messages people see: `errorKey` and `textCode` messages carry
parameters and an English fallback for client translation; `serverLine`
messages arrive already localized for the person or conversation and must not
be translated again by the client.
It does not cover bot or system prompts, tool descriptions written for models,
logs, developer or CLI errors, emails sent by the control plane, the docs site
(`apps/docs`), `companion/` or `enterprise/`. Those stay in English.
## Voice and tone
- **Speak to the person as `você`.** Never use `tu`, `o senhor` or `a
senhora`. The app does not speak as `a gente`. When the company speaks
about itself, which is rare, it uses `nós` and `nosso`, as in
“Nosso provedor de hospedagem está reiniciando a máquina”.
- **Be friendly and professional.** Write the way a calm, competent colleague
talks. Avoid slang (`pra`, `tá`, `beleza`), exclamation marks, and
marketing excitement. Neither catalog uses exclamation marks.
- **No gerundismo.** Write “Vamos enviar o arquivo” or “O arquivo será
enviado”, never “Vamos estar enviando”. Use the gerund only for actions in
progress: “Enviando…”, “{name} está trabalhando…”.
- **Keep sentences short.** Split long English sentences when Portuguese needs
more words. Keep one idea per sentence and lead with the action or the
outcome.
- **Drop possessives Portuguese doesn't need.** Keep `seu` and `sua` when
ownership matters (“Sua chave fica neste computador”) and drop them when
context already says whose it is (“Escolha um plano” rather than “Escolha o
seu plano”).
- **Avoid verbs built from English.** Write `excluir`, not `deletar`;
`redefinir`, not `resetar`; `entrar` or `fazer login`, not `logar`;
`definir`, not `setar`. Loanwords that Brazilians use every day are fine:
`app`, `backup`, `chat`, `link`, `login` (as a noun), `download` (as a noun).
- **Errors say what happened and what to do.** Use the established pattern
“Não foi possível {verbo}…”, followed by the next step. Don't
write “Falha ao…” or “Erro ao…” in everyday copy.
## Mechanics
### Actions and labels
- **Buttons, menu items, toggles and action tooltips use the infinitive:**
“Conectar ao servidor”, “Criar código de pareamento”, “Tentar novamente”.
- **Instructions in sentences use the imperative with `você`:** “Abra o
Terminal e rode o comando.” Titles that invite the person to a step may use
it too (“Escolha um plano”). Never use the imperative on a button.
- **Use sentence case everywhere,** including titles, tabs and menus.
Capitalize only the first word and proper names: “Modo avançado”, “Mapa da
equipe”, “Desktops dos bots”.
- **Use lower case for months and weekdays** (`outubro`, `segunda-feira`) and
for languages and nationalities inside sentences.
- **Name controls exactly as they are labelled.** Copy that points at a
control, page or menu uses the control's pt-BR label verbatim, the same rule
`vocabulary.test.ts` enforces for English. Put a single label in curly
quotes: Clique em “Entrar novamente”. Write a path with arrows and no
quotes: Abra Configurações → Logins. When the target UI isn't localized, such
as the Admin console, keep its English label (“Admin → Packages”). Don't
leave a pt-BR control's English label behind: escolha “Add a Cloud” should
be escolha “Adicionar um Cloud”.
### Punctuation
- **Quotes:** use typographic double quotes “ ”, and ‘ ’ inside them. Keep
straight `"` only inside code, JSON and commands.
- **Ellipsis:** use the single character `…`, never `...`, with no space
before it. Use it where English does: progress labels
(“Carregando…”), menu items that open a dialog (“Adicionar um Cloud…”) and
truncated examples.
- **Em dash:** use it only where English does, with spaces on both sides.
Prefer a comma, colon or full stop when the dash only joins two clauses. The
welcome flow (`onboarding.*`) never uses em dashes, which mirrors
`words.test.ts`.
- **After a colon,** continue in lower case unless a proper name or a full
quoted label follows.
- **Keep the Unicode arrow →** in navigation paths, the middle dot `·` in
compact metadata, and `⌘`, `⇧` and key names (`Enter`, `Shift`, `Esc`)
unchanged.
### Numbers, dates and units
- **Decimals take a comma and thousands take a point:** `1,5 s`, `8.000
caracteres`, `1.440`. Version numbers, IP addresses and code keep their dots
(`Ubuntu 24.04`, `1.0.41`). If an input field only accepts a dot, don't
show a format it rejects; flag the field instead.
- **Put a space between a number and its unit** (`10 MB`, `5 min`, `1,5 s`),
but not before `%` (`{percent}%`).
- **Dates and times come preformatted** in placeholders such as `{date}` and
`{time}`. Never assemble them by hand. Write the surrounding words for the
24-hour clock and Brazilian order: “às {time}”, “em {date}”, “até {date}”.
If a placeholder shows an English date or an AM/PM time in the pt-BR app,
report a formatting bug; don't work around it in the catalog.
- **Prices come preformatted in `{price}`.** Don't add `R$` or `US$`. Write
“{price}/mês, mais impostos”.
- **Prefer “24 horas por dia” in sentences;** `24/7` is fine in tight labels.
### Placeholders
- **Keep every `{placeholder}` exactly, including repeats.** `pnpm
i18n:check` rejects any change. Never translate the name inside the braces.
- **Put no article before a bot's or a person's name:** “Diga oi a {name}”,
“as habilidades de {name}”, not “ao {name}” or “do {name}”. A bot can have
any name, and `o Ana` is wrong.
- **Products with a fixed gender take their article:** “o Claude”, “o
Codex”, “o OpenMausBot”, “o Cloud”. Use an article before `{engine}`,
`{app}` or `{provider}` only when every possible value takes it.
Otherwise, rephrase with `de`: “a conta de {provider}”, “o limite de
{engine}”.
- **Keep gendered words away from a placeholder that names a bot.** Write
“{name} já pode trabalhar” or “Tudo pronto com {name}” instead of “{name}
está pronto”. When agreement can't be avoided, agree with the noun `bot`:
“O bot {name} está pronto”.
- **Write sentences that survive an English value.** Some parameters, such as
`{reason}`, `{error}` and `{status}`, can reach the client in English. Set
them apart (“Motivo: {reason}”) instead of weaving them into a sentence.
### Grammatical gender of product nouns
Masculine: `o bot`, `o app`, `o Cloud`, `o MausBot Cloud`, `o desktop`, `o
navegador`, `o backup`, `o login`, `o webhook`, `o playbook`, `o plugin`, `o
Marketplace`, `o gatilho`, `o modelo`, `o provedor`, `o plano`, `o
servidor`.
Feminine: `a IA`, `a conversa`, `a habilidade`, `a rotina`, `a automação`, `a
equipe`, `a instalação`, `a VM local`, `a chave de API`, `a conta`, `a
ferramenta`, `a memória`, `a predefinição`, `a chamada`, `a sessão`.
Pronouns for a bot follow `o bot`: “ele”, “dele”, “as conversas dele”.
## Plain words, mirrored from English
English copy follows plain-words rules enforced by `everyday-words.test.ts`,
`welcome-words.test.ts`, `words.test.ts` and `vocabulary.test.ts`. No test
checks pt-BR words yet, so reviewers must check them by hand. Wherever the
English avoids an internal word, the Portuguese avoids it too:
| The English avoids | So pt-BR never writes | Write instead |
|---|---|---|
| engine | `motor`, `mecanismo`, `engine` | `IA` |
| instance | `instância` | `conta de IA` |
| server (on everyday screens) | `servidor` | `o app`, or `o Cloud` when it is hosted. `servidor MCP` and Discord or Slack servers keep the word. |
| Composio | `Composio` | `apps conectados` |
| cloud computer | `computador na nuvem` | `desktop na nuvem` |
| VPS | `VPS` | `sua própria máquina` |
| Local VM (on everyday screens) | `VM local` | `desktop privado` |
| workspace | `espaço de trabalho`, `workspace` | `instalação`, or leave it out |
Everyday screens are the key prefixes listed in `everyday-words.test.ts`:
chat, composer, approvals, sign-in, Today, notifications, the sidebar, the bot
panel, the Screen panel, MausBot Cloud flows, routines and automations, the
team map, Apps, and the Settings pages that Simple mode shows. On technical
screens, translate faithfully whatever the English says. For example,
`servidor` and `VM local` are correct there.
Three English words are scheduled to retire (they are `it.todo` in
`everyday-words.test.ts`). The pt-BR copy can already use the replacements
when it doesn't point at a control labelled with the old word:
- “This computer” → “este Mac” or “este PC” where the platform is known;
- “My Cloud” → “o Cloud”;
- “lend”, “lent” and “lending” → `compartilhar` or “deixar … usar”. Never
write `emprestar`.
On the welcome screens (`onboarding.*` and `cloudWelcome.*`), `computador`
means only the person's own device (“este computador”, “seu computador”).
## Names kept as they are
These stay unchanged in every pt-BR string.
| Name | Why |
|---|---|
| OpenMausBot, MausBot | Product names. Never write `OMB` or `T3` (`vocabulary.test.ts`). |
| MausBot Cloud | Product name. `vocabulary.test.ts` requires it verbatim in every translation whose English contains it. Never write `OpenMausBot Cloud` or `MausBot Pro`. Treat it as masculine: “o MausBot Cloud”. |
| Cloud (short for MausBot Cloud) | Product name, masculine: “o Cloud”, “no Cloud”. The generic sky-and-servers cloud is `nuvem`: “desktop na nuvem”. |
| Boat | Name of a third-party provider. Write it only where the English says Boat; the test fails otherwise. |
| Jev, Maus, Grok Bot | Names of product features or characters. |
| Claude, Claude Code, ChatGPT, Codex, Grok, Gemini, Cursor, OpenCode, Antigravity, OpenAI, Anthropic, xAI, OpenRouter, Ollama, Groq, Cerebras | Third-party product and company names. |
| Slack, Discord, Telegram, WhatsApp, Gmail, Notion, GitHub, Chrome, Tailscale, Cloudflare Tunnel, Docker, Podman, Whop, Product Hunt | Third-party product names. |
| Admin, and labels inside the Admin console | The Admin console is not localized, so pointers keep its English labels. |
| `SKILL.md`, `MEMORY.md`, `config.toml`, `.ombbackup`, commands, paths, URLs, environment variables, keyboard keys | Code and file names. |
| MCP, API, CLI, URL, HTTPS, DNS, SSH, USB, ID, CSV, PNG, JPEG | Standard abbreviations. Use `IA` for AI, never `AI`. |
| Apps, Logins, Webhooks, Playbooks, Plugins, Marketplace, Backups | Section names that are also everyday Brazilian loanwords. Lower case inside sentences: “seus apps”, “um webhook”. |
Names of macOS and Windows settings follow Apple's and Microsoft's own pt-BR
wording. Examples: “Ajustes do Sistema → Privacidade e Segurança”, “Gravação
de Tela”, “Acessibilidade”, “Teclado”, “Finder”, “Terminal” on macOS;
“Configurações” and “Explorador de Arquivos” on Windows.
## Glossary
Change a term only after agreement with the pt-BR reviewers, and then update
the whole catalog in the same change.
| English | pt-BR | Notes |
|---|---|---|
| account | conta | “conta de IA” replaces “instance”. |
| Advanced mode | Modo avançado | Simple mode, if it is ever labelled: “Modo simples”. |
| agent | agente | Only where the English says agent. A bot is always `bot`. |
| AI | IA | Feminine: “a IA”, “as IAs”, “IA local”. Never `AI`, even if a draft tool keeps it. |
| API key | chave de API | Not “API key”. |
| app, apps | app, apps | Masculine. Not `aplicativo`. “Connected apps” → “Apps conectados”. |
| approval, approve | aprovação, aprovar | “Ask for approval” → “Pedir aprovação”; “approval level” → “nível de aprovação”. |
| Auto (mode) | Auto | Chip and room mode. “Automatic” in full → “Automático”. |
| automation | automação | Plural `automações`. Distinct from routine. |
| backup | backup | Masculine. “Restore” → “restaurar”. Not “cópia de segurança”. |
| bot | bot | Masculine. Never `robô` or `agente`. |
| brief | resumo | A bot's brief: “Brief” → “Resumo”. |
| browser | navegador | |
| call (voice) | chamada | “tool call” → “chamada de ferramenta”. Not “ligação”. |
| chat (the screen) | chat | The chat surface: “no chat”, “Abrir o chat”. A single thread is a `conversa`. |
| Chief of Staff | chefe de gabinete | Role label: “Chefe de gabinete”; “Make Chief of Staff” → “Tornar chefe de gabinete”. |
| Cloud (MausBot Cloud) | Cloud | Masculine: “o Cloud”. Generic cloud → `nuvem`. |
| cloud desktop | desktop na nuvem | Never “computador na nuvem”. |
| company | empresa | Organization → `organização`. |
| computer | computador | “This computer” (place) → “Este computador”; “this Mac” → “este Mac”. |
| connect, disconnect | conectar, desconectar | For apps, servers and devices. Signing in to an account is `entrar`. |
| conversation | conversa | Same word as thread. |
| delete | excluir | Destroys something. Different from remove. Never `deletar`. |
| department | equipe | Same word as team. The sidebar's groups of bots: “New department…” → “Nova equipe…”. |
| desktop (a bot's desktop) | desktop | Masculine. “Bot desktops” → “Desktops dos bots”. |
| desktop app | app para computador | Avoids a clash with the bot's desktop. The OS Desktop folder keeps the platform name: “Mesa” on macOS, “Área de Trabalho” on Windows. |
| device | dispositivo | “paired device” → “dispositivo pareado”. |
| download | baixar (verb), download (noun) | “Baixe o original”; “o download terminou”. |
| email | e-mail | With a hyphen. |
| enable, disable | ativar, desativar | Follow the English verb. See also turn on. |
| engine | IA | Never `motor` or `mecanismo`. “fallback engine” → “IA reserva”. |
| file, folder | arquivo, pasta | Never `ficheiro`. |
| installation | instalação | Replaces “workspace”. |
| instructions | instruções | “standing instructions” → “instruções permanentes”. |
| Live | Ao vivo | |
| Local VM | VM local | Technical screens only. Everyday screens: “desktop privado”. |
| Logins (saved site logins) | Logins | A single one is `login`. “Settings → Logins” → “Configurações → Logins”. |
| Marketplace | Marketplace | Masculine. |
| model | modelo | AI model. Template is also `modelo` (see template). |
| model provider | provedor de modelos | “provider” alone → `provedor`. |
| My Cloud | My Cloud | A place name, masculine (“o My Cloud”). It must match the Electron menu label. Prefer “o Cloud” in copy that doesn't point at the control. |
| On, Off | Ligado, Desligado | Toggle states. |
| pair, pairing | parear, pareamento | Never `emparelhar`. “pairing link” → “link de pareamento”. |
| passkey | chave de acesso | Google's pt-BR term. |
| phone | celular | The person's phone. `telefone` only for phone numbers. |
| plan | plano | “Plan page” → “página do Plano”. |
| playbook | playbook | Masculine. |
| plugin | plugin | Masculine. |
| preset | predefinição | “preset bot” → “bot predefinido”. Never `modelo`. |
| preview | prévia | “View” as a button → `Ver`. |
| private desktop | desktop privado | |
| Quit (app menu, tray) | Sair do OpenMausBot | The same label on every platform. Menus use sentence case, like the rest of the app. |
| remove | remover | Takes something out without destroying it. |
| retry, try again | Tentar novamente | Use “novamente” in labels and prose. If it would repeat in one sentence, use “de novo” for the first occurrence. |
| room | grupo | “group chat” → “chat em grupo”. Not `sala`. |
| routine | rotina | Scheduled work. Distinct from automation. |
| run | rodar or executar | Bots and routines `rodam`; commands, code and tools are `executados`; the noun “a run” → “execução”. |
| Screen (panel) | Tela | “the Screen panel” → “o painel Tela”. |
| search | buscar, busca | Labels: “Buscar…”. |
| server | servidor | Technical screens only (see plain words). “MCP server” → “servidor MCP”. |
| Settings (this app) | Configurações | The macOS app menu item “Preferences…” → “Configurações…” too. |
| share | compartilhar | Never `partilhar`. |
| sign in | entrar | Buttons: “Entrar”, “Entrar no Cloud”. In prose, use “fazer login” where `entrar` could mean going into a place. |
| sign-in (noun) | login | “browser sign-ins” → “logins do navegador”. |
| sign-in code | código de login | Not “código de acesso”, which sounds like passkey (“chave de acesso”). |
| sign out | sair | “Sign out of the Cloud” → “Sair do Cloud”. |
| skill | habilidade | Plural `habilidades`. `SKILL.md` and command names stay. |
| Soul (bot setting) | Essência | |
| System Settings (macOS) | Ajustes do Sistema | Apple's name. Windows Settings → “Configurações”. |
| tab | aba | Not `guia`. |
| team | equipe | Not `time`. “teammate” → `colega`. |
| Team map | Mapa da equipe | |
| template | modelo | “Templates” section → “Modelos”. Say “modelo de IA” if a sentence mentions both. |
| thread | conversa | Not `thread` or `tópico`. |
| trace (usage) | rastreamento | “View trace” → “Ver rastreamento”. |
| trial | teste | “free trial” → “teste grátis”; “trial credit” → “crédito do teste”. |
| trigger | gatilho | |
| turn (a bot's turn) | sessão | Feminine. Use “sessão de trabalho” only when the sentence also mentions a browser, sign-in or provider session. For calls, use “Um de cada vez” as the mode label and “falas alternadas” when describing it. |
| turn on, turn off | ligar, desligar | Follow the English verb. |
| upload | enviar | Never `upload` or `carregar`. |
| Vault (Settings section) | Cofre | “Settings → Vault” → “Configurações → Cofre”. A saved key there is a `segredo`. |
| wake, asleep | acordar, dormindo | Used for desktops and computers. |
| webhook | webhook | Masculine. |
| workspace | (do not use) | Say `instalação`, or leave it out. |
## Plurals
`t()` has no plural support. It replaces `{count}` and nothing else.
- **Key pairs.** English splits singular and plural into two keys, such as
`…One` and `…Many`, and the code picks `One` only when the count is exactly
1. Translate each key with its own grammar: “1 automação roda antes disso” /
“{count} automações rodam antes disso”.
- **Zero uses the plural key,** which is natural in Brazilian Portuguese (“0
bots”). When the English has a separate empty-state key, write it with
`Nenhum`/`Nenhuma` or `Ainda não`: “Nenhum modelo encontrado”, “Nada
agendado ainda”.
- **One key for any count.** Some English values use `(s)`. Don't copy `(s)`
into Portuguese, where agreement spreads it across the phrase (“{count}
bot(s) arquivado(s) continuarão arquivados”). Rephrase as a label and a
number, which reads correctly for any count:
- “{count} bot(s)” → “Bots: {count}”
- “{count} paused routine(s)” → “Rotinas pausadas: {count}”
- “{count} archived bot(s) will remain archived.” → “Bots que continuam
arquivados: {count}.”
- “{bots} bot(s) · {conversations} conversation(s)” → “Bots: {bots} ·
Conversas: {conversations}”
If a sentence really needs a number in the middle, ask for a singular and
plural key pair in the English source rather than writing `(s)`.
## How to edit the pt-BR catalog
1. Edit `src/locales/pt-br.json` by hand. Keep every key identical to an
English key and every placeholder unchanged. Don't add keys that English
doesn't have.
2. Re-accept the edited values against their current English source:
```sh
node scripts/generate-locale.mjs pt-br --accept
pnpm i18n:check
```
3. Run the locale guards and the component tests that pin pt-BR values:
```sh
pnpm exec vitest run src/locales src/lib/i18n.test.ts \
src/components/ApprovalModeSelector.i18n.test.ts \
src/components/ComputerPanel.i18n.test.ts \
src/components/PluginsPanel.i18n.test.ts \
src/components/SettingsModal.i18n.test.ts \
src/components/Sidebar.i18n.test.ts \
src/lib/chat-copy.i18n.test.ts
```
If a value you changed on purpose is pinned in one of these tests, update
the test with it.
4. Check the screens you changed in pt-BR on an isolated test instance, never
your own app or data. See [`verification/README.md`](verification/README.md).
5. Commit `src/locales/source-hashes.json` together with the catalog.
6. A Brazilian Portuguese speaker reviews the change before it merges, as
`CONTRIBUTING.md` requires. Model drafts are drafts, not authorities: check
each one against this guide.
When English copy changes, `pnpm i18n:check` marks the old translation stale.
Re-translate it from the new English instead of re-accepting it unchanged.
Like every other pack, pt-BR may lag behind English: a missing key reads in
English until it is translated, and `pnpm i18n:check` doesn't fail on it. To
catch up, `node scripts/generate-locale.mjs pt-br` drafts missing and stale
keys; translate or review them and accept them as above. Drafts for pt-BR ask
the model for `IA` and the core terms of this glossary, but still check each
one against it.