1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
//! # Internationalization //! [![Crates.io Version](https://img.shields.io/crates/v/internationalization.svg)](https://crates.io/crates/internationalization) //! ![LICENSE](https://img.shields.io/crates/l/internationalization) //! [![Coverage Status](https://coveralls.io/repos/github/terry90/internationalization-rs/badge.svg?branch=master)](https://coveralls.io/github/terry90/internationalization-rs?branch=master) //! //! An simple compile time i18n implementation in Rust. //! It throws a compilation error if the translation key is not present, but since the `lang` argument is dynamic it will panic if the language has not been added for the matching key. //! > API documentation [https://crates.io/crates/internationalization](https://crates.io/crates/internationalization) //! ## Usage //! Have a `locales/` folder somewhere in your app, root, src, anywhere. with `.json` files, nested in folders or not. //! It uses a glob pattern: `**/locales/**/*.json` to match your translation files. //! the files must look like this: //! ```json //! { //! "err.answer.all": { //! "fr": "Échec lors de la récupération des réponses", //! "en": "Failed to retrieve answers" //! }, //! "err.answer.delete.failed": { //! "fr": "Échec lors de la suppression de la réponse", //! "en": "Failed to delete answer" //! } //! } //! ``` //! Any number of languages can be added, but you should provide them for everything since it will panic if a language is not found when queried for a key. //! In your app, jsut call the `t!` macro //! ```rust //! fn main() { //! let lang = "en"; //! let res = t!("err.not_allowed", lang); //! assert_eq!("You are not allowed to do this", res); //! } //! ``` //! ## Installation //! Internationalization is available on [crates.io](https://crates.io/crates/internationalization), include it in your `Cargo.toml`: //! ```toml //! [dependencies] //! internationalization = "0.0.2" //! ``` //! Then include it in your code like this: //! ```rust //! #[macro_use] //! extern crate internationalization; //! ``` //! Or use the macro where you want to use it: //! ```rust //! use internationalization::t; //! ``` //! ## Note //! Internationalization will not work if no `PWD` env var is set at compile time. include!(concat!(env!("OUT_DIR"), "/i18n.rs")); #[cfg(test)] mod tests { use super::*; #[test] fn it_translates() { assert_eq!(t!("key.test", "en"), "This is a test"); } #[test] #[should_panic] fn it_fails_to_translate() { assert_eq!(t!("key.test", "es"), "Hola"); } }