i18n 多语言支持

BSV 内置多国语言支持,使用参考如下:

使用方法:

import i18n, { LanguageCode } from "/src/i18n";
i18n.setLanguageCode(LanguageCode["zh-CN"]);
// 获取 key 为 example.hello
i18n.t("example.hello");
// 查找英语对应的值
i18n.lt(LanguageCode["en"], "example.hello");
// 增加数据
i18n.assign(LanguageCode["zh-CN"], { testi18n: "hello, {hi} {ma}" });
// 有变量的获取模版数据
const result = i18n.t("testi18n", { hi: "Jack", ma: "Ma" });
// result: "hello, Jack Ma"
// 支持国际格式化参数, format: 'number' | 'currency' | 'list' | 'datetime' | 'relativetime'
const result2 = i18n.lt(
LanguageCode["zh-CN"],
"testi18n",
{ hi: 1000, ma: 1654362035178 },
{
hi: {
format: "currency",
currency: 'CNY'
},
ma: {
format: "datetime",
dateStyle: "short",
timeStyle: "short",
},
}
);
// result2: "hello world ¥1,000.00 2022/6/5 01:00"

格式化参数请参考 Intl 文档:

服务端 i18n

服务端使用多语言需要使用 i18n.lt(req.lang, 'exhamge.hello') 这种指定语言的方式获取到对应语言的值,req.lang 是通过前端的 headers.language 得到。

前端 i18n

import i18n, { i18n, LanguageCode } from "/src/i18n";
// 设置指定语言
i18n.setLanguageCode(LanguageCode["zh-CN"]);
// 再通过 $t 获取到值
i18n.t("example.hello");

yup 校验 i18n

后端的参数校验代码和前端是共享的,所以写参数校验需要注意的事项,指定 label

import * as yup from "yup";
const schema = yup.object().shape({
title: yup.string().required().label("todo.title"),
remark: yup.string().label("todo.remark"),
});