Locales

Portuguese (Brazil) typography rules · pt-BR

Português (Brasil)

Portuguese (Brazil) sets primary quotation marks as “…” and secondary quotation marks as ‘…’. A break in a sentence is written with an en dash (U+2013) with a space on each side; no single range convention is verified, so none is substituted. Numbers bind to units such as % ‰ °C with U+00A0.

Updated · spec 1.12.0

Run polytypo with Portuguese (Brazil) rules

Edit the text and polytypo typesets it with the pt-BR locale, in your browser. The code under the form is the call that produces the result.

Runs in your browser. Nothing you paste is sent anywhere.

The call the form above is making, right now

Other locales, and all the options, are in the full playground.

Portuguese (Brazil) typography at a glance #

Tagpt-BR
NamePortuguese (Brazil)
Primary quotes“ U+201C left double quotation mark … ” U+201D right double quotation mark
Secondary quotes‘ U+2018 left single quotation mark … ’ U+2019 right single quotation mark
Parenthetical dashspaced en dash
Range dashno dash substitution
Rules with citationsquotes, dashes, ranges, ellipsis, hyphen, nbsp
Conformance cases19

Which locale tags resolve to Portuguese (Brazil)? #

The locale option is resolved exactly, then by declared alias, then by dropping the region once; anything else throws POLYTYPO_UNKNOWN_LOCALE.

TagHow it resolves
pt-BRregistered locale

Which quotation marks does Portuguese (Brazil) use? #

Primary“ U+201C left double quotation mark … ” U+201D right double quotation mark — no space inside the marks
Secondary‘ U+2018 left single quotation mark … ’ U+2019 right single quotation mark — no space inside the marks

Elision clitics

Word fragments that stand against an apostrophe at the edge of an inline span; a narrow mark next to one is not paired as a quotation.

Before the apostrophed n pel m t lh sant
After the apostrophenone

quotes

pt-br-quotes-primary
Ele disse "bom dia" e saiu.
Ele disse “bom dia” e saiu.
pt-br-quotes-nested
Escreveu: "Disse-me 'chego já' e desapareceu."
Escreveu: “Disse-me ‘chego já’ e desapareceu.”

How are apostrophes set in Portuguese (Brazil)? #

apostrophe

pt-br-apostrophe-elision
pinga d'água
pinga d’água

Which dashes does Portuguese (Brazil) use for breaks and ranges? #

Parenthetical break (dash.parenthetical)an en dash (U+2013) with a space on each side
Between numbers and dates (dash.range)no substitution: the locale has no verified convention, so the rule writes nothing

The dashes rule reads the parenthetical convention. The ranges rule reads the range convention and is off by default.

dashes

pt-br-dashes-parenthetical
As condições - ordenado e subvenções - eram boas.
As condições – ordenado e subvenções – eram boas.

How is the ellipsis set in Portuguese (Brazil)? #

An ellipsis keeps its full form after ! and ?; this locale does not abbreviate it there.

ellipsis

pt-br-ellipsis-three-dots
Espere... o quê?
Espere… o quê?
pt-br-ellipsis-not-abbreviated-after-terminal
É o dianho!..
É o dianho!…

How are hyphens handled in Portuguese (Brazil)? #

The hyphen lists are empty for this locale, so the hyphen rule changes nothing.

Where does Portuguese (Brazil) use no-break spaces? #

Characters that take U+00A0 before them (nbsp.beforePunctuation)none
Characters that take U+202F before them (nbsp.narrowBeforePunctuation)none
Short words after which the space becomes U+00A0, so the word is not left at the end of a line (nbsp.afterShortWords)none
Multi-token abbreviations whose internal spaces become U+00A0 (nbsp.abbreviations)p. ex.
Units and signs bound to the preceding number with U+00A0 (nbsp.beforeUnits)% ‰ °C km cm mm kg kW kWh Hz
Abbreviations bound to the following number with U+00A0 (nbsp.beforeNumber)p.
Abbreviations bound to the following word with U+00A0 (nbsp.beforeWord)none
Symbols bound to the following number with U+00A0 (nbsp.afterSymbols)none
Initials (nbsp.initialBinding)none — disabled: initials are never bound to the name that follows

spaces

pt-br-spaces-brackets-and-final-stop
O texto ( corrente ) não muda .
O texto (corrente) não muda.

nbsp

pt-br-nbsp-percent
7 % do volume de negócios
7 % do volume de negócios
pt-br-nbsp-celsius
a temperatura atingiu hoje os 39 °C
a temperatura atingiu hoje os 39 °C
pt-br-nbsp-abbreviation
p. ex. isto
p. ex. isto

How are symbols set in Portuguese (Brazil)? #

symbols

