diff options
| author | Ilia <43654815+istudyatuni@users.noreply.github.com> | 2025-06-12 13:30:53 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-12 10:30:53 +0000 |
| commit | bd41fb9427f3965b91ac467fe12045bbb793b5e9 (patch) | |
| tree | 0b3bc513defc057f67b9eebc43299153d3b55b99 /crates/typst-library/src/text | |
| parent | 46d57b00b58afefa8ed93e74655e43268571dcce (diff) | |
Check that all translation files are added to TRANSLATIONS and ends with newline (#6424)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Diffstat (limited to 'crates/typst-library/src/text')
| -rw-r--r-- | crates/typst-library/src/text/lang.rs | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/crates/typst-library/src/text/lang.rs b/crates/typst-library/src/text/lang.rs index f9f13c78..e06156c4 100644 --- a/crates/typst-library/src/text/lang.rs +++ b/crates/typst-library/src/text/lang.rs @@ -14,13 +14,14 @@ macro_rules! translation { }; } -const TRANSLATIONS: [(&str, &str); 40] = [ +const TRANSLATIONS: &[(&str, &str)] = &[ translation!("ar"), translation!("bg"), translation!("ca"), translation!("cs"), translation!("da"), translation!("de"), + translation!("el"), translation!("en"), translation!("es"), translation!("et"), @@ -28,7 +29,6 @@ const TRANSLATIONS: [(&str, &str); 40] = [ translation!("fi"), translation!("fr"), translation!("gl"), - translation!("el"), translation!("he"), translation!("hu"), translation!("id"), @@ -41,8 +41,8 @@ const TRANSLATIONS: [(&str, &str); 40] = [ translation!("nl"), translation!("nn"), translation!("pl"), - translation!("pt-PT"), translation!("pt"), + translation!("pt-PT"), translation!("ro"), translation!("ru"), translation!("sl"), @@ -53,8 +53,8 @@ const TRANSLATIONS: [(&str, &str); 40] = [ translation!("tr"), translation!("uk"), translation!("vi"), - translation!("zh-TW"), translation!("zh"), + translation!("zh-TW"), ]; /// An identifier for a natural language. @@ -312,14 +312,74 @@ fn lang_str(lang: Lang, region: Option<Region>) -> EcoString { #[cfg(test)] mod tests { + use std::collections::HashSet; + use std::path::PathBuf; + use typst_utils::option_eq; use super::*; + fn translation_files_iter() -> impl Iterator<Item = PathBuf> { + std::fs::read_dir("translations") + .unwrap() + .map(|e| e.unwrap().path()) + .filter(|e| e.is_file() && e.extension().is_some_and(|e| e == "txt")) + } + #[test] fn test_region_option_eq() { let region = Some(Region([b'U', b'S'])); assert!(option_eq(region, "US")); assert!(!option_eq(region, "AB")); } + + #[test] + fn test_all_translations_included() { + let defined_keys = + HashSet::<&str>::from_iter(TRANSLATIONS.iter().map(|(lang, _)| *lang)); + let mut checked = 0; + for file in translation_files_iter() { + assert!( + defined_keys.contains( + file.file_stem() + .expect("translation file should have basename") + .to_str() + .expect("translation file name should be utf-8 encoded") + ), + "translation from {:?} should be registered in TRANSLATIONS in {}", + file.file_name().unwrap(), + file!(), + ); + checked += 1; + } + assert_eq!(TRANSLATIONS.len(), checked); + } + + #[test] + fn test_all_translation_files_formatted() { + for file in translation_files_iter() { + let content = std::fs::read_to_string(&file) + .expect("translation file should be in utf-8 encoding"); + let filename = file.file_name().unwrap(); + assert!( + content.ends_with('\n'), + "translation file {filename:?} should end with linebreak", + ); + for line in content.lines() { + assert_eq!( + line.trim(), + line, + "line {line:?} in {filename:?} should not have extra whitespaces" + ); + } + } + } + + #[test] + fn test_translations_sorted() { + assert!( + TRANSLATIONS.is_sorted_by_key(|(lang, _)| lang), + "TRANSLATIONS should be sorted" + ); + } } |
