# `polib` [![crates.io](https://img.shields.io/crates/v/polib.svg)](https://crates.io/crates/polib) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![GitHub Actions](https://github.com/BrettDong/polib/actions/workflows/test.yaml/badge.svg) A Rust library to read, manipulate and write GNU gettext translation data in `.po` format. ## Basic Concepts A **Message** represents a translation of a text entry from the source language to a target language. A **Catalog** holds a collection of _Messages_, and is stored in a `.po` file. ## Example ### Iterate over messages in a `.po` file ```rust use polib::po_file; use std::error::Error; use std::path::Path; fn main() -> Result<(), Box> { let catalog = po_file::parse(Path::new("foo.po"))?; for message in catalog.messages() { if message.is_translated() { if message.is_singular() { println!("{} => {}", message.msgid(), message.msgstr()?); } else { // message.is_plural() println!("{} => {}", message.msgid(), message.msgstr_plural()?.join(", ")); } } else { println!("{} is untranslated", message.msgid()); } } Ok(()) } ``` ### Remove untranslated or fuzzy entries and save to another `.po` file ```rust let mut catalog = po_file::parse(Path::new(&input_file))?; let mut filtered: usize = 0; for mut message in catalog.messages_mut() { if !message.is_translated() || message.is_fuzzy() { message.delete(); filtered += 1; } } po_file::write(&catalog, Path::new(&output_file))?; println!("{} untranslated or fuzzy translations removed.", filtered); ``` ### Fill in missing translations from some other translation service ```rust let mut catalog = po_file::parse(Path::new(&input_file))?; for mut message in catalog.messages_mut() { if !message.is_translated() { if message.is_singular() { message.set_msgstr(/* some 3rdparty provided */translate(message.msgid()))?; } } } po_file::write(&catalog, Path::new(&output_file))?; ``` ### Compile a `.po` file to `.mo` format ```rust mo_file::compile_from_po(Path::new(&input), Path::new(&output))?; ``` ## Documentation Refer to [docs.rs](https://docs.rs/polib).