@ives_xxz/packages 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/AddComponent/main.js +32 -0
  2. package/AddComponent/package.json +26 -0
  3. package/AddComponent/panel/index.js +233 -0
  4. package/AddComponent/readme.md +38 -0
  5. package/AddComponent/scene-accessor.js +109 -0
  6. package/AddComponent/template-auto-dock.js +73 -0
  7. package/BitmapFontTools/i18n/en.js +1 -0
  8. package/BitmapFontTools/i18n/zh.js +1 -0
  9. package/BitmapFontTools/main.js +1 -0
  10. package/BitmapFontTools/package-lock.json +83 -0
  11. package/BitmapFontTools/package.json +37 -0
  12. package/BitmapFontTools/panel/font.css +1 -0
  13. package/BitmapFontTools/panel/font.js +58 -0
  14. package/BitmapFontTools/panel/font_panel.js +1 -0
  15. package/BitmapFontTools/panel/ttf.css +1 -0
  16. package/BitmapFontTools/panel/ttf.js +68 -0
  17. package/BitmapFontTools/panel/ttf_panel.js +1 -0
  18. package/FWAssetsFinder/main.js +9 -0
  19. package/FWAssetsFinder/package.json +20 -0
  20. package/FWAssetsFinder/panel/index.css +2 -0
  21. package/FWAssetsFinder/panel/index.html +52 -0
  22. package/FWAssetsFinder/panel/index.js +265 -0
  23. package/FWAssetsFinder/panel/less.css +71 -0
  24. package/FWAssetsFinder/panel/scene.js +194 -0
  25. package/FWExcelGenerator/main.js +367 -0
  26. package/FWExcelGenerator/package-lock.json +109 -0
  27. package/FWExcelGenerator/package.json +23 -0
  28. package/FWExcelGenerator/panel/index.js +648 -0
  29. package/FWLayerGenerator/main.js +186 -0
  30. package/FWLayerGenerator/package.json +21 -0
  31. package/FWLayerGenerator/panel/index.css +36 -0
  32. package/FWLayerGenerator/panel/index.html +17 -0
  33. package/FWLayerGenerator/panel/index.js +29 -0
  34. package/FWMask/inspector.js +26 -0
  35. package/FWMask/main.js +16 -0
  36. package/FWMask/package.json +6 -0
  37. package/FWPolygonPoints/main.js +149 -0
  38. package/FWPolygonPoints/package.json +9 -0
  39. package/PNG Auto Compress/CHANGELOG.md +32 -0
  40. package/PNG Auto Compress/LICENSE +21 -0
  41. package/PNG Auto Compress/README.md +113 -0
  42. package/PNG Auto Compress/config-manager.js +72 -0
  43. package/PNG Auto Compress/i18n/en.js +14 -0
  44. package/PNG Auto Compress/i18n/zh.js +14 -0
  45. package/PNG Auto Compress/images/setting.png +0 -0
  46. package/PNG Auto Compress/jsconfig.json +1 -0
  47. package/PNG Auto Compress/main.js +377 -0
  48. package/PNG Auto Compress/package.json +41 -0
  49. package/PNG Auto Compress/panel.setting/index.css +13 -0
  50. package/PNG Auto Compress/panel.setting/index.html +51 -0
  51. package/PNG Auto Compress/panel.setting/index.js +124 -0
  52. package/PNG Auto Compress/pngquant/macos/COPYRIGHT +687 -0
  53. package/PNG Auto Compress/pngquant/macos/README.md +78 -0
  54. package/PNG Auto Compress/pngquant/macos/pngquant +0 -0
  55. package/PNG Auto Compress/pngquant/macos/pngquant-compat +0 -0
  56. package/PNG Auto Compress/pngquant/windows/COPYRIGHT +687 -0
  57. package/PNG Auto Compress/pngquant/windows/Drag PNG here to reduce palette automatically.bat +11 -0
  58. package/PNG Auto Compress/pngquant/windows/Drag PNG here to reduce palette to 256.bat +10 -0
  59. package/PNG Auto Compress/pngquant/windows/README.txt +78 -0
  60. package/PNG Auto Compress/pngquant/windows/pngquant.exe +0 -0
  61. package/PNG Auto Compress/typings/cocos/editor.d.ts +1053 -0
  62. package/PNG Auto Compress/utils/file-utils.js +67 -0
  63. package/Quick Finder/CHANGELOG.md +100 -0
  64. package/Quick Finder/LICENSE +21 -0
  65. package/Quick Finder/README.en.md +141 -0
  66. package/Quick Finder/README.md +149 -0
  67. package/Quick Finder/i18n/en.js +42 -0
  68. package/Quick Finder/i18n/zh.js +42 -0
  69. package/Quick Finder/images/assets/animation-clip.png +0 -0
  70. package/Quick Finder/images/assets/asset.png +0 -0
  71. package/Quick Finder/images/assets/atlas.png +0 -0
  72. package/Quick Finder/images/assets/audio-clip.png +0 -0
  73. package/Quick Finder/images/assets/auto-atlas.png +0 -0
  74. package/Quick Finder/images/assets/bitmap-font.png +0 -0
  75. package/Quick Finder/images/assets/buffer.png +0 -0
  76. package/Quick Finder/images/assets/coffeescript.png +0 -0
  77. package/Quick Finder/images/assets/component.png +0 -0
  78. package/Quick Finder/images/assets/css.png +0 -0
  79. package/Quick Finder/images/assets/dragonbones-atlas.png +0 -0
  80. package/Quick Finder/images/assets/folder.png +0 -0
  81. package/Quick Finder/images/assets/html.png +0 -0
  82. package/Quick Finder/images/assets/javascript.png +0 -0
  83. package/Quick Finder/images/assets/json.png +0 -0
  84. package/Quick Finder/images/assets/label-atlas.png +0 -0
  85. package/Quick Finder/images/assets/markdown.png +0 -0
  86. package/Quick Finder/images/assets/material.png +0 -0
  87. package/Quick Finder/images/assets/mesh.png +0 -0
  88. package/Quick Finder/images/assets/mount.png +0 -0
  89. package/Quick Finder/images/assets/node.png +0 -0
  90. package/Quick Finder/images/assets/particle.png +0 -0
  91. package/Quick Finder/images/assets/physics-material.png +0 -0
  92. package/Quick Finder/images/assets/prefab.png +0 -0
  93. package/Quick Finder/images/assets/raw-asset.png +0 -0
  94. package/Quick Finder/images/assets/scene.png +0 -0
  95. package/Quick Finder/images/assets/shader.png +0 -0
  96. package/Quick Finder/images/assets/skeleton.png +0 -0
  97. package/Quick Finder/images/assets/spine.png +0 -0
  98. package/Quick Finder/images/assets/sprite-animation.png +0 -0
  99. package/Quick Finder/images/assets/sprite-atlas.png +0 -0
  100. package/Quick Finder/images/assets/sprite-frame.png +0 -0
  101. package/Quick Finder/images/assets/text.png +0 -0
  102. package/Quick Finder/images/assets/tiled-map.png +0 -0
  103. package/Quick Finder/images/assets/ttf-font.png +0 -0
  104. package/Quick Finder/images/assets/typescript.png +0 -0
  105. package/Quick Finder/images/search.png +0 -0
  106. package/Quick Finder/images/settings.png +0 -0
  107. package/Quick Finder/images/update.png +0 -0
  108. package/Quick Finder/images/version.png +0 -0
  109. package/Quick Finder/jsconfig.json +17 -0
  110. package/Quick Finder/lib/node-fetch.js +1649 -0
  111. package/Quick Finder/lib/vue.global.prod.js +7 -0
  112. package/Quick Finder/package.json +45 -0
  113. package/Quick Finder/src/common/config-manager.js +122 -0
  114. package/Quick Finder/src/eazax/browser-util.js +61 -0
  115. package/Quick Finder/src/eazax/color-util.js +37 -0
  116. package/Quick Finder/src/eazax/css/cocos-class.css +202 -0
  117. package/Quick Finder/src/eazax/css/cocos-tag.css +197 -0
  118. package/Quick Finder/src/eazax/css/eazax-colors.css +18 -0
  119. package/Quick Finder/src/eazax/editor-main-kit.js +53 -0
  120. package/Quick Finder/src/eazax/editor-main-util.js +112 -0
  121. package/Quick Finder/src/eazax/editor-renderer-kit.js +26 -0
  122. package/Quick Finder/src/eazax/file-util.js +158 -0
  123. package/Quick Finder/src/eazax/i18n.js +36 -0
  124. package/Quick Finder/src/eazax/main-event.js +81 -0
  125. package/Quick Finder/src/eazax/package-util.js +47 -0
  126. package/Quick Finder/src/eazax/renderer-event.js +80 -0
  127. package/Quick Finder/src/eazax/updater.js +92 -0
  128. package/Quick Finder/src/eazax/version-util.js +61 -0
  129. package/Quick Finder/src/eazax/window-util.js +80 -0
  130. package/Quick Finder/src/main/finder.js +101 -0
  131. package/Quick Finder/src/main/index.js +155 -0
  132. package/Quick Finder/src/main/opener.js +95 -0
  133. package/Quick Finder/src/main/panel-manager.js +159 -0
  134. package/Quick Finder/src/renderer/search/index.css +222 -0
  135. package/Quick Finder/src/renderer/search/index.html +46 -0
  136. package/Quick Finder/src/renderer/search/index.js +348 -0
  137. package/Quick Finder/src/renderer/settings/index.css +101 -0
  138. package/Quick Finder/src/renderer/settings/index.html +86 -0
  139. package/Quick Finder/src/renderer/settings/index.js +219 -0
  140. package/Quick Finder/typings/cocos/editor.d.ts +1053 -0
  141. package/Quick Finder/typings/vue.d.ts +1 -0
  142. package/README.md +93 -0
  143. package/package.json +12 -0
  144. package/unpack plist/main.js +253 -0
  145. package/unpack plist/package.json +13 -0
  146. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/CHANGELOG.md +30 -0
  147. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/LICENSE +21 -0
  148. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/README.en.md +111 -0
  149. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/README.md +115 -0
  150. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/i18n/en.js +55 -0
  151. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/i18n/zh.js +55 -0
  152. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/images/search.png +0 -0
  153. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/images/settings.png +0 -0
  154. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/images/update.png +0 -0
  155. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/images/version.png +0 -0
  156. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/jsconfig.json +17 -0
  157. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/lib/node-fetch.js +1649 -0
  158. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/lib/vue.global.prod.js +7 -0
  159. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/package.json +44 -0
  160. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/common/config-manager.js +104 -0
  161. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/browser-util.js +61 -0
  162. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/color-util.js +37 -0
  163. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/css/cocos-class.css +201 -0
  164. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/css/cocos-tag.css +197 -0
  165. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/css/eazax-colors.css +18 -0
  166. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/editor-main-kit.js +53 -0
  167. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/editor-main-util.js +147 -0
  168. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/editor-renderer-kit.js +26 -0
  169. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/file-util.js +158 -0
  170. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/i18n.js +36 -0
  171. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/main-event.js +81 -0
  172. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/package-util.js +47 -0
  173. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/renderer-event.js +80 -0
  174. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/updater.js +92 -0
  175. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/version-util.js +61 -0
  176. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/eazax/window-util.js +80 -0
  177. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/editor-api.js +90 -0
  178. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/finder.js +248 -0
  179. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/index.js +155 -0
  180. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/object-util.js +70 -0
  181. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/panel-manager.js +86 -0
  182. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/parser.js +161 -0
  183. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/main/printer.js +108 -0
  184. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/renderer/settings/index.css +61 -0
  185. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/renderer/settings/index.html +90 -0
  186. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/src/renderer/settings/index.js +191 -0
  187. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/typings/cocos/editor.d.ts +1053 -0
  188. package//345/274/225/347/224/250/346/237/245/346/211/276/345/231/250/typings/vue.d.ts +1 -0
