Skip to content

Romanization (burmesenlp.transliterate)

Burmese-to-Latin romanization using BGN/PCGN, the 1970 US Board on Geographic Names / UK Permanent Committee on Geographical Names agreed system -- a place-name-oriented, tone-dropping system, not MLC's own MLCTS standard (which marks tone and is orthography- rather than pronunciation-based). Only BGN/PCGN is implemented; do not assume this output is authoritative for formal Myanmar-language publishing.

from burmesenlp import romanize

romanize("ရန်ကုန်")            # "yangôn"  (Yangon)
romanize("ပြင်ဦးလွင်")         # "pyinulwin"  (Pyin Oo Lwin)
romanize("မင်္ဂလာ")            # "mingala"

Source

Read directly from the primary document, not a paraphrase: the joint US/UK PDF "ROMANIZATION OF BURMESE, BGN/PCGN 1970 Agreement" (checked for validity and accuracy, October 2017): https://assets.publishing.service.gov.uk/media/5ab4dec7ed915d78bc23450f/ROMANIZATION_OF_BURMESE.pdf (byte-identical US mirror at https://geonames.nga.mil/geonames/GNSSearch/GNSDocs/romanization/ROMANIZATION_OF_BURMESE.pdf).

Verified against the source document's own worked examples (its Notes 2-5): မဒမ→madama, အက→aga, ကလိ→kali, သာငယ်→thangè, အိုဘဲ့→obè, အပ်→at, သဒ္ဓ→thadda — and, independently, against the well-known place names ရန်ကုန်→Yangon and ပြင်ဦးလွင်→Pyin Oo Lwin. All of these are regression tests in tests/test_transliterate.py.

Measured coverage

Running romanize() over all ~24k bundled-lexicon words and checking for leftover unromanized Myanmar characters in the output: 99.83% (23,846 / 23,886) romanize completely. The remaining 0.17% are, by inspection: Myanmar punctuation/grammatical symbols outside BGN/PCGN's scope (၊ ။ ၌ ၍), the two documented normalize() Contraction words (see below), and a handful of genuinely rare or ambiguous orthographic edge cases (e.g. kinzi immediately following a syllable that already has its own vowel sign). Any syllable this module cannot confidently romanize is left as the original Myanmar text in the output, never guessed.

Kinzi: not in the source, verified another way

The source document does not mention kinzi (the prefixed nga+asat+virama unit, e.g. the "ç်္" in မင်္ဂလာ) at all. Its romanization here is this module's own inference, cross-validated against well-known conventional spellings rather than guessed: treating kinzi as merging into the preceding syllable exactly like a plain-context "in" final (the same value row 2 of the source's final-consonant table gives for a plain ç final) correctly reproduces မင်္ဂလာ→mingala and စင်္ကာပူ→singabu. This only applies when the preceding syllable has no vowel sign of its own; kinzi following a vowel-bearing syllable is an unverified combination and is passed through unromanized.

Deliberately out of scope for this v1

See the full list with reasoning in bgn_pcgn.py's module docstring. In short: the source's own Note 6 hyphen disambiguation (kun-yet vs kunyet), Note 8's rare vowel-shifting spelling idiom, the two documented Contraction words, and Note 4's word-internal vowel-initial-syllable hyphen (needs syllable-boundary information this module doesn't have) are all left unimplemented rather than guessed at.

Refactor note

romanize() and canonical_order() (in burmesenlp.normalize) share one internal cluster parser, _iter_clusters() -- extracted from canonical_order()'s own cluster-splitting loop with a full test-suite pass confirming zero behavior change before anything romanization-shaped was built on top of it. This is why both features agree on what counts as one syllable cluster (kinzi, a stacked/subjoined consonant, and the run of reorderable marks that follows).