├── LICENSE ├── readme.md ├── resources ├── langPackage.json ├── package.json ├── warp.js └── 汉化文档 │ └── 详细使用方法 │ ├── 2lang.png │ ├── cmd.png │ ├── copy.png │ ├── cwd.png │ ├── download.png │ └── readme.md ├── shot1.png └── shot2.png /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # StarUML 中文汉化版语言翻译包 2 | 3 | ## 介绍 4 | 5 | 对官方版 StarUML 程序 by [staruml.io](https://staruml.io/) ,进行了部分汉化。 6 | 7 | 可自行在本地修改翻译文本,该项目所有数据与执行脚本均为明文开源,汉化脚本没有对程序做其他修改,仅做了部分文本的翻译。 8 | 9 | ![截图](./shot1.png) 10 | ![截图](./shot2.png) 11 | 12 | 关于 StarUML 或 UML 的使用心得大家也可以在这儿一起讨论 :-) 13 | 14 | ## 完善该中文包 15 | 16 | 你发现翻译问题,或有汉化补充、更好的翻译优化,可以提交 resources/langPackage.json 文件的 git MR请求到该 github 库。 17 | 18 | ## 如何使用 19 | 20 | ### 1. 电脑中安装node.js运行环境 21 | 22 | NodeJS [下载地址](https://nodejs.org/) 23 | 24 | 25 | 请确保命令行中能成功执行 26 | ```bash 27 | node -v 28 | ``` 29 | 30 | ### 2. 下载该汉化脚本的zip包 31 | 32 | 将包中的3个文件解压到 starUML 的安装目录中的 ```resources``` 目录中,要与目录中的 ```app.asar``` 文件平级。 33 | 34 | 包含3个主要文件: 35 | 36 | * langPackage.json 37 | * package.json 38 | * warp.js 39 | 40 | ### 3. 执行汉化脚本 41 | 42 | ```cd``` 到程序的安装目录 ```~/starUML/resources``` 下,执行 ```npm start``` 命令行。 43 | 44 | 看见提示 “```安装中文包完成。```”,则汉化完成,直接运行 starUML 程序开始使用就是中文界面了。 45 | 46 | ## 更多特性 47 | 48 | 文件 ```langPackage.json``` 即为翻译用的文本对照包,可自行对其中各项的 "lang" 字段进行修改,实现自定义翻译 49 | 50 | ```"language-immerse": true```, 字段值改为 ```false``` 可实现双语界面。 51 | 52 | 执行`npm start`后生效。 53 | 54 | ## 其他 55 | 56 | 目前汉化包 最新测试的版本范围 Node.js v18+ & StarUML 6.0.1 ~ 6.3.2 57 | 58 | [手把手 详细安装教程](resources/汉化文档/详细使用方法/readme.md) 59 | 60 | ## 感谢 StarUML 61 | 62 | 汉化包内容,任何人均可随意使用 -------------------------------------------------------------------------------- /resources/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "staruml-language", 3 | "version": "6.1.0.1", 4 | "description": "Zh-cn language package insert starUML, 中文汉化版本语言翻译包 ", 5 | "main": "warp.js", 6 | "scripts": { 7 | "start": "npm i & node warp.js", 8 | "warp": "node warp.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@electron/asar": "^3.2.8" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/warp.js: -------------------------------------------------------------------------------- 1 | const asar = require('@electron/asar'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | const src = './app'; 6 | const dest = './app.asar'; 7 | const bak = './app.before.lang.bak.asar'; 8 | 9 | 10 | async function main() { 11 | // var s = await asar.extractFile(dest, `${sFilePath}`); 12 | 13 | console.log('Parse startUML resource ...'); 14 | if (!fs.existsSync(bak)) { 15 | try { 16 | fs.copyFileSync(dest, bak); 17 | } catch (error) { 18 | console.error('确保是从程序路径 ~startUML\\resources 目录中执行'); 19 | throw error; 20 | } 21 | 22 | } 23 | await asar.extractAll(dest, src); 24 | 25 | console.log('Insert language package ...'); 26 | fs.copyFileSync('./langPackage.json', `${src}/langPackage.json`); 27 | if (fs.existsSync('./license-manager.js')) { 28 | fs.copyFileSync('./license-manager.js', `${src}/src/engine/license-manager.js`); 29 | } 30 | warpFileContent(`${src}/src/app-context.js`, [ 31 | 32 | ['super()', `super();\n${sConstructor}\n`], 33 | ['start() {', `${sMethod}\nstart() {`], 34 | ['this.menu.add(menus["menu"]);', `${sLoadDefaultMenusJsonFiles}\nthis.menu.add(menus["menu"]);`], 35 | ['this.preferences.register(prefs);', `${sLoadDefaultPreferencesJsonFiles}\nthis.preferences.register(prefs);`], 36 | 37 | ]); 38 | warpFileContent(`${src}/src/extensibility/extension-loader.js`, [ 39 | 40 | ['fun(obj)', `${sLoadJsonFiles}\nfun(obj)`], 41 | 42 | ]); 43 | 44 | 45 | await asar.createPackage(src, dest.replace('app.', 'app.')); 46 | console.log(`安装中文包完成。Install language package done. \n\n直接运行starUML使用。(如果汉化后程序报错,可将 ${bak} 重命名为 app.asar ,以恢复原版运行)`); 47 | 48 | }; 49 | 50 | 51 | function warpFileContent(filePath, replaceArr) { 52 | var sign = '/*language-had-insert*/'; 53 | var sFilePath = filePath.replace(/\//g, path.sep); 54 | var sFile = fs.readFileSync(filePath).toString(); 55 | if (~sFile.indexOf(sign)) { 56 | return; 57 | } 58 | 59 | console.log('Insert language warp ...'); 60 | 61 | replaceArr.forEach(arrDo => { 62 | sFile = sFile.replace(arrDo[0], arrDo[1]); 63 | }); 64 | 65 | sFile = sign+'\n' + sFile; 66 | 67 | fs.writeFileSync(filePath, sFile); 68 | 69 | } 70 | 71 | 72 | var sConstructor = ` 73 | 74 | this._langPackage = JSON.parse(fs.readFileSync(path.join((process.type === 'browser' ? require('electron').app.getAppPath() : ipcRenderer.sendSync('get-app-path')), 'langPackage.json')).toString()); 75 | this.langPackageWarp = this._langPackageWarp(); 76 | `; 77 | 78 | var sLoadDefaultMenusJsonFiles = ` 79 | this.langPackageWarp([\`/menus/$\{process.platform}\`, menus], (type, sub, o, path) => { 80 | this._langItemCope(o, type+'|'+path); 81 | }); 82 | `; 83 | 84 | var sLoadDefaultPreferencesJsonFiles = ` 85 | this.langPackageWarp([\`/menus/$\{process.platform}\`, menus], (type, sub, o, path) => { 86 | this._langItemCope(o, type+'|'+path); 87 | }); 88 | this.langPackageWarp(['/preferences/default', prefs], (type, sub, o, path) => { 89 | this._langItemCope(o, type+'|'+path); 90 | }); 91 | `; 92 | 93 | var sLoadJsonFiles = ` 94 | app.langPackageWarp([file, obj], (type, sub, o, path) => { 95 | app._langItemCope(o, type+'|'+path); 96 | }); 97 | `; 98 | 99 | var sMethod = ` 100 | _langPackageWarp () { 101 | var _fun = function ([path,v], cb) {console.log([path,v]); 102 | let [sub, type] = path.replace(/\\\\/g, '/').split('/').slice(-2); 103 | type = type.split('.').shift(); 104 | 105 | if (sub == 'menus') { 106 | _fun.traverseSubmenu(v.menu, _fun.joinGap(sub, 'menu')).forEach(res => { 107 | cb(type, sub, res.item, res.path); 108 | }); 109 | 110 | for (const [subMenu, o] of Object.entries((v?.['context-menu'] || {}))) { 111 | _fun.traverseSubmenu(o, _fun.joinGap(sub, 'context-menu', subMenu)).forEach(res => { 112 | cb(type, sub, res.item, res.path); 113 | }); 114 | } 115 | } 116 | if (sub == 'preferences') { 117 | for (const [id, oV] of Object.entries(v.schema)) { 118 | oV.id = id; 119 | cb(type, sub, oV, [sub, 'schema'].join('|')); 120 | (oV?.options||[]).forEach(o => { 121 | o.id = id+'.'+o.value; 122 | cb(type, sub, o, [sub, 'schema', 'options'].join('|')); 123 | }); 124 | }; 125 | } 126 | if (sub == 'quickedits') { 127 | for (const [id, oV] of Object.entries(v.components)) { 128 | cb(type, sub, oV, [sub, 'components'].join('|')); 129 | (oV?.items||[]).forEach(o => { 130 | o.id = id+'.'+o.value; 131 | cb(type, sub, o, [sub, 'components', o.id, 'items'].join('|')); 132 | }); 133 | }; 134 | } 135 | if (sub == 'toolbox') { 136 | v.forEach(o => { 137 | cb(type, sub, o, [sub, o.id].join('|')); 138 | (o?.items||[]).forEach(o => { 139 | cb(type, sub, o, [sub, o.id, 'items'].join('|')); 140 | }); 141 | }); 142 | } 143 | 144 | 145 | }; 146 | 147 | 148 | _fun.traverseSubmenu = function (json, parentPath = '') { 149 | let result = []; 150 | 151 | json.forEach(item => { 152 | let currentPath = parentPath + '|' + item.id; 153 | 154 | item.id && result.push({ 155 | id: item.id, 156 | path: parentPath, 157 | item 158 | }); 159 | 160 | if (item.submenu) { 161 | result = result.concat(_fun.traverseSubmenu(item.submenu, currentPath)); 162 | } 163 | }); 164 | 165 | return result; 166 | }; 167 | 168 | _fun.joinGap = function(...arr) { 169 | return arr.join('|'); 170 | }; 171 | 172 | return _fun; 173 | } 174 | 175 | _langItemCope (o, path) { 176 | var oLang = this._langPackage[o.id]; 177 | window.idd = window.idd || 'file.new-from-template'; 178 | //if(o.id == window.idd) debugger; 179 | 180 | var bImmerse = this._langPackage['language-immerse']; 181 | if (oLang) { 182 | var oTarget = oLang; 183 | if ((oLang.list||[oLang]).some(o=>{ 184 | if (o.path == path) { 185 | oTarget = o; 186 | return true; 187 | } 188 | })) { 189 | let lang = oTarget['text.lang'] || oLang['text.lang']; 190 | let text = oTarget.text || oLang.text; 191 | if (lang && lang != text) { 192 | o[oTarget.labelType] = bImmerse ? lang : (text + '(' +lang +')'); 193 | } 194 | if (oLang['description.lang'] && (oLang.description != oLang['description.lang'])) { 195 | o.description = bImmerse ? oLang['description.lang'] : (o.description + '\\n(' +oLang['description.lang'] +')'); 196 | } 197 | } 198 | } 199 | } 200 | `; 201 | 202 | 203 | main(); -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/2lang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/resources/汉化文档/详细使用方法/2lang.png -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/cmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/resources/汉化文档/详细使用方法/cmd.png -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/resources/汉化文档/详细使用方法/copy.png -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/cwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/resources/汉化文档/详细使用方法/cwd.png -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/resources/汉化文档/详细使用方法/download.png -------------------------------------------------------------------------------- /resources/汉化文档/详细使用方法/readme.md: -------------------------------------------------------------------------------- 1 | # 详细使用方法 2 | 3 | src: https://github.com/purplestone/StarUML-language 4 | 5 | ## 1. 在电脑中安装 Node.js 运行环境 6 | 7 | [NodeJS 下载地址](https://nodejs.org/) 8 | 9 | ## 2. 下载该汉化脚本的zip包, 并释放文件到 StarUML 的 resources 目录中 10 | 11 | ![截图](./download.png) 12 | 13 | 复制语言包中的 resources 里的文件到 StarUML 的 resources 目录里 14 | 15 | 将包中的3个文件解压到 starUML 的安装目录中的 ```resources``` 目录中,要与目录中的 ```app.asar``` 文件平级。 16 | 17 | 包含3个主要文件: 18 | 19 | * langPackage.json 20 | * package.json 21 | * warp.js 22 | 23 | ![截图](./copy.png) 24 | 25 | 运行命令行到 StarUML 的 resources 目录 26 | 27 | (右击 StarUML/resources 目录,选择 [在终端中打开],PS 没权限 可以执行一下 > cmd 命令) 28 | 29 | ![截图](./cwd.png) 30 | 31 | ### 3. 执行汉化脚本 32 | 33 | ```cd``` 到程序的安装目录 ```starUML/resources``` 下,执行 34 | ```bash 35 | npm start 36 | ``` 37 | 38 | ![截图](./cmd.png) 39 | 40 | 41 | 看见提示 “```安装中文包完成。```”,则汉化完成,直接运行 starUML 程序开始使用就是中文界面了。 42 | 43 | ## 其他使用方法 44 | 45 | ### 自定义翻译 46 | 文件 ```langPackage.json``` 即为翻译用的文本对照包,可自行对其中各项的 `text.lang`、`description.lang` 字段值进行修改,实现自定义翻译 47 | 48 | 你可以将没汉化到 或 没翻译好的地方,提交 langPackage.json 文件的修改到该汉化包的 github 库中,大家一起完善中文包 49 | 50 | ### 双语界面 51 | 52 | 文件 `langPackage.json` 的 ```"language-immerse": true```, 字段值改为 ```false``` 可实现双语界面。 53 | 54 | **修改后,都是需要再执行脚本后生效。** 55 | 56 | ```bash 57 | npm start 58 | ``` 59 | 60 | 61 | ![截图](./2lang.png) 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /shot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/shot1.png -------------------------------------------------------------------------------- /shot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplestone/StarUML-language/8f212eca305d7ba302257fdf5cd3cf3694ba4b39/shot2.png --------------------------------------------------------------------------------