Optimizing the search and matching of Label tags in main.js

This commit is contained in:
yangxiaowei 2022-09-19 09:42:11 +08:00
parent 41d84aa77a
commit be1d0c9a21
5 changed files with 247 additions and 290 deletions

View File

@ -8,12 +8,13 @@ marktext 简体中文汉化包
1. 通过资源替换方式修复MacOS下导入文档与图床上传失败的Bug 1. 通过资源替换方式修复MacOS下导入文档与图床上传失败的Bug
2. 加入自动翻译脚本,在编译的时候自动编译。 2. 加入自动翻译脚本,在编译的时候自动编译。
3. 优化main.js中Label标记的搜索与匹配
###### 当前状态: ###### 当前状态:
        本预计发布多国语版本,考虑修改地方太多后期与官方代码同步将是非常繁重的任务,正在寻求一个更好的源码同步方案,暂不发布多国语版本。不过先把资源翻译代码开源,有兴趣的可以尝试自己编译所需要的操作系统版本。         本预计发布多国语版本,考虑修改地方太多后期与官方代码同步将是非常繁重的任务,正在寻求一个更好的源码同步方案,暂不发布多国语版本。不过先把资源翻译代码开源,有兴趣的可以尝试自己编译所需要的操作系统版本。
        如果其它国家的朋友也需要自己的语言包可以翻译translate-resources/main_dict_zh-cn.txt、translate-resources/renderer_dict_zh-cn.txt文件并命名为translate-resources/main_dict_[lang].txt, translate-resources/renderer_dict_[lang].txt并编辑编译时请设置环境变量lang=你的语言缩写,如果你希望分享你的翻译成果,可以在[Issues](https://github.com/chinayangxiaowei/marktext-chinese-language-pack/issues)提交报告。         如果其它国家的朋友也需要自己的语言包可以翻译translate-resources/xxx_zh-cn.txt文件并命名为translate-resources/xxx_[lang].txt编译时请设置环境变量lang=你的语言缩写,如果你希望分享你的翻译成果,可以在[Issues](https://github.com/chinayangxiaowei/marktext-chinese-language-pack/issues)提交报告。
###### 下载地址: ###### 下载地址:

View File

@ -45,44 +45,83 @@ function searchLabelsFromFile( fileName:string, exclude: void|string[]) : string
return labels; return labels;
} }
function replaceLabelsFromFile( fileName:string, enDict: string[], toDict: string[]) : string { function replaceLabelsFromFile( fileName:string, toDict: string[]) : string {
let content:string = "" let content:string = ""
if (enDict.length == toDict.length){ let toKeys:string[] = []
if (fs.existsSync(fileName)) { let toVals:string[] = []
let buffer = fs.readFileSync(fileName, "utf-8") for (let i = 0; i < toDict.length; i++) {
let pat = /(label):"(.*?)"/gms if (toDict[i].trim().length > 0) {
content = buffer.replace(pat, (match, key, value) => { const tow_cell = toDict[i].split('|')
const idx = enDict.indexOf(value) if (tow_cell.length == 2 ){
if (idx != -1) { toKeys.push(tow_cell[0])
return key + ':"' + toDict[idx] + '"' toVals.push(tow_cell[1])
}
return match
})
} }
}
} }
if (fs.existsSync(fileName)) {
let buffer = fs.readFileSync(fileName, "utf-8")
let pat = /(label):"(.*?)"/gms
content = buffer.replace(pat, (match, key, value) => {
const idx = toKeys.indexOf(value)
if (idx != -1) {
return key + ':"' + toVals[idx] + '"'
}
return match
})
}
return content return content
} }
function replaceMain(fileName:string, langRootPath:string, enDict:string[], toLang:string, outFileName:string) : boolean { function replaceMainLabelDict(fileName:string, langRootPath:string, toDict:string[], toLang:string, outFileName:string) : boolean {
if (enDict.length == 0){
return false
}
const toDictFileName = path.join(langRootPath, "translate-resources/main_dict_" + toLang + ".txt")
const toDict = readStringArrayFromFile(toDictFileName)
if (toDict.length == 0){ if (toDict.length == 0){
console.log("error in replaceMain, readStringArrayFromFile failed, not found "+ toDictFileName +".")
return false return false
} }
const main_content = replaceLabelsFromFile( fileName, enDict, toDict); const main_content = replaceLabelsFromFile( fileName, toDict);
if (main_content.length>0) { if (main_content.length>0) {
fs.writeFileSync( outFileName, main_content ) fs.writeFileSync( outFileName, main_content )
return true return true
}else{ }else{
console.log("error in replaceMain, replaceLabelsFromFile failed.") console.log("error in replaceMainLabelDict, replaceLabelsFromFile failed.")
} }
return false return false
} }
function replaceMain(fileName:string, langRootPath:string, toLang:string, outFileName:string): boolean {
const toDictFileName = path.join(langRootPath, "translate-resources/main_dict_" + toLang + ".txt")
const toDict = readStringArrayFromFile(toDictFileName)
if (toDict.length == 0){
console.log("error in replaceMain, readStringArrayFromFile failed, not found "+ toDictFileName +".")
return false
}
if (!fs.existsSync(fileName)) {
console.log("error in replaceMain, not found "+ fileName +".")
return false
}
let content = fs.readFileSync(fileName, "utf-8")
for (let i = 0; i < toDict.length; i++) {
if (toDict[i].trim().length > 0) {
const tow_cell = toDict[i].split('|')
if (tow_cell.length == 2 ){
content = content.replace(tow_cell[0], tow_cell[1])
}
}
}
if (content.length>0) {
fs.writeFileSync( outFileName, content )
return true
}else{
console.log("error in replaceMain, readFileSync or replace failed.")
}
return false
}
function replaceRenderer(fileName:string, langRootPath:string, toLang:string, outFileName:string): boolean { function replaceRenderer(fileName:string, langRootPath:string, toLang:string, outFileName:string): boolean {
const toDictFileName = path.join(langRootPath, "translate-resources/renderer_dict_" + toLang + ".txt") const toDictFileName = path.join(langRootPath, "translate-resources/renderer_dict_" + toLang + ".txt")
const toDict = readStringArrayFromFile(toDictFileName) const toDict = readStringArrayFromFile(toDictFileName)
@ -118,39 +157,68 @@ function replaceRenderer(fileName:string, langRootPath:string, toLang:string, ou
} }
function initMainEnDict(fileName:string, langRootPath:string) : string[] { function initMainLabelDict(fileName:string, langRootPath:string, toLang:string) : string[] {
const enDictFileName = path.join(langRootPath, "translate-resources/main_dict_en.txt")
let enDict = readStringArrayFromFile(enDictFileName)
if (enDict.length==0){ const toDictFileName = path.join(langRootPath, "translate-resources/main_label_dict_" + toLang + ".txt")
const excludeDict = readStringArrayFromFile( path.join(langRootPath, "translate-resources/exclude.txt")) let toDict = readStringArrayFromFile(toDictFileName)
enDict = searchLabelsFromFile(fileName, excludeDict) let toKeys:string[] = []
if (enDict.length>0){ for (let i = 0; i < toDict.length; i++) {
writeStringArrayToFile(enDictFileName, enDict) if (toDict[i].trim().length > 0) {
const tow_cell = toDict[i].split('|')
if (tow_cell.length == 2 ){
toKeys.push(tow_cell[0])
} }
}
} }
if (enDict.length==0){ const excludeDict = readStringArrayFromFile( path.join(langRootPath, "translate-resources/exclude.txt"))
console.log("error in initMainEnDict, enDict is Empty.") let enDict = searchLabelsFromFile(fileName, excludeDict)
}
return enDict
}
export function markTextAsarTranslate(langRootPath:string, toLang:string, mainJsFileName:string, outMainJsFileName:string, rendererJsFileName:string, outRendererJsFileName:string): void {
const enDict = initMainEnDict(mainJsFileName, langRootPath)
if (enDict.length>0){ if (enDict.length>0){
if (replaceMain(mainJsFileName, langRootPath, enDict, toLang, outMainJsFileName)){ let nAdd = 0
console.log("replaceMain success.") for (let i=0; i<enDict.length; i++){
}else{ if (toKeys.indexOf(enDict[i]) == -1){
console.log("replaceMain failed.") toDict.push(enDict[i]+'|'+enDict[i])
toKeys.push(enDict[i])
nAdd++
} }
}
if (nAdd!=0){
//UI Label change, need to rewrite.
writeStringArrayToFile(toDictFileName, toDict)
}
} }
if (replaceRenderer(rendererJsFileName, langRootPath, toLang, outRendererJsFileName)){ if (toDict.length==0){
console.log("replaceRenderer success.") console.log("warring in initMainLabelDict, toDict is Empty.")
}else{
console.log("replaceRenderer failed.")
} }
return toDict
}
export function markTextAsarTranslate(langRootPath:string, toLang:string, mainJsFileName:string, outMainJsFileName:string, rendererJsFileName:string, outRendererJsFileName:string): boolean {
const toDict = initMainLabelDict(mainJsFileName, langRootPath, toLang)
if (toDict.length>0){
if (replaceMainLabelDict(mainJsFileName, langRootPath, toDict, toLang, outMainJsFileName)){
console.log("replaceMainLabelDict success.")
}else{
console.log("replaceMainLabelDict failed.")
return false
}
}
if (replaceMain(mainJsFileName, langRootPath, toLang, outMainJsFileName)){
console.log("replaceMain success.")
}else{
console.log("replaceMain failed.")
return false
}
if (replaceRenderer(rendererJsFileName, langRootPath, toLang, outRendererJsFileName)){
console.log("replaceRenderer success.")
}else{
console.log("replaceRenderer failed.")
return false
}
return true
} }

View File

@ -1,121 +0,0 @@
&Edit
Undo
Redo
Cut
Copy
Paste
Copy as Markdown
Copy as HTML
Paste as Plain Text
Select All
Duplicate
Create Paragraph
Delete Paragraph
Find
Find Next
Find Previous
Replace
Find in Folder
Screenshot
Line Ending
Carriage return and line feed (CRLF)
Line feed (LF)
Edit
&File
New Tab
New Window
Open File...
Open Folder...
Open Recent
Clear Recently Used
Save
Save As...
Auto Save
Move To...
Rename...
Import...
Export
HTML
PDF
Print
Preferences...
Close Tab
Close Window
Quit
&Help
Quick Start...
Markdown Reference...
Changelog...
Donate via Open Collective...
Feedback via Twitter...
Report Issue or Request Feature...
Website...
Watch on GitHub...
Follow us on Github...
Follow us on Twitter...
License...
Check for updates...
About MarkText...
MarkText
About MarkText
Preferences
Services
Hide MarkText
Hide Others
Show All
Quit MarkText
&View
Command Palette...
Source Code Mode
Typewriter Mode
Focus Mode
Show Sidebar
Show Tab Bar
Toggle Table of Contents
Reload Images
Show Developer Tools
Reload window
&Window
Minimize
Always on Top
Zoom In
Zoom Out
Show in Full Screen
Bring All to Front
&Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Promote Heading
Demote Heading
Table
Code Fences
Quote Block
Math Block
Html Block
Ordered List
Bullet List
Task List
Loose List Item
Paragraph
Horizontal Rule
Front Matter
F&ormat
Bold
Italic
Underline
Superscript
Subscript
Highlight
Inline Code
Inline Math
Strikethrough
Hyperlink
Image
Clear Formatting
&Theme
Open...
Clear Recent

View File

@ -1,121 +1,9 @@
编辑 role:"recentdocuments"|label:"最近使用的文件",role:"recentdocuments"
撤销 role:"clearrecentdocuments"|label:"清空最近文件列表",role:"clearrecentdocuments"
重做 "Save","Cancel","Don't save"|"保存","取消","不保存"
剪切 Do you want to save the changes you made to ${t.length} ${1===t.length?"file":"files"}?|是否要保存对${t.length}个文件所做的更改?
复制 Your changes will be lost if you don't save them.|如果您不保存更改,您的更改将会丢失。
粘贴 title:"Exported successfully"|title:"导出成功"
复制为 Markdown message:`Exported "${ne().basename(i)}" successfully!`|message:`导出 "${ne().basename(i)}" 成功!`
复制为 HTML title:"Import Warning"|title:"导入警告"
粘贴为纯文本 message:"Install pandoc before you want to import files."|message:"在导入文件之前先安装 pandoc。"
全选
复写到新段落
新建段落
删除段落
查找
查找下一个
查找上一个
替换
在文件夹中查找
截屏
行结束符号
回车换行 (CRLF)
换行 (LF)
编辑
文件
新建标签页
新建窗口
打开文件...
打开文件夹...
最近使用的文件
清空最近文件列表
保存
另存为...
自动保存
移动到...
重命名...
导入...
导出
HTML
PDF
打印
偏好设置...
关闭标签页
关闭窗口
退出
帮助
快速入门...
Markdown 参考指南...
更新日志...
通过 Open Collective 捐助我们...
在 Twitter 上和我们反馈...
反馈问题或功能建议...
访问官网...
在 GitHub 关注 MarkText...
在 Github 上关注我们...
在 Twitter 上关注我们...
许可协议...
检查更新...
关于 MarkText...
MarkText
关于 MarkText
偏好设置
服务
隐藏 MarkText
隐藏其它
显示全部
退出 MarkText
视图
命令面板...
源代码模式
打字机模式
专注模式
显示侧边栏
显示标签栏
显示/隐藏目录
重新加载图像
显示开发者工具
重新加载窗口
窗口
最小化
总在最前面
放大
缩小
全屏显示
前置全部窗口
段落
标题 1
标题 2
标题 3
标题 4
标题 5
标题 6
提升标题级别
降低标题级别
表格
代码块
引用块
数学公式块
Html块
有序列表
无序列表
任务列表
松散列表项
段落
水平线
前文(Front Matter)
格式
粗体
斜体
下划线
上标
下标
高亮
行内代码
行内数学公式
删除线
超链接
图片
清除格式
主题
打开...
清空最近文件列表

View File

@ -0,0 +1,121 @@
&Edit|编辑
Undo|撤销
Redo|重做
Cut|剪切
Copy|复制
Paste|粘贴
Copy as Markdown|复制为 Markdown
Copy as HTML|复制为 HTML
Paste as Plain Text|粘贴为纯文本
Select All|全选
Duplicate|复写到新段落
Create Paragraph|新建段落
Delete Paragraph|删除段落
Find|查找
Find Next|查找下一个
Find Previous|查找上一个
Replace|替换
Find in Folder|在文件夹中查找
Screenshot|截屏
Line Ending|行结束符号
Carriage return and line feed (CRLF)|回车换行 (CRLF)
Line feed (LF)|换行 (LF)
Edit|编辑
&File|文件
New Tab|新建标签页
New Window|新建窗口
Open File...|打开文件...
Open Folder...|打开文件夹...
Open Recent|最近使用的文件
Clear Recently Used|清空最近文件列表
Save|保存
Save As...|另存为...
Auto Save|自动保存
Move To...|移动到...
Rename...|重命名...
Import...|导入...
Export|导出
HTML|HTML
PDF|PDF
Print|打印
Preferences...|偏好设置...
Close Tab|关闭标签页
Close Window|关闭窗口
Quit|退出
&Help|帮助
Quick Start...|快速入门...
Markdown Reference...|Markdown 参考指南...
Changelog...|更新日志...
Donate via Open Collective...|通过 Open Collective 捐助我们...
Feedback via Twitter...|在 Twitter 上和我们反馈...
Report Issue or Request Feature...|反馈问题或功能建议...
Website...|访问官网...
Watch on GitHub...|在 GitHub 关注 MarkText...
Follow us on Github...|在 Github 上关注我们...
Follow us on Twitter...|在 Twitter 上关注我们...
License...|许可协议...
Check for updates...|检查更新...
About MarkText...|关于 MarkText...
MarkText|MarkText
About MarkText|关于 MarkText
Preferences|偏好设置
Services|服务
Hide MarkText|隐藏 MarkText
Hide Others|隐藏其它
Show All|显示全部
Quit MarkText|退出 MarkText
&View|视图
Command Palette...|命令面板...
Source Code Mode|源代码模式
Typewriter Mode|打字机模式
Focus Mode|专注模式
Show Sidebar|显示侧边栏
Show Tab Bar|显示标签栏
Toggle Table of Contents|显示/隐藏目录
Reload Images|重新加载图像
Show Developer Tools|显示开发者工具
Reload window|重新加载窗口
&Window|窗口
Minimize|最小化
Always on Top|总在最前面
Zoom In|放大
Zoom Out|缩小
Show in Full Screen|全屏显示
Bring All to Front|前置全部窗口
&Paragraph|段落
Heading 1|标题 1
Heading 2|标题 2
Heading 3|标题 3
Heading 4|标题 4
Heading 5|标题 5
Heading 6|标题 6
Promote Heading|提升标题级别
Demote Heading|降低标题级别
Table|表格
Code Fences|代码块
Quote Block|引用块
Math Block|数学公式块
Html Block|Html块
Ordered List|有序列表
Bullet List|无序列表
Task List|任务列表
Loose List Item|松散列表项
Paragraph|段落
Horizontal Rule|水平线
Front Matter|前文(Front Matter)
F&ormat|格式
Bold|粗体
Italic|斜体
Underline|下划线
Superscript|上标
Subscript|下标
Highlight|高亮
Inline Code|行内代码
Inline Math|行内数学公式
Strikethrough|删除线
Hyperlink|超链接
Image|图片
Clear Formatting|清除格式
&Theme|主题
Open...|打开...
Clear Recent|清空最近文件列表