如何为你的插件加入i18n支持

hello~
我是ons同步插件的开发者
我的插件开始内部测试后, 遇到有x上的网友不会中文, 我琢磨obsidian不就是魔改的浏览器吗 :thinking:, 结果各种方法尝试了一遍, 发现获取不到当前设备的语言 :sweat_smile:… 只好就此搁置

直到!! 官方人员给我指了一个仓库, 是官方内部人员开发的插件, 我发现他们内部实现i18n是通过Moment.js的locale函数 :astonished:

我一直以为是会有一个内部api, 用于管理语言, 之前也是按照这个方向查找测试, 结果方向都错了, 人家用的时间处理库的函数 :rofl:

具体使用 :point_down:

// 获取本地语言, 获取不到就默认英语
const locale = (window.moment) ? window.moment.locale() : "en";
// 导入英文语言字典
import en from "./en";
// 导入中文语言字典
import zh from "./zh";
// 声明语言列表
const localeMap: { [k: string]: Partial<typeof en> } = {
    en,
    "zh-cn": zh,
};
// 获取当前用户语言字典
const userLocale = localeMap[locale];
// 输入标识, 输出本地化语言文本
export default function t(str: keyof typeof en, ...inserts: string[]): string {
    let localeStr = (userLocale && userLocale[str]) ?? en[str];
    for (let i = 0; i < inserts.length; i++) {
        localeStr = localeStr.replace(`%${i + 1}`, inserts[i]);
    }
    return localeStr;
}

前往仓库查看实际使用

另外根据官方回复中的

Once Obsidian 1.8 is publicly released, there will be a getLanguage function that will replace the moment.locale() call, the docs will include an example for this then.

1.8版本会上getLanguage函数来获取本地语言, 不过建议各位还是先用moment的, 等再过一到两个小版本后再更换, 防止有用户版本过低带来兼容问题

我是用的这个:

localStorage.getItem('language')

image

1.8 版本会上 getLanguage 函数

好唉,期待。