@@ -0,0 +1,367 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const XLSX = require('xlsx');
4
+
5
+ module.exports = {
6
+ messages: {
7
+ 'open-panel'() {
8
+ Editor.Panel.open('excel-to-lang');
9
+ },
10
+
11
+ 'convert-excel'(event, filePath) {
12
+ this.processExcel(filePath, (result) => {
13
+ Editor.Ipc.sendToPanel('excel-to-lang', 'excel-to-lang:conversion-result', result);
14
+ /** 控制台输出结果 */
15
+ if (result.success) {
16
+ Editor.log(`生成文件: ${Object.values(result.files).flat().join(',\n ')}`);
17
+ } else {
18
+ Editor.log(`Excel转多语言: ${result.message}`);
19
+ }
20
+
21
+ });
22
+ }
23
+ },
24
+
25
+ processExcel(filePath, callback) {
26
+ try {
27
+ const workbook = XLSX.readFile(filePath);
28
+ const count = workbook.SheetNames.length;
29
+
30
+ for(let i = 0; i < count ; i ++){
31
+ const sheetName = workbook.SheetNames[i];
32
+ const worksheet = workbook.Sheets[sheetName];
33
+
34
+ // 转换为 JSON
35
+ const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
36
+
37
+
38
+ if (jsonData.length < 2) {
39
+ callback({
40
+ success: false,
41
+ message: 'Excel 格式错误:至少需要两行数据'
42
+ });
43
+ return;
44
+ }
45
+
46
+ const headers = jsonData[0].map(h => String(h).trim().toLowerCase());
47
+ const idIndex = headers.indexOf('id');
48
+ const describeIndex = headers.indexOf('describe');
49
+ const keyIndex = headers.indexOf('key');
50
+
51
+
52
+ if (keyIndex === -1) {
53
+ callback({
54
+ success: false,
55
+ message: '缺少必要的列:key'
56
+ });
57
+ return;
58
+ }
59
+
60
+ // 获取所有语言列(排除key列)
61
+ const langColumns = [];
62
+ for (let i = 0; i < headers.length; i++) {
63
+ if (i !== keyIndex && i != idIndex && i != describeIndex && headers[i]) {
64
+ langColumns.push({
65
+ index: i,
66
+ lang: headers[i]
67
+ });
68
+ }
69
+ }
70
+
71
+ if (langColumns.length === 0) {
72
+ callback({
73
+ success: false,
74
+ message: '未找到语言列'
75
+ });
76
+ return;
77
+ }
78
+
79
+ // 提取语言数据
80
+ const langData = {};
81
+ const files = {};
82
+
83
+ // 初始化每种语言的数据对象
84
+ langColumns.forEach(col => {
85
+ langData[col.lang] = {};
86
+ });
87
+
88
+ for (let i = 2; i < jsonData.length; i++) {
89
+ const row = jsonData[i];
90
+ if (!row || row.length < keyIndex + 1) continue;
91
+
92
+ const key = String(row[keyIndex] || '').trim();
93
+ if (!key) continue;
94
+
95
+ langColumns.forEach(col => {
96
+ if (row.length > col.index) {
97
+ const value = String(row[col.index] || '').trim();
98
+ langData[col.lang][key] = value;
99
+ }
100
+ });
101
+ }
102
+
103
+ // 创建目标目录 - 在项目目录下的bundle目录中
104
+ const projectPath = Editor.Project.path;
105
+ const bundleName = sheetName.includes("_") ? sheetName.replace("_","/") : sheetName;
106
+ const outputBase = path.join(projectPath, 'assets','bundle', bundleName, 'script', 'language');
107
+
108
+ // 确保目录存在
109
+ if (!fs.existsSync(outputBase)) {
110
+ fs.mkdirSync(outputBase, { recursive: true });
111
+ }
112
+ const langFileNames = {};
113
+
114
+ let folderName = "";
115
+ if(bundleName.includes("_")){
116
+ folderName = bundleName.substring(0,bundleName.indexOf("_"));
117
+ }else if(bundleName.includes("/")){
118
+ folderName = bundleName.substring(0,bundleName.indexOf("/"));
119
+ }else{
120
+ folderName = bundleName;
121
+ }
122
+
123
+
124
+ // 生成每种语言的文件
125
+ langColumns.forEach(col => {
126
+ const lang = col.lang;
127
+ const langDir = path.join(outputBase, lang);
128
+
129
+ if (!fs.existsSync(langDir)) {
130
+ fs.mkdirSync(langDir, { recursive: true });
131
+ }
132
+
133
+
134
+ const name = `${folderName.charAt(0).toUpperCase()}${folderName.slice(1)}Language${lang.charAt(0).toUpperCase()}${lang.slice(1)}`;
135
+ const langFile = path.join(langDir, `${name}.ts`);
136
+ const content = `export const ${name} = ${this.formatObject(langData[lang])};\n`;
137
+
138
+ fs.writeFileSync(langFile, content,{flag:'w'});
139
+ // 记录生成的文件
140
+ if (!files[lang]) files[lang] = [];
141
+ files[lang].push(langFile);
142
+
143
+ langFileNames[lang] = name;
144
+ });
145
+
146
+
147
+
148
+ this.createProxyLanguageFile(outputBase, folderName, langFileNames,langData);
149
+
150
+ /** 刷新目录 */
151
+ this.refreshAssetDB(outputBase);
152
+
153
+ callback({
154
+ success: true,
155
+ message: '转换成功!',
156
+ files: files,
157
+ langData: langData,
158
+ sheetName,
159
+ languages: langColumns.map(col => col.lang),
160
+ outputPath: path.relative(projectPath, outputBase)
161
+ });
162
+ }
163
+
164
+ if(Editor && Editor.Ipc) Editor.Ipc.sendToAll('files:refresh');
165
+
166
+
167
+ } catch (error) {
168
+ callback({
169
+ success: false,
170
+ message: `处理失败: ${error.message}`
171
+ });
172
+ }
173
+ },
174
+
175
+ createProxyLanguageFile(outputBase, folderName, langFileNames, langData) {
176
+ const proxyFileName = `${folderName.charAt(0).toUpperCase()}${folderName.slice(1)}Language`;
177
+ const proxyFilePath = path.join(outputBase, `${proxyFileName}.ts`);
178
+
179
+ const commonKeys = this.findCommonKeys(langData);
180
+
181
+ const importStatements = Object.entries(langFileNames).map(([lang, name]) => {
182
+ return `import { ${name} } from './${lang}/${name}';`;
183
+ }).join('\n');
184
+
185
+ const langPackMapping = Object.entries(langFileNames).map(([lang, name]) => {
186
+ return ` '${lang}': ${name},`;
187
+ }).join('\n');
188
+
189
+ // 修改代理文件内容
190
+ const proxyContent = `
191
+ ${importStatements}
192
+
193
+ export interface I${proxyFileName} {
194
+ ${commonKeys.map(key => ` readonly ${this.safeKeyName(key)}: string;`).join('\n')}
195
+ readonly [key: string]: string;
196
+ }
197
+
198
+ enum ${proxyFileName}Enum {
199
+ ${commonKeys.map((key, index) => ` ${key.toLocaleLowerCase()},`).join('\n')}
200
+ };
201
+
202
+ export type ${proxyFileName}Type = typeof ${proxyFileName}Enum;
203
+
204
+ const languagePacks = {
205
+ ${langPackMapping}
206
+ };
207
+
208
+ if (FW && FW.Entry.languageMgr) {
209
+ FW.Entry.languageMgr.registerLanguagePackageEnum('${folderName}', ${proxyFileName}Enum, (key: string,language?:string) => {
210
+ const currentLang = language || FW.Entry.languageMgr.getLanguage();
211
+ const langPack = languagePacks[currentLang];
212
+
213
+ if (langPack && langPack[key]) {
214
+ return langPack[key];
215
+ }
216
+
217
+ const defaultLang = Object.keys(languagePacks)[0];
218
+ const defaultPack = languagePacks[defaultLang];
219
+ if (defaultPack && defaultPack[key]) {
220
+ return defaultPack[key];
221
+ }
222
+
223
+ return '';
224
+ });
225
+ FW.Entry.languageMgr.setSupportedLanguages(Object.keys(languagePacks));
226
+ }
227
+
228
+ declare global {
229
+ namespace FW {
230
+ interface ILanguageBundleAccessor {
231
+ ${folderName}: ${proxyFileName}Type;
232
+ }
233
+ }
234
+ }
235
+
236
+ const proxy = new Proxy({}, {
237
+ get(_, key: string) {
238
+ const currentLang =
239
+ typeof FW !== 'undefined' && FW.Entry?.languageMgr?.getLanguage
240
+ ? FW.Entry.languageMgr.getLanguage()
241
+ : Object.keys(languagePacks)[0];
242
+
243
+ const langPack = languagePacks[currentLang];
244
+
245
+ if (langPack && langPack[key]) {
246
+ return langPack[key];
247
+ }
248
+
249
+ const defaultLang = Object.keys(languagePacks)[0];
250
+ const defaultPack = languagePacks[defaultLang];
251
+ if (defaultPack && defaultPack[key]) {
252
+ return defaultPack[key];
253
+ }
254
+
255
+ const commonKeys = getCommonKeys();
256
+ if (commonKeys.has(key)) {
257
+ for (const lang in languagePacks) {
258
+ if (languagePacks[lang][key]) {
259
+ return languagePacks[lang][key];
260
+ }
261
+ }
262
+ }
263
+
264
+ return '';
265
+ },
266
+
267
+ has(_, key) {
268
+ return getCommonKeys().has(key);
269
+ },
270
+
271
+ getOwnPropertyDescriptor() {
272
+ return {
273
+ enumerable: true,
274
+ configurable: true
275
+ };
276
+ }
277
+ });
278
+
279
+ function getCommonKeys() {
280
+ const allKeys = Object.values(languagePacks).map(pack => Object.keys(pack));
281
+ if (allKeys.length === 0) return new Set();
282
+
283
+ return new Set(
284
+ allKeys.reduce((commonKeys, keys) =>
285
+ commonKeys.filter(key => keys.includes(key))
286
+ , allKeys[0])
287
+ );
288
+ }
289
+
290
+ /**
291
+ * 获取当前语言的所有值
292
+ */
293
+ export function getCurrentLanguageValues(): Record<string, string> {
294
+ const currentLang =
295
+ typeof FW !== 'undefined' && FW.Entry?.languageMgr?.getLanguage
296
+ ? FW.Entry.languageMgr.getLanguage()
297
+ : Object.keys(languagePacks)[0];
298
+
299
+ return {...languagePacks[currentLang]};
300
+ }
301
+
302
+ export const ${proxyFileName} = proxy as I${proxyFileName};
303
+ `;
304
+
305
+ fs.writeFileSync(proxyFilePath, proxyContent, {flag:'w'});
306
+ return proxyFilePath;
307
+ },
308
+
309
+
310
+
311
+ // 辅助方法:安全字段名处理
312
+ safeKeyName(key) {
313
+ // 处理非法标识符(如包含空格、连字符等)
314
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {
315
+ return `'${key}'`;
316
+ }
317
+ return key;
318
+ },
319
+
320
+ // 辅助方法:查找所有语言包中的共同key
321
+ findCommonKeys(langData) {
322
+ const keysPerLang = Object.values(langData).map(data =>
323
+ new Set(Object.keys(data))
324
+ );
325
+
326
+ if (keysPerLang.length === 0) return [];
327
+
328
+ // 计算所有语言包的交集
329
+ const commonKeys = [...keysPerLang[0]].filter(key =>
330
+ keysPerLang.every(set => set.has(key))
331
+ );
332
+
333
+ return commonKeys;
334
+ },
335
+
336
+ refreshAssetDB(outputBase) {
337
+ const relativePath = path.relative(Editor.Project.path, outputBase);
338
+
339
+ const url = 'db://' + relativePath.replace(/\\/g, '/');
340
+
341
+ Editor.assetdb.refresh(url, (err) => {
342
+ if (err) {
343
+ Editor.error(`刷新资源失败: ${err}`);
344
+ } else {
345
+ Editor.log(`已刷新目录: ${url}`);
346
+ }
347
+ });
348
+ },
349
+
350
+ // 格式化对象为可读的TS格式
351
+ formatObject(obj) {
352
+ const entries = Object.entries(obj);
353
+ if (entries.length === 0) return '{}';
354
+
355
+ const items = entries.map(([key, value]) => {
356
+ // 处理特殊字符转义
357
+ const escapedValue = value
358
+ .replace(/\\/g, '\\\\')
359
+ .replace(/"/g, '\\"')
360
+ .replace(/\n/g, '\\n')
361
+ .replace(/\r/g, '\\r');
362
+ return ` "${key}": "${escapedValue}"`;
363
+ }).join(',\n');
364
+
365
+ return `{\n${items}\n}`;
366
+ }
367
+ };
@@ -0,0 +1,109 @@
1
+ {
2
+ "name": "excel-to-language",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "excel-to-language",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "xlsx": "^0.18.5"
12
+ }
13
+ },
14
+ "node_modules/adler-32": {
15
+ "version": "1.3.1",
16
+ "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
17
+ "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
18
+ "engines": {
19
+ "node": ">=0.8"
20
+ }
21
+ },
22
+ "node_modules/cfb": {
23
+ "version": "1.2.2",
24
+ "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
25
+ "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
26
+ "dependencies": {
27
+ "adler-32": "~1.3.0",
28
+ "crc-32": "~1.2.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=0.8"
32
+ }
33
+ },
34
+ "node_modules/codepage": {
35
+ "version": "1.15.0",
36
+ "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
37
+ "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
38
+ "engines": {
39
+ "node": ">=0.8"
40
+ }
41
+ },
42
+ "node_modules/crc-32": {
43
+ "version": "1.2.2",
44
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
45
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
46
+ "bin": {
47
+ "crc32": "bin/crc32.njs"
48
+ },
49
+ "engines": {
50
+ "node": ">=0.8"
51
+ }
52
+ },
53
+ "node_modules/frac": {
54
+ "version": "1.1.2",
55
+ "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
56
+ "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
57
+ "engines": {
58
+ "node": ">=0.8"
59
+ }
60
+ },
61
+ "node_modules/ssf": {
62
+ "version": "0.11.2",
63
+ "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
64
+ "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
65
+ "dependencies": {
66
+ "frac": "~1.1.2"
67
+ },
68
+ "engines": {
69
+ "node": ">=0.8"
70
+ }
71
+ },
72
+ "node_modules/wmf": {
73
+ "version": "1.0.2",
74
+ "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
75
+ "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
76
+ "engines": {
77
+ "node": ">=0.8"
78
+ }
79
+ },
80
+ "node_modules/word": {
81
+ "version": "0.3.0",
82
+ "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
83
+ "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
84
+ "engines": {
85
+ "node": ">=0.8"
86
+ }
87
+ },
88
+ "node_modules/xlsx": {
89
+ "version": "0.18.5",
90
+ "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
91
+ "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
92
+ "dependencies": {
93
+ "adler-32": "~1.3.0",
94
+ "cfb": "~1.2.1",
95
+ "codepage": "~1.15.0",
96
+ "crc-32": "~1.2.1",
97
+ "ssf": "~0.11.2",
98
+ "wmf": "~1.0.1",
99
+ "word": "~0.3.0"
100
+ },
101
+ "bin": {
102
+ "xlsx": "bin/xlsx.njs"
103
+ },
104
+ "engines": {
105
+ "node": ">=0.8"
106
+ }
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "excel-to-lang",
3
+ "version": "1.0.0",
4
+ "description": "Excel to Language TS Converter with UI",
5
+ "main": "main.js",
6
+ "author": "Ives",
7
+ "editor": "2.4.9",
8
+ "dependencies": {
9
+ "xlsx": "^0.20.0"
10
+ },
11
+ "panel": {
12
+ "main": "panel/index.js",
13
+ "type": "dockable",
14
+ "title": "Excel转多语言",
15
+ "width": 600,
16
+ "height": 600
17
+ },
18
+ "main-menu": {
19
+ "i18n:MAIN_MENU.package.title/FW多语言插件/打开面板": {
20
+ "message": "excel-to-lang:open-panel"
21
+ }
22
+ }
23
+ }