summaryrefslogtreecommitdiff
path: root/crates/typst-library/src/text
diff options
context:
space:
mode:
authorIlia <43654815+istudyatuni@users.noreply.github.com>2025-06-12 13:30:53 +0300
committerGitHub <noreply@github.com>2025-06-12 10:30:53 +0000
commitbd41fb9427f3965b91ac467fe12045bbb793b5e9 (patch)
tree0b3bc513defc057f67b9eebc43299153d3b55b99 /crates/typst-library/src/text
parent46d57b00b58afefa8ed93e74655e43268571dcce (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.rs68
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"
+ );
+ }
}