| Crates.io | ukraine |
| lib.rs | ukraine |
| version | 1.1.0 |
| created_at | 2022-09-20 02:47:39.251348+00 |
| updated_at | 2025-11-17 17:04:42.538118+00 |
| description | Glory to Ukraine. Library for transliterating Ukrainian Cyrillic text into Latin script representation |
| homepage | |
| repository | |
| max_upload_size | |
| id | 669549 |
| size | 117,785 |
A Rust library for transliterating Ukrainian Cyrillic text into Latin-script representations. In the hope that one day the Ukrainian Latin script will be widely adopted and the last remnants of russian aggressive imperialism will be erased from the history of modern Ukraine 💙💛
This Rust crate provides functionality for converting Ukrainian Cyrillic text into various transliteration schemes described on the Ukrainian Latin alphabet page.
Currently supports the following transliteration systems from Ukrainian Cyrillic to Latin:
This library is implemented in pure Rust with zero dependencies and no regex. All transliteration logic is built from scratch using native Rust string processing for maximum performance and minimal overhead.
Add the following line to your Cargo.toml dependencies:
[dependencies]
ukraine = "1"
// ukraine = { version = "1", default-features = false, features = ["greeting"] }
use ukraine::greeting::vitayu;
fn main() {
println!("{}", vitayu()); // Вітаю
}
Cyrillic-Latin transliteration of Ukrainian texts
// ukraine = { version = "1", default-features = false, features = ["dstu9112a"] }
use ukraine::latin::transliterate_dstu9112a;
fn main() {
assert_eq!(transliterate_dstu9112a("Привіт"), "Pryvit");
assert_eq!(transliterate_dstu9112a("Житомир"), "Žytomyr");
assert_eq!(transliterate_dstu9112a("Запоріжжя"), "Zaporižžja");
assert_eq!(transliterate_dstu9112a("Київ"), "Kyïv");
assert_eq!(transliterate_dstu9112a("Ужгород"), "Užğorod");
assert_eq!(transliterate_dstu9112a("Черкаси"), "Čerkasy");
assert_eq!(transliterate_dstu9112a("Чернівці"), "Černivci");
assert_eq!(transliterate_dstu9112a("Чернігів"), "Černiğiv");
assert_eq!(transliterate_dstu9112a("Україна"), "Ukraïna");
}
Cyrillic-Latin transliteration of Ukrainian texts
// ukraine = { version = "1", default-features = false, features = ["dstu9112b"] }
use ukraine::latin::transliterate_dstu9112b;
fn main() {
let input = "Ще не вмерла України і слава, і воля,
Ще нам, браття молодії, усміхнеться доля.
Згинуть наші воріженьки, як роса на сонці.
Запануєм і ми, браття, у своїй сторонці.";
let expected = "Shche ne vmerla Ukrajiny i slava, i volja,
Shche nam, brattja molodiji, usmikhnetjsja dolja.
Zghynutj nashi vorizhenjku, jak rosa na sonci.
Zapanujem i my, brattja, u svojij storonci.";
assert_eq!(transliterate_dstu9112b(input), expected);
}
// ukraine = { version = "1", default-features = false, features = ["kmu55"] }
use ukraine::latin::transliterate_kmu55;
fn main() {
assert_eq!(transliterate_kmu55("Київ"), "Kyiv");
assert_eq!(transliterate_kmu55("Михайло"), "Mykhailo");
assert_eq!(transliterate_kmu55("Юрій"), "Yurii");
assert_eq!(transliterate_kmu55("Борщ"), "Borshch");
}
// ukraine = { version = "1", default-features = false, features = ["lozynsky"] }
use ukraine::latin::transliterate_lozynsky;
fn main() {
assert_eq!(transliterate_lozynsky("❤️ Україна"), "❤️ Ukrajina");
}
// ukraine = { version = "1", default-features = false, features = ["numbers"] }
use ukraine::numbers::{to_ordinal_words, to_words, OrdinalGender};
fn main() {
assert_eq!(
to_words(12_345_678),
"дванадцять мільйонів триста сорок п'ять тисяч шістсот сімдесят вісім"
);
}
// ukraine = { version = "1", default-features = false, features = ["numbers"] }
use ukraine::numbers::{to_ordinal_words, OrdinalGender};
fn main() {
assert_eq!(to_ordinal_words(123, OrdinalGender::Feminine), "сто двадцять третя");
assert_eq!(to_ordinal_words(123, OrdinalGender::Masculine), "сто двадцять третій");
assert_eq!(to_ordinal_words(123, OrdinalGender::Neuter), "сто двадцять третє");
assert_eq!(
to_ordinal_words(21, OrdinalGender::Masculine),
"двадцять перший"
);
assert_eq!(
to_ordinal_words(45, OrdinalGender::Feminine),
"сорок п'ята"
);
}
// ukraine = { version = "1", default-features = false, features = ["datetime"] }
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
use ukraine::datetime::{format_date, format_time, format_datetime, DateFormatStyle, FormatOptions};
fn main() {
let independence_day = NaiveDate::from_ymd_opt(2024, 8, 24).unwrap();
let ceremony = NaiveDateTime::new(
independence_day,
NaiveTime::from_hms_opt(9, 0, 0).unwrap(),
);
// Date format
assert_eq!(
format_date(independence_day, DateFormatStyle::Long),
"24 серпня 2024 року"
);
// Full date time format
assert_eq!(
format_datetime(ceremony, FormatOptions::default()),
"24 серпня 2024 року о 09:00"
);
// 12 hours
let time = NaiveTime::from_hms_opt(8, 10, 59).unwrap();
assert_eq!(
format_time(time, TimeFormatStyle::TwelveHourNoSeconds),
"08:10 ранку"
);
// 24 hours
let time = NaiveTime::from_hms_opt(23, 59, 59).unwrap();
assert_eq!(
format_time(time, TimeFormatStyle::TwentyFourHour),
"23:59:59"
);
// 24 hours no seconds
let time = NaiveTime::from_hms_opt(23, 59, 59).unwrap();
assert_eq!(
format_time(time, TimeFormatStyle::TwentyFourHourNoSeconds),
"23:59"
);
}
// ukraine = { version = "1", default-features = false, features = ["numbers", "dstu9112a"] }
use ukraine::numbers::to_words;
use ukraine::latin::dstu9112a::transliterate_dstu9112a;
fn main() {
assert_eq!(
transliterate_dstu9112a(&to_words(12_345_678)),
"dvanadcjatj miljjoniv trysta sorok p’jatj tysjač šistsot simdesjat visim"
);
}
The full API documentation is available at docs.rs/ukraine.
Alternative crates for supporting DSTU 9112:2021 and KMU 55:2010: the uklatn crate provides a solid regex-based implementation of these transliteration schemes.
Contributions are welcome! Please open an issue or submit a pull request for any improvements or bug fixes.