English (Google or DeepL translate) | 日本語
Rustの多言語対応用プログラム
yamlを使って多言語対応ができます。
(crates.io での配布はしていません)
(ほぼ自分用ですが) このクレートを使用するには、
Cargo.toml の dependencies に以下を追記します。
# バージョンは適宜変更してください
langrustang = { git = "https://github.com/aq2r/langrustang", tag = "v1.1.4" }
yaml ファイルの書き方:
Any_key:
all:
any_lang_key_1: XXX
any_lang_key_2: YYY
any_lang_key_3: ZZZ
Any_key2:
...
Any_key は任意の文字を使うことができます。
any_lang_key の最初の文字は小文字のアルファベットである必要があります。
2番目以降の文字は小文字のアルファベット、数字、またはアンダースコアである必要があります。
また、言語キーの最後の文字をアンダースコアにすることはできません。
lang_t_ex1:
all: ALL_EXAMPLE
lang_t_ex2:
ja: おはよう
en: hello!
zh: 你好
anykey1: Any?
some_key_2: Some!
lang_t_ex3:
all: ALL
ja: おはよう
en: hello!
zh: 你好
lang_t_ex4:
ja: おはよう
en: hello!
zh: 你好
format_t_ex1:
all: "Hi, {}! "
format_t_ex2:
all: "{}, ALL!"
ja: "{}, おはよう!"
en: "{}, Hello!"
zh: "{}, 你好!"
langrustang::i18n!("lang.yaml"); // `_langrustang_autogen::Lang` を自動生成する
use crate::_langrustang_autogen::Lang;
use langrustang::{lang_t, println_t};
fn main() {
// enum の要素は、yamlに書いたキーによって自動で生成されます
let lang_en = Lang::En;
let lang_ja = Lang::Ja;
let lang_zh = Lang::Zh;
let lang_anykey1 = Lang::Anykey1;
let lang_somekey2 = Lang::SomeKey2;
println!("{}", lang_t!("lang_t_ex1")); // ALL_EXAMPLE
println!("{}", lang_t!("lang_t_ex2", lang_en)); // hello!
println!("{}", lang_t!("lang_t_ex2", lang_ja)); // おはよう
println!("{}", lang_t!("lang_t_ex2", lang_zh)); // 你好
println!("{}", lang_t!("lang_t_ex3", lang_en)); // hello!
println!("{}", lang_t!("lang_t_ex3", lang_anykey1)); // ALL
// println!("{}", lang_t!("lang_t_ex4", lang_anykey1)); // Missing language key: ["any_key1", "some_key_2"]
let name = "Ferris";
println_t!("format_t_ex1", name);
println_t!("format_t_ex2", lang_ja, name);
}
- Example 1
言語キーが all
のみの場合は、そのキーを使用して取得できます。
println!("{}", lang_t!("lang_t_ex1")); // ALL_EXAMPLE
- Example 2
all
キー以外に他のキーがある場合、
自動生成された Lang Enum を使用して取得します。
println!("{}", lang_t!("lang_t_ex2", lang_en)); // hello!
println!("{}", lang_t!("lang_t_ex2", lang_ja)); // おはよう
println!("{}", lang_t!("lang_t_ex2", lang_zh)); // 你好
- Example 3
足りない言語キーがある場合、キーを指定するとコンパイルエラーになります。
ただし、all
キーが指定されている場合は、その値が代わりに使用されます。
println!("{}", lang_t!("lang_t_ex3", lang_en)); // hello!
println!("{}", lang_t!("lang_t_ex3", lang_anykey1)); // ALL
// println!("{}", lang_t!("lang_t_ex4", lang_en)); // Compile Error!
all
キーだけの場合は、最初に yaml のキーを渡してから、
通常のフォーマットと同じように、2番目以降の format の引数を渡します。
言語キーが他に指定されている場合は、yaml のキーを最初に渡してから、
2番目の引数に Lang Enum を渡して、それから format の引数を渡します。
let name = "Ferris";
println_t!("format_t_ex1", name); // Hi, Ferris!
println_t!("format_t_ex2", lang_ja, name); // Ferris, おはよう!