Can now add translatiions to universal strings.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s

This commit is contained in:
2026-03-17 10:49:49 -04:00
parent 92c5ac768b
commit 9e81e17a23

View File

@@ -431,19 +431,19 @@ impl Paragraph {
Self { data: data } Self { data: data }
} }
fn add_translation(&mut self, string: String, lang: Language) { fn add_translation(&mut self, lang: Language, text: String) {
match self.data.get(&lang) { match self.data.get(&lang) {
Some(_) => {} Some(_) => {}
None => { None => {
self.data self.data
.insert(lang, ParagraphData::new(string, DataOrigin::Computer)); .insert(lang, ParagraphData::new(text, DataOrigin::Computer));
} }
}; };
} }
fn improve_translation(&mut self, string: String, lang: Language) { fn improve_translation(&mut self, lang: Language, text: String) {
self.data self.data
.insert(lang, ParagraphData::new(string, DataOrigin::Human)); .insert(lang, ParagraphData::new(text, DataOrigin::Human));
} }
fn get(&self, lang: &Language) -> Option<&String> { fn get(&self, lang: &Language) -> Option<&String> {
@@ -498,7 +498,7 @@ mod paragraphs {
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
]; ];
let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string()); let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string());
paragraph.add_translation(text[1].clone().to_string(), languages[1].clone()); paragraph.add_translation(languages[1].clone(), text[1].clone().to_string());
for i in 0..text.len() { for i in 0..text.len() {
assert_eq!(paragraph.get(&languages[i]).unwrap(), text[i]); assert_eq!(paragraph.get(&languages[i]).unwrap(), text[i]);
} }
@@ -509,7 +509,7 @@ mod paragraphs {
let text = "something"; let text = "something";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(lang.clone(), text.to_string()); let mut paragraph = Paragraph::new(lang.clone(), text.to_string());
paragraph.add_translation("other".to_string(), lang); paragraph.add_translation(lang, "other".to_string());
assert_eq!(paragraph.get(&lang).unwrap(), text); assert_eq!(paragraph.get(&lang).unwrap(), text);
} }
@@ -518,7 +518,7 @@ mod paragraphs {
let text = "new"; let text = "new";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(lang.clone(), "old".to_string()); let mut paragraph = Paragraph::new(lang.clone(), "old".to_string());
paragraph.improve_translation(text.to_string(), lang.clone()); paragraph.improve_translation(lang.clone(), text.to_string());
assert_eq!(paragraph.get(&lang).unwrap(), text); assert_eq!(paragraph.get(&lang).unwrap(), text);
} }
@@ -537,7 +537,7 @@ mod paragraphs {
let text = "test"; let text = "test";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(lang.clone(), text.to_string()); let mut paragraph = Paragraph::new(lang.clone(), text.to_string());
paragraph.add_translation("テスト".to_string(), Language::from_639_1("ja").unwrap()); paragraph.add_translation(Language::from_639_1("ja").unwrap(), "テスト".to_string());
let result = paragraph.by_humans(); let result = paragraph.by_humans();
assert_eq!(result.len(), 1, "got wrong numnber of texts"); assert_eq!(result.len(), 1, "got wrong numnber of texts");
assert_eq!(result.get(&lang).unwrap(), text); assert_eq!(result.get(&lang).unwrap(), text);
@@ -551,7 +551,7 @@ mod paragraphs {
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
]; ];
let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string()); let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string());
paragraph.improve_translation(text[1].clone().to_string(), languages[1].clone()); paragraph.improve_translation(languages[1].clone(), text[1].clone().to_string());
let result = paragraph.by_humans(); let result = paragraph.by_humans();
assert_eq!(result.len(), 2, "got wrong numnber of texts"); assert_eq!(result.len(), 2, "got wrong numnber of texts");
for i in 0..text.len() { for i in 0..text.len() {
@@ -565,12 +565,12 @@ mod paragraphs {
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(lang.clone(), text.clone()); let mut paragraph = Paragraph::new(lang.clone(), text.clone());
paragraph.add_translation( paragraph.add_translation(
Uuid::new_v4().to_string(),
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
Uuid::new_v4().to_string(),
); );
paragraph.improve_translation( paragraph.improve_translation(
Uuid::new_v4().to_string(),
Language::from_639_1("de").unwrap(), Language::from_639_1("de").unwrap(),
Uuid::new_v4().to_string(),
); );
let (rlang, rtext) = paragraph.get_initial(); let (rlang, rtext) = paragraph.get_initial();
assert_eq!(rlang, &lang); assert_eq!(rlang, &lang);
@@ -615,20 +615,26 @@ mod paragraphids {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct MissingTranslation { pub struct MissingTranslation {
id: ParagraphID,
needs: Language, needs: Language,
has: Language, has: Language,
text: String, text: String,
} }
impl MissingTranslation { impl MissingTranslation {
fn new(needs: Language, has: Language, text: String) -> Self { fn new(id: ParagraphID, needs: Language, has: Language, text: String) -> Self {
Self { Self {
id: id,
needs: needs, needs: needs,
has: has, has: has,
text: text, text: text,
} }
} }
fn paragraph_id(&self) -> ParagraphID {
self.id.clone()
}
fn needs(&self) -> Language { fn needs(&self) -> Language {
self.needs.clone() self.needs.clone()
} }
@@ -648,16 +654,21 @@ mod missing_translations {
#[test] #[test]
fn can_get_mising_translation_information() { fn can_get_mising_translation_information() {
let id = ParagraphID::new();
let langs = [ let langs = [
Language::from_639_1("en").unwrap(), Language::from_639_1("en").unwrap(),
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
]; ];
let text = Uuid::new_v4().to_string(); let text = Uuid::new_v4().to_string();
let missing = MissingTranslation::new(langs[0].clone(), langs[1].clone(), text.clone()); let missing =
MissingTranslation::new(id.clone(), langs[0].clone(), langs[1].clone(), text.clone());
assert_eq!(missing.paragraph_id(), id);
assert_eq!(missing.needs(), langs[0]); assert_eq!(missing.needs(), langs[0]);
assert_eq!(missing.has(), langs[1]); assert_eq!(missing.has(), langs[1]);
assert_eq!(missing.text(), text); assert_eq!(missing.text(), text);
let missing2 = MissingTranslation::new(langs[1].clone(), langs[0].clone(), text.clone()); let missing2 =
MissingTranslation::new(id.clone(), langs[1].clone(), langs[0].clone(), text.clone());
assert_eq!(missing.paragraph_id(), id);
assert_eq!(missing2.needs(), langs[1]); assert_eq!(missing2.needs(), langs[1]);
assert_eq!(missing2.has(), langs[0]); assert_eq!(missing2.has(), langs[0]);
assert_eq!(missing2.text(), text); assert_eq!(missing2.text(), text);
@@ -695,6 +706,7 @@ impl UniversalString {
None => { None => {
let (ori_lang, text) = paragraph.get_initial(); let (ori_lang, text) = paragraph.get_initial();
missing.push(MissingTranslation::new( missing.push(MissingTranslation::new(
id.clone(),
lang.clone(), lang.clone(),
ori_lang.clone(), ori_lang.clone(),
text.clone(), text.clone(),
@@ -742,6 +754,30 @@ impl UniversalString {
} }
self.revisions.push(version); self.revisions.push(version);
} }
fn add_translation(&mut self, id: ParagraphID, lang: Language, text: String) {
self.paragraphs
.get_mut(&id)
.unwrap()
.add_translation(lang, text);
}
fn improve_translation(&mut self, id: ParagraphID, lang: Language, text: String) {
self.paragraphs
.get_mut(&id)
.unwrap()
.improve_translation(lang, text);
}
fn by_humans(&self) -> Vec<(ParagraphID, HashMap<Language, String>)> {
let mut output = Vec::new();
let latest = self.revisions.iter().last().unwrap();
for id in latest.iter() {
let para = self.paragraphs.get(id).unwrap();
output.push((id.clone(), para.by_humans()));
}
output
}
} }
#[cfg(test)] #[cfg(test)]
@@ -874,6 +910,7 @@ mod universal_strings {
let (elang, edata) = TestData::english(); let (elang, edata) = TestData::english();
let (jlang, jdata) = TestData::japanese(); let (jlang, jdata) = TestData::japanese();
let initial = TestData::to_input(jdata.clone()); let initial = TestData::to_input(jdata.clone());
let expected = TestData::to_input(edata.clone());
let mut ustr = UniversalString::new(jlang.clone(), initial.clone()); let mut ustr = UniversalString::new(jlang.clone(), initial.clone());
assert_eq!(ustr.get(&jlang).unwrap(), initial); assert_eq!(ustr.get(&jlang).unwrap(), initial);
let err = ustr.get(&elang).unwrap_err(); let err = ustr.get(&elang).unwrap_err();
@@ -889,11 +926,51 @@ mod universal_strings {
assert_eq!(data.needs(), elang, "needed language is incorrect"); assert_eq!(data.needs(), elang, "needed language is incorrect");
assert_eq!(data.has(), jlang, "original language is incorrect"); assert_eq!(data.has(), jlang, "original language is incorrect");
assert!(holder.contains(&data.text())); assert!(holder.contains(&data.text()));
holder.remove(&data.text()); let text = data.text();
holder.remove(&text);
let index = jdata.iter().position(|x| x == &text).unwrap();
ustr.add_translation(data.paragraph_id(), elang.clone(), edata[index].clone());
} }
assert!(holder.is_empty(), "still had {:?}", holder); assert!(holder.is_empty(), "still had {:?}", holder);
} }
_ => unreachable!("got {:?}, should have been needs translation", err), _ => unreachable!("got {:?}, should have been needs translation", err),
} }
assert_eq!(ustr.revision_count(), 0);
assert_eq!(ustr.get(&elang).unwrap(), expected);
let result = ustr.by_humans();
assert_eq!(
result.len(),
jdata.len(),
"incorrect number of original values"
);
let mut count = 0;
for (_, lang_result) in result {
assert_eq!(lang_result.len(), 1, "wrong number of returned languages");
assert_eq!(lang_result.get(&jlang).unwrap(), &jdata[count]);
count += 1;
}
}
#[test]
fn can_translations_be_improved() {
let (elang, edata) = TestData::english();
let (jlang, jdata) = TestData::japanese();
let initial = TestData::to_input(edata.clone());
let expected = TestData::to_input(jdata.clone());
let mut ustr = UniversalString::new(elang.clone(), initial.clone());
for (id, lang_text) in ustr.by_humans().iter() {
let text = lang_text.get(&elang).unwrap();
let index = edata.iter().position(|x| x == text).unwrap();
ustr.improve_translation(id.clone(), jlang, jdata[index].clone());
}
assert_eq!(ustr.revision_count(), 0);
assert_eq!(ustr.get(&jlang).unwrap(), expected);
let mut count = 0;
for (_, lang_result) in ustr.by_humans().iter() {
assert_eq!(lang_result.len(), 2, "wrong number of returned languages");
assert_eq!(lang_result.get(&elang).unwrap(), &edata[count]);
assert_eq!(lang_result.get(&jlang).unwrap(), &jdata[count]);
count += 1;
}
} }
} }