Text converter between different writing systems and transliteration schemes. Data for 9 Caucasian languages is currently provided: Abaza, Abkhaz, Aghul, Georgian, Kumyk, Kaitag, Lezgi, Ossetian, and Tsakhur. Contributions welcome!
npm install npm run devTest your conversions live at yaziv.raxys.app/editor
The system uses a hub-and-spoke model where all conversions flow through a central script.
Example with Abaza:
- Central script: Cyrillic (most complete)
- Conversion:
Latin → Cyrillic → IPA - Any script can convert to any other through the hub
Contributions of new languages and writing systems are welcome! Here's how to add support:
app/data/langs/[lang-id]/ ├── config.json # Language configuration └── mappings/ ├── script1.json # Writing system mappings └── script2.json public/flags/[iso-code].png # Optional PNG flag Each mapping file defines a writing system. The id field must match the filename, and all IDs must be listed in the config's mappings array:
{ "id": "lat", // Filename: lat.json "name": { "en": "Latin", "ru": "Латиница" }, "constraint": "from", // Optional: "from", "to", or omit "rtl": false, // Optional: true for right-to-left "lowercase": false, // Optional: apply lowercase first "pairs": [ ["sch", "щ"], // Longest patterns first! ["ch", "ч"], // Critical: Order by length ["sh", "ш"], // Digraphs before single chars ["c", "ц"], // Single characters last ["s", "с"] ] }Note: All language and mapping names must be provided in both English (en) and Russian (ru).
Why order matters:
// ✅ Correct - "sch" matches before "ch" ["sch", "щ"], ["ch", "ч"], ["c", "ц"] // ❌ Wrong - "c" would match first, breaking "ch" and "sch" ["c", "ц"], ["ch", "ч"], ["sch", "щ"]Add your language to /app/data/langs.json:
{ "id": "xyz", "name": { "en": "Language Name", "ru": "Название языка" } }cyr- Cyrilliclat- Latinlat_[variant]- Latin variants (e.g.,lat_chirikba)ipa- International Phonetic Alphabettranslit_[standard]- Transliteration schemes
Before submitting, test your conversions using the live editor at yaziv.raxys.app/editor:
- Import your JSON mappings directly
- Test bidirectional conversion
- Verify pattern precedence works
- Check edge cases
MIT License - feel free to use and modify!
{ "iso": "xyz", "sample": "Sample text in the language", "defaultPair": ["script1", "script2"], "mappings": ["script1", "script2", "ipa"] }