pt-br-symbols-copyright-and-dimensions
Copyright (c) 2026, formato 40x60 cm
Copyright © 2026, formato 40×60 cm

How does Portuguese (Brazil) text behave in text, HTML and Markdown modes? #

Each input is the locale's sample sentence followed by a code run, say("a -- b ..."). text mode sets the whole string as prose, code run included. In html and markdown mode the code run comes back byte for byte; only the prose is set.

text
Perguntou: "Não é esta a loja que chamam de 'a da esquina'?" ... Caminhamos -- quase 3 km -- e estava fechada. Copyright (c) 2026, formato 40x60 cm. say("a -- b ...")
Perguntou: “Não é esta a loja que chamam de ‘a da esquina’?” … Caminhamos – quase 3 km – e estava fechada. Copyright © 2026, formato 40×60 cm. say(“a – b …”)
html
<p>Perguntou: "Não é esta a loja que chamam de 'a da esquina'?" ... Caminhamos -- quase 3 km -- e estava fechada. Copyright (c) 2026, formato 40x60 cm.</p> <pre><code>say("a -- b ...")</code></pre>
<p>Perguntou: “Não é esta a loja que chamam de ‘a da esquina’?” … Caminhamos – quase 3 km – e estava fechada. Copyright © 2026, formato 40×60 cm.</p> <pre><code>say("a -- b ...")</code></pre>
markdown
Perguntou: "Não é esta a loja que chamam de 'a da esquina'?" ... Caminhamos -- quase 3 km -- e estava fechada. Copyright (c) 2026, formato 40x60 cm. `say("a -- b ...")`
Perguntou: “Não é esta a loja que chamam de ‘a da esquina’?” … Caminhamos – quase 3 km – e estava fechada. Copyright © 2026, formato 40×60 cm. `say("a -- b ...")`

How does Portuguese (Brazil) differ from Portuguese (Portugal)? #

pt-BR and pt-PT are separate locales. Fields whose values differ:

Fieldpt-BRpt-PT
quotes.primary.open“«
quotes.primary.close”»
quotes.secondary.open‘“
quotes.secondary.close’”
dash.parentheticalen-spacedem-spaced

The same input through both:

input
Perguntou: "Não é esta a loja que chamam de 'a da esquina'?" ... Caminhamos -- quase 3 km -- e estava fechada. Copyright (c) 2026, formato 40x60 cm.
pt-BR
Perguntou: “Não é esta a loja que chamam de ‘a da esquina’?” … Caminhamos – quase 3 km – e estava fechada. Copyright © 2026, formato 40×60 cm.
pt-PT
Perguntou: «Não é esta a loja que chamam de “a da esquina”?» … Caminhamos — quase 3 km — e estava fechada. Copyright © 2026, formato 40×60 cm.

Which sources define Portuguese (Brazil) typography? #

8 citations in spec/locales/pt-BR.json, grouped by the rule each one supports. A citation names the authority; the note records what the source does and does not settle.

ellipsis

  • Acordo Ortográfico da Língua Portuguesa (1990) e Código de Redação Interinstitucional (PT, 2022), ponto 10.4.7 «Reticências»: as reticências completas seguem-se imediatamente a «!» e a «?» («É o dianho!…», «porque não vais ter com o padre?…»); o Manual de Redação da Presidência da República não tem secção sobre reticências — o seu capítulo de pontuação (§9.2.4) trata apenas da vírgula, do ponto-e-vírgula, dos dois-pontos e dos pontos de interrogação e exclamação op.europa.eu

    Justifica abbreviatedAfterTerminal = false. O passo citado escreve as reticências completas imediatamente a seguir a «!» e a «?» — «!…» e «?…» —, e nenhuma fonte consultada prevê a forma abreviada de dois pontos que o russo usa, pelo que esse ramo de ellipsis.md fica desligado para o português. Nenhuma fonte se pronuncia sobre U+2026 contra três U+002E: essa escolha é do motor e é igual em todas as locales. Consultado em 18.9.2026. A fonte brasileira cala-se sobre as reticências, pelo que o valor vem do lado europeu; não há divergência a registar, há silêncio.

ranges

  • Nenhuma fonte brasileira consultada prescreve um sinal de intervalo diferente do hífen já escrito; o Manual de Redação da Presidência da República nada diz sobre intervalos

    dash.range = "none" por ausência de prescrição, e não por prescrição positiva como em pt-PT — a diferença de fundamento fica registada em vez de ser dissimulada. «none» preserva o que o autor escreveu, que é o comportamento seguro quando nenhuma fonte fala. Consultado em 18.9.2026.

