inditrans
A transliteration library for Indic/Brahmic and Roman scripts for Flutter and Dart. Uses FFI on native platforms and WASM on Web for near-native performance, with no server dependency.
- Available on all platforms (Android, iOS, Linux, macOS, Windows, Web).
- ITRANS toggle transliteration — wrap any region in
##…##to pass it through unchanged. - XML/HTML tag pass-through — tags are never transliterated.
- Special handling for Tamil, Malayalam, Gurmukhi, and other scripts tuned for readability.
- Vedic accent support for Vedic scriptures.
Supported scripts
Optional Urdu pronunciation
transliterateUrduWithLexicon(text, to, bytes, options) accepts a caller-supplied
IUL1 or IUL2 pack as Uint8List to override the bundled experimental dictionary.
Ordinary Urdu conversion uses the bundled dictionary without downloading data.
A single reading is selected without contextual disambiguation. Unknown,
explicitly marked and mixed-script words use the ordinary Urdu reader.
DisableInference bypasses the lexicon. See
lexicon compilation and runtime behavior for the pack format and
current limitations.
Indic/Brahmic: Assamese, Bengali, Burmese, Devanagari, Grantha, Gujarati, Gurmukhi, Kannada, Khmer, Malayalam, Oriya, Sinhala, Tamil, Telugu, Thai, Tibetan
Roman schemes: IAST · IPA · ISO 15919 · ITRANS · TITUS · Indlish (my own take on a readable Roman representation for Indian scripts)
ITRANS notation notes
inditrans implements uniform phonemic vowel mapping adhering to the ITRANS specification:
- Short vowels:
eandoencode short vowels (e.g. Kannadaಎ/ೆ, Teluguఎ/ె, Tamilஎ/ெ, Malayalamഎ/െ, Devanagariऎ/ॆ).^eand^oremain supported as aliases. - Long vowels:
EandOencode long vowels (e.g. Kannadaಏ/ೇ, Teluguఏ/ే, Tamilஏ/ே, Malayalamഏ/േ, Devanagariए/े). - Examples:
te$\to$तॆ/ತೆ,tE$\to$ते/ತೇ;tere bina$\to$ತೆರೆ ಬಿನ(Kannada),tErE bina$\to$ತೇರೇ ಬಿನ(Kannada) /तेरे बिन(Devanagari).
Requirements
- Flutter ≥ 3.38.10 / Dart SDK ^3.10.8
- No additional runtime dependencies for transliteration
Installation
flutter pub add inditrans
Quick start
import 'package:inditrans/inditrans.dart' as inditrans;
Future<void> main() async {
// init() must complete before transliterate() is called
await inditrans.init();
final result = inditrans.transliterate(
"श्री॒ गु॒रु॒भ्यो नमः॒ । ह॒रिः॒ ओ३म् ॥",
inditrans.Script.devanagari,
inditrans.Script.tamil,
inditrans.Options.IgnoreVedicAccents + inditrans.Options.TamilSuperscripted,
);
print(result);
}
Configuration
Pass an Option value (or combine with +) as the fourth argument to transliterate():
| Option | Description |
|---|---|
Option.TamilTraditional |
Traditional Tamil consonants only |
Option.TamilSuperscripted |
Superscripted Tamil consonants |
Option.DevanagariTraditional |
Traditional Devanagari orthography (maps Dravidian short e/o and consonants) |
Option.ASCIINumerals |
Force ASCII numerals in output |
Option.IgnoreVedicAccents |
Strip Vedic accent markers |
Option.RetainSpecialMarkers |
Keep non-standard character markers |
Option.NoXMLTagHandling |
Treat XML/HTML tags as plain text |
Option.DisableInference |
Disable anuswara assimilation and contextual Tamil pronunciation/letter inference |
For Tamil source text, Option.TamilSuperscripted also enables DisableInference automatically; using it only for Tamil output does not. With DisableInference, a target's mapped anuswara is emitted instead of a contextually inferred nasal (which may differ in spelling).
The skipStart and skipEnd parameters (default "##") mark regions that are not
transliterated and are passed through unchanged.
Development
flutter pub get # install Dart dependencies
dart analyze # lint and static analysis
flutter test # run tests (native library must be built)
python3 ../scripts/generate_bindings.py # regenerate FFI bindings after native API changes
Checkout builds use the shared engine in ../native/src/. Before publishing,
run python3 scripts/prepare_flutter_package.py from the repository root to
bundle it in flutter/src/ and copy the changelog. Installed pub.dev packages
build from those bundled sources. Verify that layout with
python3 tests/integration/flutter_package_smoke.py from the repository root.
Documentation
License
Forward accuracy and Urdu
Script.urdu (alias Script.nastaliq) supports Urdu/Perso-Arabic text. Use a
Nastaliq-capable font and RTL text direction in your application. The returned
string is ordinary Unicode in logical order. Explicit vowels, aspirates and
shadda are supported; ordinary unvocalized Urdu needs lexical information to
recover omitted vowels, so bare consonants receive no guessed vowel.
Targets use their native letters or documented phonetic approximations; source distinctions may merge. ISO input now accepts the additional spreadsheet notations, including ê, ŭ, ĉ, ž, w and the Urdu loan-letter spellings. Artificial extended-vowel separators/accents have been replaced by native approximations. Real supported accents remain separate marks. There is no round-trip guarantee.
The script profiles implement transliteration, not complete language-specific pronunciation. See the repository's mapping review for exact notation behavior and limitations.
Reusable Urdu pronunciation lexicon (experimental)
Call UrduPronunciationLexicon.load(iulBytes) after init().
It returns null for invalid bytes. Call lexicon.transliterate(text, Script.iast)
for repeated conversion, then lexicon.dispose() when finished. The handle
owns decoded data and no longer needs the source bytes. The existing one-shot
transliterateUrduWithLexicon() remains available.