The pronoun that gives you away: você vs tu
The fastest way to sound wrong is the word for "you." Brazil addresses users with você, which conjugates in the third person. Portugal's everyday register is tu, which takes a distinct second-person form.
en: "You have %lld new messages"
pt-BR: "Você tem %lld novas mensagens" // você + tem (3rd person)
pt-PT: "Tens %lld novas mensagens" // tu + tens (2nd person)
Same meaning, different verb. A Brazilian "Você tem" shipped to Lisbon isn't broken grammar — it just sounds like an app that wasn't built for them. This one choice ripples through every button, alert, and onboarding line, which is why variant awareness has to be set before translation, not patched after.
The vocabulary split
Beyond pronouns, the two variants reach for different everyday words — often exactly the app-relevant nouns sitting on your screens:
| English |
pt-BR (Brazil) |
pt-PT (Portugal) |
| file |
arquivo |
ficheiro |
| screen |
tela |
ecrã |
| mobile phone |
celular |
telemóvel |
| bus |
ônibus |
autocarro |
| to download |
baixar |
transferir / descarregar |
There is also a real spelling divide. Portugal keeps consonants Brazil dropped in pronunciation and spelling — a Settings screen lists a contato in Brazil but a contacto in Portugal. Autocorrect won't flag these; a native reader will, and they mark the build as imported.
Gerund: "fazendo" vs "a fazer"
Progress and status strings expose a structural difference on top of the vocabulary. Brazil uses the gerund; Portugal uses estar a plus the infinitive.
en: "Downloading the file…"
pt-BR: "Baixando o arquivo…" // gerund
pt-PT: "A transferir o ficheiro…" // estar a + infinitive
Notice that one short status line trips three splits at once — gerund vs infinitive, baixar vs transferir, arquivo vs ficheiro. That compounding is why half-localized Portuguese feels off even when each individual word is technically valid.
A real before/after, placeholder intact
Here is an actual iOS greeting localized to Brazilian Portuguese. The %@ (string) and %lld (integer) tokens survive untouched and in the order the format expects:
// en.lproj/Localizable.strings
"welcome_line" = "Hi %@, you have %lld messages";
// pt-BR.lproj/Localizable.strings
"welcome_line" = "Oi %@, você tem %lld mensagens";
strings.dev protects %@, %lld, %1$@, and Android's %s / %d / %1$s as opaque tokens, so translation never reorders or drops the arguments your String(format:) or getString() call depends on.
Which variant should you ship?
Advisory market context, not a rule: Brazil is one of the largest mobile markets in the world, and its user base dwarfs Portugal's. If you can ship only one Portuguese, most consumer apps start with pt-BR on reach alone. But a fintech, gov, or EU-facing product may need pt-PT first — and the professional move is to ship both as first-class locales rather than forcing one country to read the other's dialect.
|
pt-BR |
pt-PT |
| BCP-47 |
pt-BR |
pt-PT |
| Script |
Latin |
Latin |
| Default "you" |
você |
tu |
| "file" |
arquivo |
ficheiro |
| Progressive form |
baixando |
a transferir |
strings.dev ships each Portuguese variant as its own locale, so you're not renaming a single pt folder and hoping.
Plurals: one, many, other
Portuguese uses three CLDR cardinal plural categories: one, many, and other. In Brazilian Portuguese, one covers the small cases (including 0 and 1), many is reserved for large round values expressed in compact form (think millions), and everything else falls to other. You don't have to memorize the boundaries — the point is that a correct Portuguese build needs more than a naive singular/plural pair, and strings.dev generates the categories your platform's plural rules (.stringsdict on iOS, plurals on Android) actually query. See the locale-code reference for the exact identifiers.
Adding Portuguese to your project
Context matters: strings.dev feeds your app description into every translation, so tela renders as a UI screen and not a movie screen, and brand phrases you mark stay verbatim across both variants.
One honest note on tiers: the free Indie plan includes your first language. If Portuguese is a second language (or you want pt-BR and pt-PT alongside an existing locale), that's Indie Plus — $20/mo, or $10/mo billed annually — which unlocks unlimited languages, two projects, and a QA dashboard. Full breakdown on pricing, and you can localize your first language free at free app localization. New to the workflow? Start with the mobile app localization guide.