dashes

  • Manual de Redação da Presidência da República (2.ª ed., 2002), §9.1.3.4 «Travessão»: «O travessão, que é um hífen prolongado (–), é empregado nos seguintes casos: a) substitui parênteses, vírgulas, dois-pontos: O controle inflacionário – meta prioritária do Governo – será ainda mais rigoroso» legis.sigepe.gov.br

    Justifica dash.parenthetical = "en-spaced", e é aqui que pt-BR diverge de pt-PT de forma mensurável. A LARGURA não foi julgada a olho: extraiu-se a camada de texto do PDF e o carácter do exemplo é U+2013, ao passo que o mesmo exemplo estrutural no guia europeu dá U+2014. O papel e o espaçamento coincidem nas duas regiões — o travessão substitui parênteses e leva um espaço de cada lado —, diverge a largura. Consultado em 18.9.2026.

hyphen

  • Acordo Ortográfico da Língua Portuguesa (1990), Base XX: «deve, por clareza gráfica, repetir-se o hífen no início da linha imediata»; Manual de Redação da Presidência da República (2.ª ed., 2002), §9.1.3.1, Observação: «Hífen de composição vocabular ou de ênclise e mesóclise é repetido quando coincide com translineação: decreto-/-lei, exigem-/-lhe, far-/-se-á» www.portaldalinguaportuguesa.org

    Justifica as três listas vazias, e justifica-as pela positiva, não por ausência de fonte. O português não só permite como PRESCREVE a quebra de linha sobre o hífen de um composto, repetindo-o na linha seguinte: uma forma que é normativamente quebrada nesse ponto não pode ser uma forma cujo hífen tenha de resistir à quebra, que é a única coisa que esta regra consome. A regra é, portanto, um no-op total demonstrável para o português (hyphen.md §2), e qualquer runtime que ligue compostos portugueses com U+2011 está errado. Corroborado pelo Código de Redação Interinstitucional (PT, 2022), ponto 10.2 e ponto 10.4.12 («segunda-/-feira», «salmão-do-/-atlântico»), e pelo Manual de Redação da Presidência da República (Brasil, 2.ª ed., 2002), §9.1.3.1 («decreto-/-lei», «far-/-se-á»). É o campo em que Portugal, o Brasil e o próprio Acordo dizem explicitamente a mesma coisa. Consultado em 18.9.2026.

quotes

  • Brasil, Presidência da República, Manual de Redação da Presidência da República, 2.ª ed. rev. e atual., Brasília 2002, §9.1.3.2 «Aspas»: «As aspas têm os seguintes empregos: a) usam-se antes e depois de uma citação textual», com os exemplos impressos «A Constituição […] afirma: “Todo o poder emana do povo, que o exerce por meio de representantes eleitos ou diretamente”», «publicado no “Jornal do Brasil”», «a alínea “a” do artigo 146 da Constituição» legis.sigepe.gov.br

    Primário U+201C/U+201D, secundário U+2018/U+2019, ambos colados ao texto. FONTE DE NÍVEL INFERIOR, dito sem rodeios: é o manual de redação de um editor estatal, não uma academia — a Academia Brasileira de Letras publica um vocabulário ortográfico, que é lexical e não trata de pontuação, e não foi encontrada fonte brasileira de nível académico que enuncie o par primário. O manual nunca usa aspas angulares em nenhuma das páginas lidas e o seu capítulo III declara-se derivado das gramáticas brasileiras (Bechara, Cegalla, Luft, Kury). DECISÃO DO OPERADOR, 18.9.2026: perante um uso regional atestado mas sem fonte de nível académico, ficheiro próprio com a fonte que existe, claramente identificada, em vez de deixar o Brasil cair no fallback de pt-PT e receber aspas angulares que não usa — a mesma decisão registada na issue #29, «corrige-se acrescentando locales». O nível secundário assenta no exemplo de citação dentro de citação, não numa frase de regra, e é por isso a afirmação mais fraca deste ficheiro. Consultado em 18.9.2026.

  • Acordo Ortográfico da Língua Portuguesa (1990), Base XVIII « Do apóstrofo », 1.º : a) « Faz-se uso do apóstrofo para cindir graficamente uma contração ou aglutinação vocabular, quando um elemento ou fração respetiva pertence propriamente a um conjunto vocabular distinto: d'Os Lusíadas, d'Os Sertões; n'Os Lusíadas, n'Os Sertões; pel'Os Lusíadas, pel'Os Sertões » ; b) « d'Ele, n'Ele, d'Aquele, n'Aquele, d'O, n'O, pel'O, m'O, t'O, lh'O » e a série feminina correspondente ; c) « Sant'Ana, Sant'Iago » ; d) « borda-d'água, copo-d'água, estrela-d'alva, mãe-d'água, pau-d'alho, pau-d'arco » www.priberam.pt

    Base XVIII is a primary normative text common to both orthographies, which is why pt-PT and pt-BR carry the identical list: d, n, pel (1.º a and b), m, t, lh (1.º b) and sant (1.º c). Base XVIII 2.º bounds the set from the other side — the apóstrofo is not admissible in the combinations of de and em with the definite-article forms (do, da, dele, no, na, nele, num and the rest) — so this is an enumerated set rather than an argument from silence. The archaic anthroponymic forms of 1.º c) (Nun'Álvares, Pedr'Eanes) are cited by the same clause but deliberately not listed: both have a letter on each side of the mark, so quotes.md §3.2's medial-elision veto already declines them and an entry would be evidenced-inert. after is empty: Portuguese enclisis takes a hyphen (Base XVII: amá-lo, dá-se), never an apostrophe. The clause that makes this list load-bearing is 1.º a), which is about book titles: a title set in emphasis rather than italics puts a span boundary immediately after the mark, d'<em>Os Lusíadas</em>, which is precisely the shape the veto reads. Retrieved from a faithful reproduction hosted by Priberam/FLiP, including the official text's own errata footnotes, rather than from the official gazette; the Academia Brasileira de Letras PDF has no extractable text layer. quotes.md §3.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md §3.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.

