49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
|
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 output = io::stdout();
|
||
|
let mut writer = EmitterConfig::new()
|
||
|
.perform_indent(true)
|
||
|
.create_writer(output);
|
||
|
|
||
|
writer.write(XmlEvent::start_element("xliff")).unwrap();
|
||
|
writer.write(XmlEvent::start_element("file")).unwrap();
|
||
|
|
||
|
for (key, message) in bundle.message_iter() {
|
||
|
write_message(&mut writer, message, &locale);
|
||
|
}
|
||
|
|
||
|
writer.write(XmlEvent::end_element()).unwrap();
|
||
|
writer.write(XmlEvent::end_element()).unwrap();
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
fn write_message<T>(writer: &mut EventWriter<T>, message: &Message, locale: &LanguageIdentifier)
|
||
|
where
|
||
|
T: std::io::Write,
|
||
|
{
|
||
|
writer.write(XmlEvent::start_element("unit")).unwrap();
|
||
|
writer.write(XmlEvent::start_element("segment")).unwrap();
|
||
|
writer.write(XmlEvent::characters(message.variant(locale).unwrap().content())).unwrap();
|
||
|
writer.write(XmlEvent::end_element()).unwrap();
|
||
|
writer.write(XmlEvent::end_element()).unwrap();
|
||
|
}
|