常见问题
提取翻译内容是否能够过滤注释?
是的,翻译内容是可以过滤注释的。 翻译前会采用正则表达式过滤掉注释内容,如果有特殊情况,请提出issue。
是否支持查看哪些文件包含提取结果?
在languages/translate/default.json
中会显示从哪一个文件提取的。
{
" - 更新格式化器:{}": {
"en": " - Update formatters:{}",
"$files": [
"compile.command.js" // 代表是从该文件中提取的
]
}
}
如何处理不同上下文下的一词多译的情况?
一词多译指的是一个词在不同的地方要翻译显示为不同的内容。
比如t("确定")
,在不同的上下文中,可能需要分别翻译为OK
或Complate
,但是提取内容时则内能提出同一个词确定
,这就导致无法做到一词多译。
很抱歉,现有版本没有针对此做特别的处理,您需要在不同上下文使用不同的中文词条,避免使用一词多译。
在下一版本中将考虑此问题的处理机制,
如何高效改造旧项目?
目前VoerkaI18n
没有提供相应的插件或工具来将其他国际化方案迁移到VoerkaI18n
。
如果你的项目原来没有使用任何国际化方案,可以尝试以下方案来减轻一些工作量。
可以在VSCODE
中使用在文件中替换,然后输入正则表达式(['"]([^'"\n\\]|\\[\s\S])*[\u4E00-\u9FFF]([^'"\n\\]|\\[\s\S])*['"])
,替换成t($0)
这样可以将大部分包括中文且使用"xxx",'xxxx'的替换成t("xxxx")
形式。
但是由于实际情况很复杂,哪些需要翻译哪些不需要等等,单靠一个正则表达式替换是不能解决问题的,即容易误伤,也容易出错。
只能说可以减少一些工作量,需要更多的人工介入才可以的。
为什么指定了activeLanguage
不能生效?
为什么有时指定了activeLanguage
参数后,还是不能生效?
原因可能是:
VoerkaI18n
默认情况下会在LocalStorage
下存储最近切换的语言,当您修改了languages/index.(js|ts)
中的activeLanguage
配置后.
由于LocalStorage
中已经有值(上一次记住的activeLanguage
)了,所以VoerkaI18n
会优先使用LocalStorage
中的值,而不是activeLanguage
中的值。
这样就造成了activeLanguage
不能生效的现象。
解决方案:
- 清空
LocalStorage
中的language
值,然后刷新页面即可。
提示出错
- 运行时提示错误:
[VoerkaI18n] 默认语言包必须是静态内容,不能使用异步加载的方式.
?
在languages/index.(ts|js)
中,指定default=true
的语言包必须是直接import
的,不能使用异步加载的方式()=>import()
。
// 语言配置文件
const scopeSettings = {
"languages": [
{
"name": "zh",
"title": "Chinese"
},
{
"name": "en",
"title": "English",
"default":true,
}
]
}
// 错误示例
import defaultMessages from "./zh.js"
const messages = {
'zh' : defaultMessages,
// 由于默认语言是en,采用了异步加载的,所以会报错
'en' : ()=>import("./en.js")
}
// 正确示例
import defaultMessages from "./en.js"
const messages = {
'zh' : ()=>import("./en.js"),
'en' : defaultMessages // 正确:静态加载
}
defaultLanguage
和activeLanguage
- 默认语言(
defaultLanguage
):
指的是直接写在代码里面的语言。一般情况下,国产软件一般默认中文为默认语言,也就是我们直接在代码里面写的语言,如t("中文")
。并且在执行voerkai18n translate
命令时,总是将默认语言翻译成其他语言。
- 激活语言(
activeLanguage
):
指是界面上实际显示的语言,我们切换语言时,就是切换的激活语言。
在settings.json
中,默认语言和激活语言可以相同,也可以不同。
执行voerkai18n extract
提取到一些不需要翻译的文本,怎么办?
简单地说,就是提取要翻译的文本出现误伤的问题了,怎么办?
voerkai18n extract
的工作机制是这样的:
- 先使用正则表达式过滤掉注释内容。
- 再提取正则表达式提取
t(".....")
文本内容。
总之,就是利用正则表达式来匹配提取的,如果出现提取错误时,存在几种可能的原因:
- 不同
nodejs
版本的正则表达式引擎存在差异,导致提取错误。可以尝试升级nodejs
版本。 - 用来提取的正则表达式不够准确,某此边界问题没有覆盖,导致提取错误。请提出
issue
,我们会尽快修复。 extract
操作不能处理模板字符串
的情况,比如**t(xx${xxx}xx
)**就不能正确提取,请转换为使用插值变量的方式。