nbsp

  • BIPM, The International System of Units (SI), 9.ª ed., resumo conciso: «A single space is always left between the number and the unit»; Código de Redação Interinstitucional (PT, 2022), anexo A3, pontos 2 e 3, para a lista de símbolos www.bipm.org

    Justifica nbsp.beforeUnits. A locale atesta a PERTENÇA — que estes símbolos são unidades e que se escrevem depois do número com um espaço; o mecanismo (converter esse espaço em U+00A0, nunca o inserir) é da regra e está fixado em nbsp.md §2.1. REPARO CITADO, mais importante do que qualquer inclusão: o ponto 10.9.1 exclui «h» por nome — «horas (o símbolo «h» escreve-se sempre sem ponto, sem espaços): eram as 18h30» —, pelo que «h» NÃO entra na lista e há um caso de conformidade a fixá-lo. Os símbolos de uma só letra (m, g, l, t, s, A, W, V, K) ficam igualmente de fora, embora atestados, pela mesma razão que em fr: não são desambiguáveis sem contexto. Note-se que o português escreve «7 %» com espaço, ao contrário do grego. Consultado em 18.9.2026. Para pt-BR a lista é a mesma: nenhuma fonte brasileira consultada a contradiz, e o BIPM não é uma autoridade sobre o português mas sobre que cadeias são símbolos de unidade do SI.

  • Nenhuma fonte brasileira consultada exige espaço antes de pontuação dupla, nem ligação de abreviaturas a palavras ou iniciais; listas deliberadamente vazias

    Justifica as listas vazias e initialBinding = "none", e diz com exatidão em que se apoiam: ao contrário do guia grego, a parte portuguesa NÃO contém nenhuma frase que negue pelo nome o uso francês do espaço antes da pontuação dupla. A posição é «nenhuma fonte o exige», e não «uma fonte o proíbe»; o que se observa é que nenhum exemplo do capítulo o escreve, e isso é uma observação, assinalada como tal. beforeNumber contém apenas «p.»: o ponto 10.9.1 atesta a ligação («p. 24», «Lei n.º 123»), mas «n.º» NÃO pode ser listado, porque a nota (3) do ponto 6.4 do mesmo guia prescreve um «o» sobrescrito e RECUSA expressamente tanto U+00BA como U+00B0 — listar «n.º» seria citar uma fonte que proíbe esse mesmo carácter. A decisão do operador de 18.9.2026 sobre o «n°» francês cobre uma fonte SILENCIOSA e não se estende a uma que fala e recusa. beforeWord fica vazio: o anexo A3 enumera «Sr.», «Dr.», «Prof.», mas limita-se a expandi-los e nenhuma fonte os mostra ligados ao nome seguinte. GAP REGISTADO, não resolvido: o ponto 10.9.1 exige espaço protegido DENTRO dos grupos de algarismos («um total de 12 345 euros»; «este espaço é protegido»), e locale.schema.json não tem campo para isso. Consultado em 18.9.2026.

Already using polytypo? Add our badge

Two lines: a script tag and a span. No per-embed network call. Pick a language and a theme, then copy the code into your footer or credits. Embedding notes cover Content Security Policy. Sites with the badge are listed on Sites using polytypo.

<script async src="https://polytypo.dev/badge.js"></script>
<span data-polytypo-lang="en" data-polytypo-theme="light"></span>

Search runs in your browser. Nothing is sent anywhere.