#gettext #internationalization #proc-macro

macro i18n-format

A simple proc-macro to allow gettext! and xgettext to work together

2 unstable releases

0.2.0 Jan 22, 2023
0.1.0 Jan 21, 2023

#660 in Procedural macros

Download history 219/week @ 2024-01-01 316/week @ 2024-01-08 264/week @ 2024-01-15 230/week @ 2024-01-22 178/week @ 2024-01-29 374/week @ 2024-02-05 174/week @ 2024-02-12 98/week @ 2024-02-19 326/week @ 2024-02-26 302/week @ 2024-03-04 130/week @ 2024-03-11 118/week @ 2024-03-18 150/week @ 2024-03-25 134/week @ 2024-04-01 301/week @ 2024-04-08 191/week @ 2024-04-15

784 downloads per month

MIT license



xgettext is used to extract strings from source files. Unfortunately it doesn't support Rust. The patch has been stuck in review since 2019.

Fortunately it almost work with Rust. You can specify the keyword gettext or whatever alias you use (I usually use i18n), but to use the formatting version gettext! it doesn't work because of the !.

This crate provide wrapper macros to use gettextrs::gettext! and gettextrs::ngettext! in a way that allow xgettext to find strings for .po files as it doesn't support a keyword with a !. Specify i18n_fmt and i18n_nfmt as keywords for calls to xgettext, and then write your formatting gettext call like this:

use i18n_format::i18n_fmt;

let number = 1;
let s = i18n_fmt! {
    i18n_fmt("This is number {}, make it so !", number)

is equivalent to

use gettextrs::gettext;

let number = 1;
let s = gettext!("This is number {}, make it so !", number);

But the string will be extracted.

i18n_fmt is just a placeholder in the block for i18n_fmt!, and it will be replaced by a call to gettext!. To call ngettext! just use i18n_nfmt as a placeholder inside the macro.

Meson support

The original use of this crate is with gtk-rs apps built with meson. If you use the regular gtk-rust-template, internationalization support is mostly setup. The po/meson.build file should contain a section like this:

i18n.gettext(gettext_package, preset: 'glib')

Just add to the args the following to the i18n.gettext function:

  args [

If args already exist, just add the items to the list.


This crate is licensed under the MIT license.

Author: Hubert Figuière hub@figuiere.net


~61K SLoC