2025-02-24 02:48:13 +00:00
|
|
|
use std::{fs::File, io, path::Path};
|
|
|
|
|
|
|
|
use icu_locid::LanguageIdentifier;
|
|
|
|
use xml::{writer::XmlEvent, EmitterConfig, EventWriter};
|
|
|
|
|
|
|
|
use crate::{Bundle, Message, WriteError};
|
|
|
|
|
|
|
|
pub fn export_file(
|
|
|
|
bundle: &Bundle,
|
|
|
|
locale: LanguageIdentifier,
|
|
|
|
path: &Path,
|
|
|
|
) -> Result<(), WriteError> {
|
|
|
|
let mut file = File::create(path).unwrap();
|
|
|
|
export_fh(bundle, locale, &mut file)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn export_fh(
|
|
|
|
bundle: &Bundle,
|
|
|
|
locale: LanguageIdentifier,
|
|
|
|
fh: &mut File,
|
|
|
|
) -> Result<(), WriteError> {
|
|
|
|
let mut writer = EmitterConfig::new()
|
|
|
|
.perform_indent(true)
|
2025-02-24 14:44:44 +00:00
|
|
|
.create_writer(fh);
|
2025-02-24 02:48:13 +00:00
|
|
|
|
2025-02-24 14:44:44 +00:00
|
|
|
writer
|
|
|
|
.write(
|
|
|
|
XmlEvent::start_element("xliff")
|
|
|
|
.attr("xmlns", "urn:oasis:names:tc:xliff:document:2.0")
|
|
|
|
.attr("version", "2.0")
|
|
|
|
.attr("srcLang", &format!("{}", locale)),
|
|
|
|
)
|
|
|
|
.unwrap();
|
|
|
|
writer
|
|
|
|
.write(XmlEvent::start_element("file").attr("id", "main"))
|
|
|
|
.unwrap();
|
2025-02-24 02:48:13 +00:00
|
|
|
|
|
|
|
for (key, message) in bundle.message_iter() {
|
2025-02-24 14:44:44 +00:00
|
|
|
write_message(&mut writer, key, message, &locale);
|
2025-02-24 02:48:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
writer.write(XmlEvent::end_element()).unwrap();
|
|
|
|
writer.write(XmlEvent::end_element()).unwrap();
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2025-02-24 14:44:44 +00:00
|
|
|
fn write_message<T>(
|
|
|
|
writer: &mut EventWriter<T>,
|
|
|
|
key: &str,
|
|
|
|
message: &Message,
|
|
|
|
locale: &LanguageIdentifier,
|
|
|
|
) where
|
2025-02-24 02:48:13 +00:00
|
|
|
T: std::io::Write,
|
|
|
|
{
|
2025-02-24 14:44:44 +00:00
|
|
|
[
|
|
|
|
XmlEvent::start_element("unit").attr("id", key).into(),
|
|
|
|
XmlEvent::start_element("notes").into(),
|
|
|
|
XmlEvent::start_element("note").into(),
|
|
|
|
XmlEvent::characters(message.description()).into(),
|
|
|
|
XmlEvent::end_element().into(),
|
|
|
|
XmlEvent::end_element().into(),
|
|
|
|
XmlEvent::start_element("segment").into(),
|
|
|
|
XmlEvent::start_element("source").into(),
|
|
|
|
XmlEvent::characters(message.variant(locale).unwrap().content()).into(),
|
|
|
|
XmlEvent::end_element().into(),
|
|
|
|
XmlEvent::end_element().into(),
|
|
|
|
XmlEvent::end_element().into(),
|
|
|
|
]
|
|
|
|
.into_iter()
|
|
|
|
.for_each(|elem: XmlEvent| writer.write(elem).unwrap());
|
2025-02-24 02:48:13 +00:00
|
|
|
}
|