18 releases

0.7.0 Oct 11, 2023
0.6.0 Feb 1, 2023
0.5.3 Aug 16, 2022
0.5.2 Jun 20, 2022
0.0.2 Feb 17, 2017

#82 in Internationalization (i18n)

Download history 3/week @ 2024-02-21 12/week @ 2024-02-28 6/week @ 2024-03-27 11/week @ 2024-04-03 130/week @ 2024-04-10 10/week @ 2024-04-17 4/week @ 2024-04-24

123 downloads per month


488 lines


Rust Latest Version Docs.rs LOC Dependency Status

Library for internationalization using the Twine file format.


  1. You need to add twine to your [build-dependencies] in Cargo.toml.

  2. Create (or edit) your build.rs file:

fn main() {
    twine::build_translations(&["translations.ini"], "i18n.rs");
  1. You need an INI file with your translations. Example with translations.ini:
    en = Ruin a band name by translating it in French
    fr = Ruiner le nom d'un groupe en le traduisant en français
    en = Tool
    fr = Outil
    en = The Doors
    fr = Les portes
    en = Rage Against the Machine
    en-gb = Wrath Against the Machine
    fr = Colère contre la machine
    en = The Jackson 5
    fr = Les 5 fils de Jack
    en = %s, %@!
    fr = %s, %@ !
    en = %.0f%
    fr = %.0f %
    en = %x
    fr = %#X
  1. Now in your project you can use the macro t! to translate anything:
// you need to include the generated file somewhere
include!(concat!(env!("OUT_DIR"), "/i18n.rs"));

fn main() {
    // use "" if there is no localization
    let lang = Lang::Fr("be");

    // will output "Ruiner le nom d'un groupe en le traduisant en français"
    t!(app_ruin_the_band => lang);

    // using formatted arguments, this will output "73 %"
    t!(format_percentage, 73.02f32 => lang);
  1. Disable incorrect compiler lint macro_expanded_macro_exports_accessed_by_absolute_paths:

This rustc lint does not work properly and often gives a false positive. You can disable it at the crate level by adding this at the beginning of your lib.rs or main.rs:


Implementation Notes

All translation keys must have all the languages of all the keys. For example, if all your keys have translations for en and fr, if one key has only en, it will fail to compile.

Localized translation can be provided and will be used if available. Otherwise it will fallback to the default translation for that language.

Any typo in the key will make the compilation fail. Missing format arguments will also make the compilation fail.


  • serde: when this feature is activated you will need to add serde to your dependencies and the Lang enum generated implements Serialize and Deserialize.


This work is dual-licensed under Apache 2.0 and MIT. You can choose between one of them if you use this work.

License: MIT OR Apache-2.0


~55K SLoC