国际化
Stream Dock 支持多语言。
清单包含多个可以国际化的字符串。您可以在位于manifest.json
旁边的 JSON en.json
{
"Description": "Test",
"Name": "Test",
"Category": "Test",
"com.mirabox.demo.action1": {
"Name": "Test",
"Tooltip": "Test"
},
"Localization": {
"test": "Test"
}
}
请注意,如果您不提供本地化字符串,则将使用manifest.json
文件中的字符串。Stream Dock 支持以下语言:
简体中文: zh_CN.json
德语: de.json
英语: en.json
法语: fr.json
日语: ja.json
韩语: ko.json
西班牙语: es.json
您还可以在 JSON 文件中提供自己的字符串。
这些文件必须保存在插件的目录中。您将在模板插件中找到一个示例。下面是该文件的一个示例en.json
如何在 Property Inspector 中自动本地化字符串
{
"Description": "Test",
"Name": "Test",
"Category": "Test",
"com.mirabox.demo.action1": {
"Name": "Test",
"Tooltip": "Test"
},
"Localization": {
"test": "Test"
}
}
对于普通的 js 模板如果您在插件中需要以国际化形式显示这些字符串,您只需要将Localization中对应的键直接写在您属性检查器的index.js中并设置$local = true
,SDK会自动翻译
if (!$local) return;
$lang = await new Promise(resolve => {
const req = new XMLHttpRequest();
req.open('GET', `../../${JSON.parse(app).application.language}.json`);
req.send();
req.onreadystatechange = () => {
if (req.readyState === 4) {
resolve(JSON.parse(req.responseText).Localization);
}
};
});
// 遍历文本节点并翻译所有文本节点
const walker = document.createTreeWalker($dom.main, NodeFilter.SHOW_TEXT, (e) => {
return e.data.trim() && NodeFilter.FILTER_ACCEPT;
});
while (walker.nextNode()) {
console.log(walker.currentNode.data);
walker.currentNode.data = $lang[walker.currentNode.data];
}
// placeholder 特殊处理
const translate = item => {
if (item.placeholder?.trim()) {
console.log(item.placeholder);
item.placeholder = $lang[item.placeholder];
}
};
$('input', true).forEach(translate);
$('textarea', true).forEach(translate);
对于 Vue 模板需要在src/hooks/i18n.ts
中定义这些字符串,并在需要使用的地方手动引入useI18nStore
并使用
export const useI18nStore = () => {
const language = window.argv[3].application.language;
const localString = {
en: {
test: 'test'
},
zh_CN: {
test: '测试'
}
};
return localString[language] || localString['en'];
};
示例:
<script setup lang="ts">
import { usePropertyStore, useWatchEvent } from '@/hooks/property';
import { useI18nStore } from '@/hooks/i18n';
const i18n = useI18nStore();
const property = usePropertyStore();
useWatchEvent({
didReceiveSettings(data) {},
sendToPropertyInspector(data) {}
});
</script>
<template>
<div>{{ i18n.test }}</div>
</template>