diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-06-17 00:14:14 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-06-17 00:38:17 +0800 |
| commit | 83d91396bc84a0a35b5b676ab8c2518678a1dd3f (patch) | |
| tree | c3cca7c0faa6b4750993379ff9d6fee3d866ee82 /README.md | |
Restructure workspace into subcrates0.1.0
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4ea242 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# "Shake Hand!" + +> Let different languages shake hands with each other! 🤝 + +This is a **purely compile-time** Rust internationalization library. **All** localized strings are fully embedded into the binary at compile time, with only minimal runtime overhead. + +# How to Use? + +## 1. Add Dependency + +Add the following to your `Cargo.toml`: + +```toml +shakehand = "0.1" +``` + +## 2. Write Configuration Files + +Create a directory under your project to serve as the root for translations, e.g. `./locale/`. +Create any `toml` file inside this directory, e.g. `./locale/global.toml`, representing a translation file. + +In the file, group translations by language section. The key is the translation key, and the value is the translated text. +Text with parameters uses `%{parameter_name}` as placeholders, where the parameter name directly maps to the generated function's parameter name: + +```toml +[en] +world = "world" +greeting = "Hello, %{someone}!" + +[zh_CN] +world = "世界" +greeting = "你好,%{someone}!" +``` + +## 3. Load Translations + +In your Rust code, use `shakehand::locale!` to hardcode the entire directory into a module: + +```rust +pub mod translation { + shakehand::locale!("./locale", fallback = "en"); +} +``` + +The generated module will contain: +- A `Languages` enum listing all languages +- A `set_lang` function for switching the current language +- A unit struct `Global` (named after `global.toml`), whose associated functions are the translations for each key + +## 4. Call Translations + +Call translations just like ordinary functions, passing parameters by placeholder name: + +```rust +use crate::translation::{Global, Languages, set_lang}; + +fn main() { + set_lang(Languages::en); + let greeting = Global::greeting("World"); + println!("{}", greeting); // Hello, World! + + set_lang(Languages::zh_CN); + let greeting = Global::greeting("世界"); + println!("{}", greeting); // 你好,世界! +} +``` + +You can also pass the return value of another translation as a parameter, since each parameterless translation function returns a `&'static str`, completely allocation-free: + +```rust +let greeting = Global::greeting(Global::world()); +``` + + + +# Contributing + +Directly open a PR to the [repository](https://github.com/catilgrass/shakehand) and mention [@Weicao-CatilGrass](https://github.com/Weicao-CatilGrass). + + + +# License + +MIT or Apache 2.0 |
