API
nsh/i18n
nsh/i18n 以用户的语言显示应用的文本。翻译来自应用的 locales/ 文件,格式与 rust-i18n 相同,构建时读取并随 bundle 一起提供;API 也与 rust-i18n 相同,Rust 组件在 nsh_core::prelude 中有对应的 t!、set_locale 和 available_locales。I18n 介绍了如何翻译一个应用。
import { availableLocales, setLocale, t } from "nsh/i18n";
它在所有平台上可用,包括 Web。
#t
function t(key: string, options?: { locale?: string; [name: string]: unknown }): string;
返回 key 在应用显示的语言下的文本:用户偏好语言(localeSettings().languages)中第一个应用有翻译的语言,否则为 locale() 的语言。
options中除locale外的成员会填入文本的%{name}占位符,按文本写出(String(value))。options.locale用于取另一种语言的文本。- 某个语言缺少的 key,会依次从去掉最后一个子标签的语言(
zh-Hant-TW、zh-Hant、zh)中查找,再从英语(en)中查找。所有语言都没有时,文本为<locale>.<key>。 - 读取它会订阅语言和翻译:显示它的文本会随
setLocale、用户设置以及开发中的文件变化而更新。
<Text>{t("cart.items", { count: items().length })}</Text>
#setLocale
function setLocale(locale: string | null): void;
让应用显示 locale(BCP 47 标签,"zh-CN"),而不管用户的语言:t、locale()、localeSettings().languages 的第一项和 Intl 的默认 locale 会立即跟随它。null 重新跟随用户的语言。不是语言标签的字符串会抛出 RangeError。这个选择在应用运行期间有效,只作用于它所在的 surface。
#availableLocales
function availableLocales(): string[];
应用翻译所包含的语言,按文件中的写法排序(["en", "ja", "zh-CN"])。
#文件
nsh.json 旁边的 locales/ 存放 rust-i18n 的文件:YAML、JSON 或 TOML,每种语言一个(en.yml、app.zh-CN.yml),或一个文件包含所有语言(_version: 2)。key 用点嵌套。见翻译文件。
#nsh.json
"locales" 列出除英语外 bundle 需要携带数字和日期数据的语言;没有它时为翻译所包含的语言(数字和日期)。