An open API service indexing awesome lists of open source software.

https://github.com/brettdong/polib

A Rust library for loading translation data in GNU gettext PO format.
https://github.com/brettdong/polib

gettext i18n rust

Last synced: 3 months ago
JSON representation

A Rust library for loading translation data in GNU gettext PO format.

Awesome Lists containing this project

README

          

# `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_to_file(&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_to_file(&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).