翻译

标识与译名的双向查找,以及按类目的翻译函数。

星盘上每个字段都同时给出译名与 *_key 标识,通常不必手工翻译。 这些函数用于手上只有标识(或只有某种语言的译名)、需要换算的场合。

支持六种语言:zh-CNzh-TWen-USja-JPko-KRvi-VN


translate_key

用途 把任意标识译成指定语言。

签名

pub fn translate_key(key: &str, lang: Language) -> Option<&'static str>

参数

参数类型必填默认说明
key&str语言无关标识
langLanguage目标语言

覆盖十二类共 260 个标识:

类目数量
星耀162ziweiMajchangshengyunlu
宫位(含身宫、来因宫)14soulPalacewealthPalacebodyPalaceoriginalPalace
天干10jiaHeavenly
地支12ziEarthly
亮度7miaowang
四化4sihuaLu
五行局5water2nd
性别2malefemale
生肖12ratox
时辰13earlyRatHour
星座12aries
运限层级7decadalturn

返回值 Option<&'static str>。未知标识返回 None

示例

println!("{:?}", translate_key("ziweiMaj", Language::EnUS));
println!("{:?}", translate_key("soulPalace", Language::JaJP));
println!("{:?}", translate_key("nosuch", Language::ZhCN));

输出

Some("emperor")
Some("命宮")
None

key_of

用途 由任意语言的译名反查标识。

签名

pub fn key_of(text: &str) -> Option<&'static str>
pub fn key_of_in(text: &str, key_filter: &str) -> Option<&'static str>

参数

参数类型必填默认说明
text&str任一支持语言下的译名
key_filter&str限定标识名须含的子串,用于消歧同形译名

返回值 Option<&'static str>。查不到返回 None

示例

println!("{:?}", key_of("紫微"));
println!("{:?}", key_of("emperor"));
println!("{:?}", key_of("자미"));
println!("{:?}", key_of("查无此名"));

输出

Some("ziweiMaj")
Some("ziweiMaj")
Some("ziweiMaj")
None

三种语言的译名都落到同一个标识。

边界与陷阱


all_keys

用途 取全部 260 个可翻译标识。

签名

pub fn all_keys() -> Vec<&'static str>

返回值 Vec<&'static str>,顺序即 key_of 的反查次序: 运限层级、生肖、时辰、星座、五行局、天干、地支、亮度、四化、星耀、宫位、性别, 与 iztro 各语言翻译文件的合并次序一致。

示例

use x_iztro::i18n::lookup::{all_keys, translate_key};

let keys = all_keys();
println!("{} 个标识", keys.len());
println!("{:?}", &keys[..4]);
println!("{:?}", translate_key(keys[0], Language::ZhCN));

输出

260 个标识
["decadal", "childhood", "yearly", "monthly"]
Some("大限")

要遍历某一类目自己的标识时,直接用 data 模块的对应常量 (ALL_STARSPALACESHEAVENLY_STEMSMUTAGEN 等)更省事。


按类目的翻译函数

标识的类别已知时,用对应的强类型函数更直接,也免去 Option

函数入参
translate_starStarKey
translate_palacePalace
translate_heavenly_stemHeavenlyStem
translate_earthly_branchEarthlyBranch
translate_brightnessBrightness
translate_mutagenMutagen
translate_five_elements_classFiveElementsClass
translate_genderGender
translate_zodiacEarthlyBranch
translate_timeu8(时辰索引 0–12)
translate_signusize(星座索引 0–11,白羊起)
translate_horoscope_nameHoroscopeName

全部形如 fn(值, Language) -> &'static str,返回静态字符串不分配内存。

示例

use x_iztro::i18n::{translate_palace, translate_star};

println!("{}", translate_star(StarKey::ZiweiMaj, Language::ViVN));
println!("{}", translate_palace(Palace::Soul, Language::KoKR));

输出

Tử Vi
명궁

没有全局语言开关

x-iztro 不设「当前语言」这样的全局状态:排盘时语言随参数传入, 翻译函数每次调用都显式指定目标语言。

为什么

全局语言开关会让同一段代码在不同调用顺序下产出不同结果, 多线程环境尤其危险。显式传参使每次调用的结果只由入参决定。

要在一个进程里同时输出多种语言,直接排多张盘或多次调用翻译函数即可,互不干扰:

let zh = by_solar("2000-8-16", 2, Gender::Female, true, Language::ZhCN, Config::default())?;
let en = by_solar("2000-8-16", 2, Gender::Female, true, Language::EnUS, Config::default())?;

println!("{} / {}", zh.palace(Palace::Soul).unwrap().major_stars[0].name,
                    en.palace(Palace::Soul).unwrap().major_stars[0].name);

输出

紫微 / emperor

本页目录