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": ">", // Optional: "<" (output-only) or ">" (input-only)
"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).
How order matters:
// ✅ Correct - "sch" matches before "ch"
["sch", "щ"], ["ch", "ч"], ["c", "ц"]
// ❌ Wrong - "c" would match first, breaking "ch" and "sch"
["c", "ц"], ["ch", "ч"], ["sch", "щ"]Restrict mappings to one direction using the optional constraint field:
File-Level ("constraint": "<" or ">")
"<"= output-only (can only convert TO this script, like IPA)">"= input-only (rarely used)
Pair-Level (third array element: "<" or ">")
">"= deprecated (accept as input, don't generate:["к1", "кь", ">"])"<"= output-only (rarely used, auto-created when reversing)
Order still matters:
// ✅ Correct - longer deprecated form first
[["къкъ", "ҡҡ", ">"], ["къ", "ҡҡ"]]
// ❌ Wrong - shorter form matches first
[["къ", "ҡҡ"], ["къкъ", "ҡҡ", ">"]]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"] }