@sfmc-bds/cli 0.2.0-beta.12 → 0.2.0-beta.13
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.
- package/dist/i18n/locales/zh-CN.js +1 -1
- package/dist/i18n/locales/zh-CN.js.map +1 -1
- package/dist/log-filter.d.ts +18 -2
- package/dist/log-filter.d.ts.map +1 -1
- package/dist/log-filter.js +54 -4
- package/dist/log-filter.js.map +2 -2
- package/dist/log-filter.test.js +62 -0
- package/dist/log-filter.test.js.map +2 -2
- package/dist/log-translator.d.ts +36 -0
- package/dist/log-translator.d.ts.map +1 -0
- package/dist/log-translator.js +279 -0
- package/dist/log-translator.js.map +7 -0
- package/dist/log-translator.test.js +120 -0
- package/dist/log-translator.test.js.map +7 -0
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +13 -7
- package/dist/logs.js.map +2 -2
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +16 -5
- package/dist/module-commands.js.map +2 -2
- package/dist/module-fingerprint.d.ts.map +1 -1
- package/dist/module-fingerprint.js +1 -0
- package/dist/module-fingerprint.js.map +2 -2
- package/dist/module-pack-build.d.ts.map +1 -1
- package/dist/module-pack-build.js +6 -1
- package/dist/module-pack-build.js.map +2 -2
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +6 -1
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -1
- package/dist/registry.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts.map +1 -1
- package/dist/repl-windows/format-display.js +5 -1
- package/dist/repl-windows/format-display.js.map +2 -2
- package/dist/sfmc-modules-root.d.ts.map +1 -1
- package/dist/sfmc-modules-root.js +6 -2
- package/dist/sfmc-modules-root.js.map +2 -2
- package/package.json +5 -4
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* log-translator.ts — BDS 原版日志本地化翻译与友好转换引擎
|
|
3
|
+
*
|
|
4
|
+
* 将 Minecraft 基岩版专用服务端 (BDS) 引擎输出的晦涩英文日志
|
|
5
|
+
* (如 Beta APIs 阻断、方块形态超限、包缺失、配方失效、语法错误等)
|
|
6
|
+
* 转换为服主与开发者易懂的本地化语言日志。
|
|
7
|
+
*/
|
|
8
|
+
export interface TranslationRule {
|
|
9
|
+
id: string;
|
|
10
|
+
pattern: RegExp;
|
|
11
|
+
translations: {
|
|
12
|
+
"zh-CN": string;
|
|
13
|
+
[locale: string]: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 内置常见 BDS 原版日志翻译字典
|
|
18
|
+
*/
|
|
19
|
+
export declare const BUILTIN_BDS_TRANSLATIONS: TranslationRule[];
|
|
20
|
+
/**
|
|
21
|
+
* 将正则匹配结果套入含 $1, $2 等占位符的模板字符串
|
|
22
|
+
*/
|
|
23
|
+
export declare function interpolateRegexTemplate(match: RegExpMatchArray, template: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* 应用规则正则替换模板
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyRuleReplacement(text: string, regex: RegExp, replaceTemplate: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 翻译单条 BDS 日志文本(纯函数)
|
|
30
|
+
*/
|
|
31
|
+
export declare function translateBdsLog(text: string, locale?: string): {
|
|
32
|
+
translated: boolean;
|
|
33
|
+
text: string;
|
|
34
|
+
ruleId?: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=log-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-translator.d.ts","sourceRoot":"","sources":["../src/log-translator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAAe,EA+OrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAIjG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAgB,GACvB;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBxD"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
const BUILTIN_BDS_TRANSLATIONS = [
|
|
2
|
+
// 1. 实验性 / 测试版 API 未开启导致脚本阻断加载
|
|
3
|
+
{
|
|
4
|
+
id: "beta-apis-missing",
|
|
5
|
+
pattern: /(?:Plugin|Script)\s+\[(.+?)\]\s*-\s*requesting dependency on beta APIs\s*\[(.+?)\],\s*but the Beta APIs experiment is not enabled\./i,
|
|
6
|
+
translations: {
|
|
7
|
+
"zh-CN": "[\u811A\u672C\u963B\u65AD] \u63D2\u4EF6\u300C$1\u300D\u4F9D\u8D56\u6D4B\u8BD5\u7248 API ($2)\uFF0C\u4F46\u5F53\u524D\u4E16\u754C\u672A\u5F00\u542F\u300C\u6D4B\u8BD5\u7248 API (Beta APIs)\u300D\u5B9E\u9A8C\u5F00\u5173\uFF0C\u5DF2\u88AB BDS \u62D2\u7EDD\u8FD0\u884C\u3002\u8BF7\u5728\u4E16\u754C\u914D\u7F6E\u4E2D\u5F00\u542F\u8BE5\u5B9E\u9A8C\u5F00\u5173\u3002"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
// 2. 脚本语法错误 / 符号缺失
|
|
11
|
+
{
|
|
12
|
+
id: "script-syntax-missing-export",
|
|
13
|
+
pattern: /SyntaxError:\s*Could not find export '(.+?)' in module '(.+?)'/i,
|
|
14
|
+
translations: {
|
|
15
|
+
"zh-CN": "[\u811A\u672C\u8BED\u6CD5\u9519\u8BEF] \u6A21\u7EC4\u5C1D\u8BD5\u4ECE\u300C$2\u300D\u5BFC\u5165\u4E0D\u5B58\u5728\u7684\u7B26\u53F7\u300C$1\u300D\uFF0C\u811A\u672C\u52A0\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u6A21\u7EC4\u811A\u672C\u8BED\u6CD5\u6216 API \u7248\u672C\u517C\u5BB9\u6027\u3002"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
// 3. 世界配置清单中的包在磁盘上不存在
|
|
19
|
+
{
|
|
20
|
+
id: "configured-pack-missing",
|
|
21
|
+
pattern: /Configured pack \(id:\s*([0-9a-fA-F-]+),\s*version:\s*([^)]+)\)\s*was not found and was ignored/i,
|
|
22
|
+
translations: {
|
|
23
|
+
"zh-CN": "[\u5305\u7F3A\u5931] \u4E16\u754C\u6FC0\u6D3B\u6E05\u5355\u4E2D\u7684\u5305 (UUID: $1, \u7248\u672C: $2) \u5728\u672C\u5730\u672A\u627E\u5230\uFF0C\u5DF2\u88AB BDS \u81EA\u52A8\u5FFD\u7565\u3002"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
// 4. 自定义方块形态数量超限警告
|
|
27
|
+
{
|
|
28
|
+
id: "block-permutations-limit",
|
|
29
|
+
pattern: /World with over 65536 block permutations may degrade performance\.\s*Current world has (\d+) permutations\./i,
|
|
30
|
+
translations: {
|
|
31
|
+
"zh-CN": "[\u6027\u80FD\u63D0\u793A] \u81EA\u5B9A\u4E49\u65B9\u5757\u5F62\u6001\u6570\u91CF\u8FBE $1 \u4E2A (\u8D85\u51FA\u63A8\u8350\u4E0A\u9650 65,536)\uFF0C\u53EF\u80FD\u5F71\u54CD\u670D\u52A1\u7AEF\u53CA\u5BA2\u6237\u7AEF\u52A0\u8F7D\u6027\u80FD\u3002"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
// 5. 配方物品不存在或无效
|
|
35
|
+
{
|
|
36
|
+
id: "recipe-item-missing",
|
|
37
|
+
pattern: /(?:\[Recipes\]\s+)?(.+?)\s+\|\s+(.+?)\s+\|\s+The Item:\s*(\S+)\s+is missing or invalid,\s*can't make the recipe/i,
|
|
38
|
+
translations: {
|
|
39
|
+
"zh-CN": "[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u914D\u65B9\u6807\u8BC6: $2) \u5F15\u7528\u7684\u7269\u54C1\u300C$3\u300D\u4E0D\u5B58\u5728\u6216\u65E0\u6548\uFF0C\u65E0\u6CD5\u751F\u6210\u5408\u6210\u914D\u65B9\u3002"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
// 6. 配方缺少有效原料
|
|
43
|
+
{
|
|
44
|
+
id: "recipe-ingredient-missing",
|
|
45
|
+
pattern: /(?:\[Recipes\]\s+)?(.+?)\s+\|\s+(.+?)\s+\|\s+Recipe for:\s*(\S+)\s+is missing \(unknown\) ingredient/i,
|
|
46
|
+
translations: {
|
|
47
|
+
"zh-CN": "[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u4EA7\u7269: $2) \u7F3A\u5C11\u6709\u6548\u539F\u6599\uFF08\u5305\u542B\u672A\u8BC6\u522B\u7684\u539F\u6599\uFF09\uFF0C\u65E0\u6CD5\u6CE8\u518C\u3002"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
// 7. 配方产物格式错误
|
|
51
|
+
{
|
|
52
|
+
id: "recipe-result-malformed",
|
|
53
|
+
pattern: /(?:\[Recipes\]\s+)?(.+?)\s+\|\s+(.+?)\s+\|\s+Recipe result malformed/i,
|
|
54
|
+
translations: {
|
|
55
|
+
"zh-CN": "[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u914D\u65B9\u6807\u8BC6: $2) \u7684\u4EA7\u7269\u7ED3\u679C\u5B9A\u4E49\u683C\u5F0F\u9519\u8BEF (Malformed result)\u3002"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
// 8. 方块定义组件未在 Schema 中声明
|
|
59
|
+
{
|
|
60
|
+
id: "block-component-schema-unknown",
|
|
61
|
+
pattern: /(?:\[Blocks\]\s+)?block_definitions\s*\|.*?\|\s*([^|\r\n]+?)\.json\s*\|\s*(?:->\s*)?(.+?):\s*this component was found in the input,\s*but is not present in the Schema/i,
|
|
62
|
+
translations: {
|
|
63
|
+
"zh-CN": "[\u65B9\u5757\u89C4\u8303\u9519\u8BEF] \u65B9\u5757\u5B9A\u4E49\u300C$1.json\u300D\u5305\u542B\u672A\u5728\u5F53\u524D\u7248\u672C Schema \u4E2D\u5B9A\u4E49\u7684\u672A\u77E5\u7EC4\u4EF6: $2"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
// 9. 方块组件子项在此处无效
|
|
67
|
+
{
|
|
68
|
+
id: "block-child-component-invalid",
|
|
69
|
+
pattern: /(?:\[Blocks\]\s+)?block_definitions\s*\|.*?\|\s*([^|\r\n]+?)\.json\s*\|.*?\|\s*components\s*\|\s*([^|\r\n]+?)\s*\|\s*child '(.+?)' not valid here\./i,
|
|
70
|
+
translations: {
|
|
71
|
+
"zh-CN": "[\u65B9\u5757\u914D\u7F6E\u9519\u8BEF] \u65B9\u5757\u5B9A\u4E49\u300C$1.json\u300D\u7EC4\u4EF6\u300C$2\u300D\u7684\u5B50\u5C5E\u6027\u300C$3\u300D\u5728\u6B64\u5904\u65E0\u6548\u3002"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
// 10. 方块定义解析失败
|
|
75
|
+
{
|
|
76
|
+
id: "block-definition-parse-failed",
|
|
77
|
+
pattern: /(?:\[Blocks\]\s+)?block_definitions\s*\|.*?\|\s*([^|\r\n]+?)\.json\s*\|\s*Block definition parsing failed/i,
|
|
78
|
+
translations: {
|
|
79
|
+
"zh-CN": "[\u65B9\u5757\u89E3\u6790\u5931\u8D25] \u65E0\u6CD5\u89E3\u6790\u65B9\u5757\u5B9A\u4E49\u6587\u4EF6\u300C$1.json\u300D\u3002"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
// 11. 脚本组件未在脚本中注册但被物品使用
|
|
83
|
+
{
|
|
84
|
+
id: "script-component-not-registered",
|
|
85
|
+
pattern: /(?:\[Scripting\]\s+)?Component '(.+?)' was not registered in script but used on an item/i,
|
|
86
|
+
translations: {
|
|
87
|
+
"zh-CN": "[\u811A\u672C\u7EC4\u4EF6\u672A\u6CE8\u518C] \u7269\u54C1\u5F15\u7528\u4E86\u672A\u5728\u811A\u672C\u4E2D\u6CE8\u518C\u7684\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u3002"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
// 12. 脚本注册的方块组件未被任何方块使用
|
|
91
|
+
{
|
|
92
|
+
id: "block-component-unused",
|
|
93
|
+
pattern: /(?:\[Scripting\]\s+)?Block custom component '(.+?)' is not being used by a block/i,
|
|
94
|
+
translations: {
|
|
95
|
+
"zh-CN": "[\u7EC4\u4EF6\u63D0\u793A] \u811A\u672C\u6CE8\u518C\u7684\u65B9\u5757\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u672A\u88AB\u4EFB\u4F55\u65B9\u5757\u4F7F\u7528\u3002"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
// 13. 脚本注册的物品组件未被任何物品使用
|
|
99
|
+
{
|
|
100
|
+
id: "item-component-unused",
|
|
101
|
+
pattern: /(?:\[Scripting\]\s+)?Item custom component '(.+?)' is not being used by an item/i,
|
|
102
|
+
translations: {
|
|
103
|
+
"zh-CN": "[\u7EC4\u4EF6\u63D0\u793A] \u811A\u672C\u6CE8\u518C\u7684\u7269\u54C1\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u672A\u88AB\u4EFB\u4F55\u7269\u54C1\u4F7F\u7528\u3002"
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
// 14. 服务端启动就绪
|
|
107
|
+
{
|
|
108
|
+
id: "server-started",
|
|
109
|
+
pattern: /^Server started\./i,
|
|
110
|
+
translations: {
|
|
111
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
// 15. 服务端停机流程
|
|
115
|
+
{
|
|
116
|
+
id: "server-stop-requested",
|
|
117
|
+
pattern: /^Server stop requested\./i,
|
|
118
|
+
translations: {
|
|
119
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u6536\u5230\u505C\u670D\u8BF7\u6C42\uFF0C\u6B63\u5728\u901A\u77E5\u5E76\u4FDD\u5B58\u4E16\u754C\u6570\u636E..."
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: "server-stopping",
|
|
124
|
+
pattern: /^Stopping server\.\.\./i,
|
|
125
|
+
translations: {
|
|
126
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u6B63\u5728\u5173\u95ED\u670D\u52A1\u7AEF..."
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "server-quit-correctly",
|
|
131
|
+
pattern: /^Quit correctly/i,
|
|
132
|
+
translations: {
|
|
133
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u670D\u52A1\u7AEF\u5DF2\u6B63\u5E38\u5B89\u5168\u9000\u51FA\u3002"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: "server-starting",
|
|
138
|
+
pattern: /^Starting Server/i,
|
|
139
|
+
translations: {
|
|
140
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u6B63\u5728\u542F\u52A8 BDS \u670D\u52A1\u7AEF..."
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "server-setting-up-logging",
|
|
145
|
+
pattern: /^NO LOG FILE! - setting up server logging\.\.\./i,
|
|
146
|
+
translations: {
|
|
147
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u6B63\u5728\u521D\u59CB\u5316\u670D\u52A1\u7AEF\u65E5\u5FD7\u7CFB\u7EDF..."
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
// 16. 打开世界数据
|
|
151
|
+
{
|
|
152
|
+
id: "opening-level",
|
|
153
|
+
pattern: /^Opening level '(.+?)'/i,
|
|
154
|
+
translations: {
|
|
155
|
+
"zh-CN": "[\u4E16\u754C] \u6B63\u5728\u6253\u5F00\u4E16\u754C\u6570\u636E: $1"
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// 17. 网络端口与信令服务
|
|
159
|
+
{
|
|
160
|
+
id: "ipv4-port",
|
|
161
|
+
pattern: /^IPv4 supported, port: (\d+): Used for gameplay and LAN discovery/i,
|
|
162
|
+
translations: {
|
|
163
|
+
"zh-CN": "[\u7F51\u7EDC] IPv4 \u6E38\u620F\u4E0E\u5C40\u57DF\u7F51\u53D1\u73B0\u7AEF\u53E3: $1 (UDP)"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "ipv6-port",
|
|
168
|
+
pattern: /^IPv6 supported, port: (\d+): Used for gameplay/i,
|
|
169
|
+
translations: {
|
|
170
|
+
"zh-CN": "[\u7F51\u7EDC] IPv6 \u6E38\u620F\u7AEF\u53E3: $1 (UDP)"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "signaling-signed-in",
|
|
175
|
+
pattern: /^Signed in to signaling service successfully/i,
|
|
176
|
+
translations: {
|
|
177
|
+
"zh-CN": "[\u7F51\u7EDC] \u5DF2\u6210\u529F\u767B\u5F55\u5FAE\u8F6F\u8054\u673A\u4FE1\u4EE4\u670D\u52A1\u3002"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: "waiting-minecraft-services",
|
|
182
|
+
pattern: /^Waiting for Minecraft services\.\.\./i,
|
|
183
|
+
translations: {
|
|
184
|
+
"zh-CN": "[\u670D\u52A1\u7AEF] \u6B63\u5728\u7B49\u5F85 Minecraft \u57FA\u7840\u670D\u52A1\u8FDE\u63A5..."
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// 18. 白名单警告与提示
|
|
188
|
+
{
|
|
189
|
+
id: "allowlist-empty-warning",
|
|
190
|
+
pattern: /^Allow list is enabled but contains no entries\./i,
|
|
191
|
+
translations: {
|
|
192
|
+
"zh-CN": "[\u767D\u540D\u5355\u8B66\u544A] \u767D\u540D\u5355\u529F\u80FD\u5DF2\u5F00\u542F\u4F46\u540D\u5355\u4E3A\u7A7A\uFF01\u9664\u7BA1\u7406\u5458\u5916\u5176\u4ED6\u73A9\u5BB6\u5C06\u65E0\u6CD5\u52A0\u5165\u670D\u52A1\u5668\u3002"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: "allowlist-add-hint",
|
|
197
|
+
pattern: /^Use allowlist add <playername> for you and your friends so that they can access the server, or modify allowlist\.json manually\./i,
|
|
198
|
+
translations: {
|
|
199
|
+
"zh-CN": "[\u767D\u540D\u5355\u63D0\u793A] \u8BF7\u4F7F\u7528\u300Callowlist add <\u73A9\u5BB6\u540D>\u300D\u6DFB\u52A0\u5141\u8BB8\u8FDB\u5165\u7684\u73A9\u5BB6\uFF0C\u6216\u624B\u52A8\u7F16\u8F91 allowlist.json\u3002"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: "allowlist-toggle-hint",
|
|
204
|
+
pattern: /^Alternatively, the allow list can be turned off by typing allowlist off or manually toggled in the server\.properties file\./i,
|
|
205
|
+
translations: {
|
|
206
|
+
"zh-CN": "[\u767D\u540D\u5355\u63D0\u793A] \u53EF\u901A\u8FC7\u8F93\u5165\u300Callowlist off\u300D\u6216\u5728 server.properties \u4E2D\u5173\u95ED\u767D\u540D\u5355\u63A7\u5236\u3002"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
// 19. 控制台内容日志已禁用
|
|
210
|
+
{
|
|
211
|
+
id: "content-log-disabled",
|
|
212
|
+
pattern: /^Content logging to console is disabled\.\s*Enable it with content-log-console-output-enabled=true in server\.properties/i,
|
|
213
|
+
translations: {
|
|
214
|
+
"zh-CN": "[\u63D0\u793A] \u6A21\u7EC4\u5185\u5BB9\u65E5\u5FD7\u8F93\u51FA\u81F3\u63A7\u5236\u53F0\u5F53\u524D\u5DF2\u5173\u95ED\uFF08\u53EF\u901A\u8FC7 server.properties \u4E2D\u7684 content-log-console-output-enabled=true \u5F00\u542F\uFF09\u3002"
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
// 20. 未知指令提示
|
|
218
|
+
{
|
|
219
|
+
id: "unknown-command",
|
|
220
|
+
pattern: /^Unknown command:\s*(.+?)\.\s*Please check that the command exists and that you have permission to use it\./i,
|
|
221
|
+
translations: {
|
|
222
|
+
"zh-CN": "[\u6307\u4EE4\u9519\u8BEF] \u672A\u77E5\u6307\u4EE4\u300C$1\u300D\u3002\u8BF7\u68C0\u67E5\u6307\u4EE4\u662F\u5426\u5B58\u5728\u6216\u60A8\u662F\u5426\u5177\u5907\u6267\u884C\u6743\u9650\u3002"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
// 21. 玩家连接与断开
|
|
226
|
+
{
|
|
227
|
+
id: "player-connected",
|
|
228
|
+
pattern: /^Player connected:\s*([^,]+),\s*xuid:\s*(\S+)/i,
|
|
229
|
+
translations: {
|
|
230
|
+
"zh-CN": "[\u73A9\u5BB6\u8FDE\u63A5] \u73A9\u5BB6 $1 \u5DF2\u52A0\u5165\u4E16\u754C (XUID: $2)"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: "player-disconnected",
|
|
235
|
+
pattern: /^Player disconnected:\s*([^,]+),\s*xuid:\s*(\S+)/i,
|
|
236
|
+
translations: {
|
|
237
|
+
"zh-CN": "[\u73A9\u5BB6\u65AD\u5F00] \u73A9\u5BB6 $1 \u5DF2\u79BB\u5F00\u4E16\u754C (XUID: $2)"
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
];
|
|
241
|
+
function interpolateRegexTemplate(match, template) {
|
|
242
|
+
return template.replace(/\$(\d+)/g, (full, indexStr) => {
|
|
243
|
+
const idx = parseInt(indexStr, 10);
|
|
244
|
+
if (!isNaN(idx) && idx < match.length) {
|
|
245
|
+
return match[idx] ?? "";
|
|
246
|
+
}
|
|
247
|
+
return full;
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function applyRuleReplacement(text, regex, replaceTemplate) {
|
|
251
|
+
const m = text.match(regex);
|
|
252
|
+
if (!m) return text;
|
|
253
|
+
return interpolateRegexTemplate(m, replaceTemplate);
|
|
254
|
+
}
|
|
255
|
+
function translateBdsLog(text, locale = "zh-CN") {
|
|
256
|
+
const trimmed = text.trim();
|
|
257
|
+
if (!trimmed) {
|
|
258
|
+
return { translated: false, text };
|
|
259
|
+
}
|
|
260
|
+
const targetLocale = locale === "zh" ? "zh-CN" : locale;
|
|
261
|
+
for (const rule of BUILTIN_BDS_TRANSLATIONS) {
|
|
262
|
+
const m = trimmed.match(rule.pattern);
|
|
263
|
+
if (m) {
|
|
264
|
+
const template = rule.translations[targetLocale];
|
|
265
|
+
if (template) {
|
|
266
|
+
const translatedText = interpolateRegexTemplate(m, template);
|
|
267
|
+
return { translated: true, text: translatedText, ruleId: rule.id };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { translated: false, text };
|
|
272
|
+
}
|
|
273
|
+
export {
|
|
274
|
+
BUILTIN_BDS_TRANSLATIONS,
|
|
275
|
+
applyRuleReplacement,
|
|
276
|
+
interpolateRegexTemplate,
|
|
277
|
+
translateBdsLog
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=log-translator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/log-translator.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * log-translator.ts \u2014 BDS \u539F\u7248\u65E5\u5FD7\u672C\u5730\u5316\u7FFB\u8BD1\u4E0E\u53CB\u597D\u8F6C\u6362\u5F15\u64CE\n *\n * \u5C06 Minecraft \u57FA\u5CA9\u7248\u4E13\u7528\u670D\u52A1\u7AEF (BDS) \u5F15\u64CE\u8F93\u51FA\u7684\u6666\u6DA9\u82F1\u6587\u65E5\u5FD7\n * \uFF08\u5982 Beta APIs \u963B\u65AD\u3001\u65B9\u5757\u5F62\u6001\u8D85\u9650\u3001\u5305\u7F3A\u5931\u3001\u914D\u65B9\u5931\u6548\u3001\u8BED\u6CD5\u9519\u8BEF\u7B49\uFF09\n * \u8F6C\u6362\u4E3A\u670D\u4E3B\u4E0E\u5F00\u53D1\u8005\u6613\u61C2\u7684\u672C\u5730\u5316\u8BED\u8A00\u65E5\u5FD7\u3002\n */\n\nexport interface TranslationRule {\n id: string;\n pattern: RegExp;\n translations: {\n \"zh-CN\": string;\n [locale: string]: string;\n };\n}\n\n/**\n * \u5185\u7F6E\u5E38\u89C1 BDS \u539F\u7248\u65E5\u5FD7\u7FFB\u8BD1\u5B57\u5178\n */\nexport const BUILTIN_BDS_TRANSLATIONS: TranslationRule[] = [\n // 1. \u5B9E\u9A8C\u6027 / \u6D4B\u8BD5\u7248 API \u672A\u5F00\u542F\u5BFC\u81F4\u811A\u672C\u963B\u65AD\u52A0\u8F7D\n {\n id: \"beta-apis-missing\",\n pattern: /(?:Plugin|Script)\\s+\\[(.+?)\\]\\s*-\\s*requesting dependency on beta APIs\\s*\\[(.+?)\\],\\s*but the Beta APIs experiment is not enabled\\./i,\n translations: {\n \"zh-CN\": \"[\u811A\u672C\u963B\u65AD] \u63D2\u4EF6\u300C$1\u300D\u4F9D\u8D56\u6D4B\u8BD5\u7248 API ($2)\uFF0C\u4F46\u5F53\u524D\u4E16\u754C\u672A\u5F00\u542F\u300C\u6D4B\u8BD5\u7248 API (Beta APIs)\u300D\u5B9E\u9A8C\u5F00\u5173\uFF0C\u5DF2\u88AB BDS \u62D2\u7EDD\u8FD0\u884C\u3002\u8BF7\u5728\u4E16\u754C\u914D\u7F6E\u4E2D\u5F00\u542F\u8BE5\u5B9E\u9A8C\u5F00\u5173\u3002\",\n },\n },\n // 2. \u811A\u672C\u8BED\u6CD5\u9519\u8BEF / \u7B26\u53F7\u7F3A\u5931\n {\n id: \"script-syntax-missing-export\",\n pattern: /SyntaxError:\\s*Could not find export '(.+?)' in module '(.+?)'/i,\n translations: {\n \"zh-CN\": \"[\u811A\u672C\u8BED\u6CD5\u9519\u8BEF] \u6A21\u7EC4\u5C1D\u8BD5\u4ECE\u300C$2\u300D\u5BFC\u5165\u4E0D\u5B58\u5728\u7684\u7B26\u53F7\u300C$1\u300D\uFF0C\u811A\u672C\u52A0\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u6A21\u7EC4\u811A\u672C\u8BED\u6CD5\u6216 API \u7248\u672C\u517C\u5BB9\u6027\u3002\",\n },\n },\n // 3. \u4E16\u754C\u914D\u7F6E\u6E05\u5355\u4E2D\u7684\u5305\u5728\u78C1\u76D8\u4E0A\u4E0D\u5B58\u5728\n {\n id: \"configured-pack-missing\",\n pattern: /Configured pack \\(id:\\s*([0-9a-fA-F-]+),\\s*version:\\s*([^)]+)\\)\\s*was not found and was ignored/i,\n translations: {\n \"zh-CN\": \"[\u5305\u7F3A\u5931] \u4E16\u754C\u6FC0\u6D3B\u6E05\u5355\u4E2D\u7684\u5305 (UUID: $1, \u7248\u672C: $2) \u5728\u672C\u5730\u672A\u627E\u5230\uFF0C\u5DF2\u88AB BDS \u81EA\u52A8\u5FFD\u7565\u3002\",\n },\n },\n // 4. \u81EA\u5B9A\u4E49\u65B9\u5757\u5F62\u6001\u6570\u91CF\u8D85\u9650\u8B66\u544A\n {\n id: \"block-permutations-limit\",\n pattern: /World with over 65536 block permutations may degrade performance\\.\\s*Current world has (\\d+) permutations\\./i,\n translations: {\n \"zh-CN\": \"[\u6027\u80FD\u63D0\u793A] \u81EA\u5B9A\u4E49\u65B9\u5757\u5F62\u6001\u6570\u91CF\u8FBE $1 \u4E2A (\u8D85\u51FA\u63A8\u8350\u4E0A\u9650 65,536)\uFF0C\u53EF\u80FD\u5F71\u54CD\u670D\u52A1\u7AEF\u53CA\u5BA2\u6237\u7AEF\u52A0\u8F7D\u6027\u80FD\u3002\",\n },\n },\n // 5. \u914D\u65B9\u7269\u54C1\u4E0D\u5B58\u5728\u6216\u65E0\u6548\n {\n id: \"recipe-item-missing\",\n pattern: /(?:\\[Recipes\\]\\s+)?(.+?)\\s+\\|\\s+(.+?)\\s+\\|\\s+The Item:\\s*(\\S+)\\s+is missing or invalid,\\s*can't make the recipe/i,\n translations: {\n \"zh-CN\": \"[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u914D\u65B9\u6807\u8BC6: $2) \u5F15\u7528\u7684\u7269\u54C1\u300C$3\u300D\u4E0D\u5B58\u5728\u6216\u65E0\u6548\uFF0C\u65E0\u6CD5\u751F\u6210\u5408\u6210\u914D\u65B9\u3002\",\n },\n },\n // 6. \u914D\u65B9\u7F3A\u5C11\u6709\u6548\u539F\u6599\n {\n id: \"recipe-ingredient-missing\",\n pattern: /(?:\\[Recipes\\]\\s+)?(.+?)\\s+\\|\\s+(.+?)\\s+\\|\\s+Recipe for:\\s*(\\S+)\\s+is missing \\(unknown\\) ingredient/i,\n translations: {\n \"zh-CN\": \"[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u4EA7\u7269: $2) \u7F3A\u5C11\u6709\u6548\u539F\u6599\uFF08\u5305\u542B\u672A\u8BC6\u522B\u7684\u539F\u6599\uFF09\uFF0C\u65E0\u6CD5\u6CE8\u518C\u3002\",\n },\n },\n // 7. \u914D\u65B9\u4EA7\u7269\u683C\u5F0F\u9519\u8BEF\n {\n id: \"recipe-result-malformed\",\n pattern: /(?:\\[Recipes\\]\\s+)?(.+?)\\s+\\|\\s+(.+?)\\s+\\|\\s+Recipe result malformed/i,\n translations: {\n \"zh-CN\": \"[\u914D\u65B9\u9519\u8BEF] \u914D\u65B9\u6587\u4EF6\u300C$1\u300D(\u914D\u65B9\u6807\u8BC6: $2) \u7684\u4EA7\u7269\u7ED3\u679C\u5B9A\u4E49\u683C\u5F0F\u9519\u8BEF (Malformed result)\u3002\",\n },\n },\n // 8. \u65B9\u5757\u5B9A\u4E49\u7EC4\u4EF6\u672A\u5728 Schema \u4E2D\u58F0\u660E\n {\n id: \"block-component-schema-unknown\",\n pattern: /(?:\\[Blocks\\]\\s+)?block_definitions\\s*\\|.*?\\|\\s*([^|\\r\\n]+?)\\.json\\s*\\|\\s*(?:->\\s*)?(.+?):\\s*this component was found in the input,\\s*but is not present in the Schema/i,\n translations: {\n \"zh-CN\": \"[\u65B9\u5757\u89C4\u8303\u9519\u8BEF] \u65B9\u5757\u5B9A\u4E49\u300C$1.json\u300D\u5305\u542B\u672A\u5728\u5F53\u524D\u7248\u672C Schema \u4E2D\u5B9A\u4E49\u7684\u672A\u77E5\u7EC4\u4EF6: $2\",\n },\n },\n // 9. \u65B9\u5757\u7EC4\u4EF6\u5B50\u9879\u5728\u6B64\u5904\u65E0\u6548\n {\n id: \"block-child-component-invalid\",\n pattern: /(?:\\[Blocks\\]\\s+)?block_definitions\\s*\\|.*?\\|\\s*([^|\\r\\n]+?)\\.json\\s*\\|.*?\\|\\s*components\\s*\\|\\s*([^|\\r\\n]+?)\\s*\\|\\s*child '(.+?)' not valid here\\./i,\n translations: {\n \"zh-CN\": \"[\u65B9\u5757\u914D\u7F6E\u9519\u8BEF] \u65B9\u5757\u5B9A\u4E49\u300C$1.json\u300D\u7EC4\u4EF6\u300C$2\u300D\u7684\u5B50\u5C5E\u6027\u300C$3\u300D\u5728\u6B64\u5904\u65E0\u6548\u3002\",\n },\n },\n // 10. \u65B9\u5757\u5B9A\u4E49\u89E3\u6790\u5931\u8D25\n {\n id: \"block-definition-parse-failed\",\n pattern: /(?:\\[Blocks\\]\\s+)?block_definitions\\s*\\|.*?\\|\\s*([^|\\r\\n]+?)\\.json\\s*\\|\\s*Block definition parsing failed/i,\n translations: {\n \"zh-CN\": \"[\u65B9\u5757\u89E3\u6790\u5931\u8D25] \u65E0\u6CD5\u89E3\u6790\u65B9\u5757\u5B9A\u4E49\u6587\u4EF6\u300C$1.json\u300D\u3002\",\n },\n },\n // 11. \u811A\u672C\u7EC4\u4EF6\u672A\u5728\u811A\u672C\u4E2D\u6CE8\u518C\u4F46\u88AB\u7269\u54C1\u4F7F\u7528\n {\n id: \"script-component-not-registered\",\n pattern: /(?:\\[Scripting\\]\\s+)?Component '(.+?)' was not registered in script but used on an item/i,\n translations: {\n \"zh-CN\": \"[\u811A\u672C\u7EC4\u4EF6\u672A\u6CE8\u518C] \u7269\u54C1\u5F15\u7528\u4E86\u672A\u5728\u811A\u672C\u4E2D\u6CE8\u518C\u7684\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u3002\",\n },\n },\n // 12. \u811A\u672C\u6CE8\u518C\u7684\u65B9\u5757\u7EC4\u4EF6\u672A\u88AB\u4EFB\u4F55\u65B9\u5757\u4F7F\u7528\n {\n id: \"block-component-unused\",\n pattern: /(?:\\[Scripting\\]\\s+)?Block custom component '(.+?)' is not being used by a block/i,\n translations: {\n \"zh-CN\": \"[\u7EC4\u4EF6\u63D0\u793A] \u811A\u672C\u6CE8\u518C\u7684\u65B9\u5757\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u672A\u88AB\u4EFB\u4F55\u65B9\u5757\u4F7F\u7528\u3002\",\n },\n },\n // 13. \u811A\u672C\u6CE8\u518C\u7684\u7269\u54C1\u7EC4\u4EF6\u672A\u88AB\u4EFB\u4F55\u7269\u54C1\u4F7F\u7528\n {\n id: \"item-component-unused\",\n pattern: /(?:\\[Scripting\\]\\s+)?Item custom component '(.+?)' is not being used by an item/i,\n translations: {\n \"zh-CN\": \"[\u7EC4\u4EF6\u63D0\u793A] \u811A\u672C\u6CE8\u518C\u7684\u7269\u54C1\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300C$1\u300D\u672A\u88AB\u4EFB\u4F55\u7269\u54C1\u4F7F\u7528\u3002\",\n },\n },\n // 14. \u670D\u52A1\u7AEF\u542F\u52A8\u5C31\u7EEA\n {\n id: \"server-started\",\n pattern: /^Server started\\./i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002\",\n },\n },\n // 15. \u670D\u52A1\u7AEF\u505C\u673A\u6D41\u7A0B\n {\n id: \"server-stop-requested\",\n pattern: /^Server stop requested\\./i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u6536\u5230\u505C\u670D\u8BF7\u6C42\uFF0C\u6B63\u5728\u901A\u77E5\u5E76\u4FDD\u5B58\u4E16\u754C\u6570\u636E...\",\n },\n },\n {\n id: \"server-stopping\",\n pattern: /^Stopping server\\.\\.\\./i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u6B63\u5728\u5173\u95ED\u670D\u52A1\u7AEF...\",\n },\n },\n {\n id: \"server-quit-correctly\",\n pattern: /^Quit correctly/i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u670D\u52A1\u7AEF\u5DF2\u6B63\u5E38\u5B89\u5168\u9000\u51FA\u3002\",\n },\n },\n {\n id: \"server-starting\",\n pattern: /^Starting Server/i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u6B63\u5728\u542F\u52A8 BDS \u670D\u52A1\u7AEF...\",\n },\n },\n {\n id: \"server-setting-up-logging\",\n pattern: /^NO LOG FILE! - setting up server logging\\.\\.\\./i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u6B63\u5728\u521D\u59CB\u5316\u670D\u52A1\u7AEF\u65E5\u5FD7\u7CFB\u7EDF...\",\n },\n },\n // 16. \u6253\u5F00\u4E16\u754C\u6570\u636E\n {\n id: \"opening-level\",\n pattern: /^Opening level '(.+?)'/i,\n translations: {\n \"zh-CN\": \"[\u4E16\u754C] \u6B63\u5728\u6253\u5F00\u4E16\u754C\u6570\u636E: $1\",\n },\n },\n // 17. \u7F51\u7EDC\u7AEF\u53E3\u4E0E\u4FE1\u4EE4\u670D\u52A1\n {\n id: \"ipv4-port\",\n pattern: /^IPv4 supported, port: (\\d+): Used for gameplay and LAN discovery/i,\n translations: {\n \"zh-CN\": \"[\u7F51\u7EDC] IPv4 \u6E38\u620F\u4E0E\u5C40\u57DF\u7F51\u53D1\u73B0\u7AEF\u53E3: $1 (UDP)\",\n },\n },\n {\n id: \"ipv6-port\",\n pattern: /^IPv6 supported, port: (\\d+): Used for gameplay/i,\n translations: {\n \"zh-CN\": \"[\u7F51\u7EDC] IPv6 \u6E38\u620F\u7AEF\u53E3: $1 (UDP)\",\n },\n },\n {\n id: \"signaling-signed-in\",\n pattern: /^Signed in to signaling service successfully/i,\n translations: {\n \"zh-CN\": \"[\u7F51\u7EDC] \u5DF2\u6210\u529F\u767B\u5F55\u5FAE\u8F6F\u8054\u673A\u4FE1\u4EE4\u670D\u52A1\u3002\",\n },\n },\n {\n id: \"waiting-minecraft-services\",\n pattern: /^Waiting for Minecraft services\\.\\.\\./i,\n translations: {\n \"zh-CN\": \"[\u670D\u52A1\u7AEF] \u6B63\u5728\u7B49\u5F85 Minecraft \u57FA\u7840\u670D\u52A1\u8FDE\u63A5...\",\n },\n },\n // 18. \u767D\u540D\u5355\u8B66\u544A\u4E0E\u63D0\u793A\n {\n id: \"allowlist-empty-warning\",\n pattern: /^Allow list is enabled but contains no entries\\./i,\n translations: {\n \"zh-CN\": \"[\u767D\u540D\u5355\u8B66\u544A] \u767D\u540D\u5355\u529F\u80FD\u5DF2\u5F00\u542F\u4F46\u540D\u5355\u4E3A\u7A7A\uFF01\u9664\u7BA1\u7406\u5458\u5916\u5176\u4ED6\u73A9\u5BB6\u5C06\u65E0\u6CD5\u52A0\u5165\u670D\u52A1\u5668\u3002\",\n },\n },\n {\n id: \"allowlist-add-hint\",\n pattern: /^Use allowlist add <playername> for you and your friends so that they can access the server, or modify allowlist\\.json manually\\./i,\n translations: {\n \"zh-CN\": \"[\u767D\u540D\u5355\u63D0\u793A] \u8BF7\u4F7F\u7528\u300Callowlist add <\u73A9\u5BB6\u540D>\u300D\u6DFB\u52A0\u5141\u8BB8\u8FDB\u5165\u7684\u73A9\u5BB6\uFF0C\u6216\u624B\u52A8\u7F16\u8F91 allowlist.json\u3002\",\n },\n },\n {\n id: \"allowlist-toggle-hint\",\n pattern: /^Alternatively, the allow list can be turned off by typing allowlist off or manually toggled in the server\\.properties file\\./i,\n translations: {\n \"zh-CN\": \"[\u767D\u540D\u5355\u63D0\u793A] \u53EF\u901A\u8FC7\u8F93\u5165\u300Callowlist off\u300D\u6216\u5728 server.properties \u4E2D\u5173\u95ED\u767D\u540D\u5355\u63A7\u5236\u3002\",\n },\n },\n // 19. \u63A7\u5236\u53F0\u5185\u5BB9\u65E5\u5FD7\u5DF2\u7981\u7528\n {\n id: \"content-log-disabled\",\n pattern: /^Content logging to console is disabled\\.\\s*Enable it with content-log-console-output-enabled=true in server\\.properties/i,\n translations: {\n \"zh-CN\": \"[\u63D0\u793A] \u6A21\u7EC4\u5185\u5BB9\u65E5\u5FD7\u8F93\u51FA\u81F3\u63A7\u5236\u53F0\u5F53\u524D\u5DF2\u5173\u95ED\uFF08\u53EF\u901A\u8FC7 server.properties \u4E2D\u7684 content-log-console-output-enabled=true \u5F00\u542F\uFF09\u3002\",\n },\n },\n // 20. \u672A\u77E5\u6307\u4EE4\u63D0\u793A\n {\n id: \"unknown-command\",\n pattern: /^Unknown command:\\s*(.+?)\\.\\s*Please check that the command exists and that you have permission to use it\\./i,\n translations: {\n \"zh-CN\": \"[\u6307\u4EE4\u9519\u8BEF] \u672A\u77E5\u6307\u4EE4\u300C$1\u300D\u3002\u8BF7\u68C0\u67E5\u6307\u4EE4\u662F\u5426\u5B58\u5728\u6216\u60A8\u662F\u5426\u5177\u5907\u6267\u884C\u6743\u9650\u3002\",\n },\n },\n // 21. \u73A9\u5BB6\u8FDE\u63A5\u4E0E\u65AD\u5F00\n {\n id: \"player-connected\",\n pattern: /^Player connected:\\s*([^,]+),\\s*xuid:\\s*(\\S+)/i,\n translations: {\n \"zh-CN\": \"[\u73A9\u5BB6\u8FDE\u63A5] \u73A9\u5BB6 $1 \u5DF2\u52A0\u5165\u4E16\u754C (XUID: $2)\",\n },\n },\n {\n id: \"player-disconnected\",\n pattern: /^Player disconnected:\\s*([^,]+),\\s*xuid:\\s*(\\S+)/i,\n translations: {\n \"zh-CN\": \"[\u73A9\u5BB6\u65AD\u5F00] \u73A9\u5BB6 $1 \u5DF2\u79BB\u5F00\u4E16\u754C (XUID: $2)\",\n },\n },\n];\n\n/**\n * \u5C06\u6B63\u5219\u5339\u914D\u7ED3\u679C\u5957\u5165\u542B $1, $2 \u7B49\u5360\u4F4D\u7B26\u7684\u6A21\u677F\u5B57\u7B26\u4E32\n */\nexport function interpolateRegexTemplate(match: RegExpMatchArray, template: string): string {\n return template.replace(/\\$(\\d+)/g, (full, indexStr: string) => {\n const idx = parseInt(indexStr, 10);\n if (!isNaN(idx) && idx < match.length) {\n return match[idx] ?? \"\";\n }\n return full;\n });\n}\n\n/**\n * \u5E94\u7528\u89C4\u5219\u6B63\u5219\u66FF\u6362\u6A21\u677F\n */\nexport function applyRuleReplacement(text: string, regex: RegExp, replaceTemplate: string): string {\n const m = text.match(regex);\n if (!m) return text;\n return interpolateRegexTemplate(m, replaceTemplate);\n}\n\n/**\n * \u7FFB\u8BD1\u5355\u6761 BDS \u65E5\u5FD7\u6587\u672C\uFF08\u7EAF\u51FD\u6570\uFF09\n */\nexport function translateBdsLog(\n text: string,\n locale: string = \"zh-CN\"\n): { translated: boolean; text: string; ruleId?: string } {\n const trimmed = text.trim();\n if (!trimmed) {\n return { translated: false, text };\n }\n\n // \u4EC5\u5728\u975E\u82F1\u6587\uFF08\u5982 zh-CN\uFF09\u6216\u914D\u7F6E\u4E86\u8BE5\u8BED\u8A00\u65F6\u7FFB\u8BD1\n const targetLocale = locale === \"zh\" ? \"zh-CN\" : locale;\n\n for (const rule of BUILTIN_BDS_TRANSLATIONS) {\n const m = trimmed.match(rule.pattern);\n if (m) {\n const template = rule.translations[targetLocale];\n if (template) {\n const translatedText = interpolateRegexTemplate(m, template);\n return { translated: true, text: translatedText, ruleId: rule.id };\n }\n }\n }\n\n return { translated: false, text };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import {
|
|
4
|
+
applyRuleReplacement,
|
|
5
|
+
interpolateRegexTemplate,
|
|
6
|
+
translateBdsLog
|
|
7
|
+
} from "./log-translator.js";
|
|
8
|
+
test("translateBdsLog: Beta APIs \u7F3A\u5931\u963B\u65AD", () => {
|
|
9
|
+
const line = "Plugin [sfmc-modules - 1.0.0] - requesting dependency on beta APIs [@minecraft/server-admin - 1.0.0-beta], but the Beta APIs experiment is not enabled.";
|
|
10
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
11
|
+
assert.equal(res.translated, true);
|
|
12
|
+
assert.equal(res.ruleId, "beta-apis-missing");
|
|
13
|
+
assert.ok(res.text.includes("\u63D2\u4EF6\u300Csfmc-modules - 1.0.0\u300D\u4F9D\u8D56\u6D4B\u8BD5\u7248 API (@minecraft/server-admin - 1.0.0-beta)"));
|
|
14
|
+
assert.ok(res.text.includes("\u672A\u5F00\u542F\u300C\u6D4B\u8BD5\u7248 API (Beta APIs)\u300D\u5B9E\u9A8C\u5F00\u5173"));
|
|
15
|
+
});
|
|
16
|
+
test("translateBdsLog: \u811A\u672C\u8BED\u6CD5\u9519\u8BEF missing export", () => {
|
|
17
|
+
const line = "SyntaxError: Could not find export 'Vector3' in module '@minecraft/server'";
|
|
18
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
19
|
+
assert.equal(res.translated, true);
|
|
20
|
+
assert.equal(res.ruleId, "script-syntax-missing-export");
|
|
21
|
+
assert.ok(res.text.includes("\u6A21\u7EC4\u5C1D\u8BD5\u4ECE\u300C@minecraft/server\u300D\u5BFC\u5165\u4E0D\u5B58\u5728\u7684\u7B26\u53F7\u300CVector3\u300D"));
|
|
22
|
+
});
|
|
23
|
+
test("translateBdsLog: \u6FC0\u6D3B\u5305\u5728\u672C\u5730\u7F3A\u5931", () => {
|
|
24
|
+
const line = "Configured pack (id: 3116e462-9838-48bf-be53-354958c1810f, version: 1.21.100) was not found and was ignored";
|
|
25
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
26
|
+
assert.equal(res.translated, true);
|
|
27
|
+
assert.equal(res.ruleId, "configured-pack-missing");
|
|
28
|
+
assert.ok(res.text.includes("UUID: 3116e462-9838-48bf-be53-354958c1810f"));
|
|
29
|
+
assert.ok(res.text.includes("\u7248\u672C: 1.21.100"));
|
|
30
|
+
});
|
|
31
|
+
test("translateBdsLog: \u81EA\u5B9A\u4E49\u65B9\u5757\u5F62\u6001\u6570\u91CF\u8D85\u9650", () => {
|
|
32
|
+
const line = "World with over 65536 block permutations may degrade performance. Current world has 74227 permutations.";
|
|
33
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
34
|
+
assert.equal(res.translated, true);
|
|
35
|
+
assert.equal(res.ruleId, "block-permutations-limit");
|
|
36
|
+
assert.ok(res.text.includes("74227 \u4E2A"));
|
|
37
|
+
assert.ok(res.text.includes("\u8D85\u51FA\u63A8\u8350\u4E0A\u9650 65,536"));
|
|
38
|
+
});
|
|
39
|
+
test("translateBdsLog: \u914D\u65B9\u7269\u54C1\u7F3A\u5931", () => {
|
|
40
|
+
const line = "[Recipes] recipes/japanese/mochi_rice.json | amp:mochi_rice | The Item: amp:mochi_rice is missing or invalid, can't make the recipe";
|
|
41
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
42
|
+
assert.equal(res.translated, true);
|
|
43
|
+
assert.equal(res.ruleId, "recipe-item-missing");
|
|
44
|
+
assert.ok(res.text.includes("\u914D\u65B9\u6587\u4EF6\u300Crecipes/japanese/mochi_rice.json\u300D"));
|
|
45
|
+
assert.ok(res.text.includes("\u7269\u54C1\u300Camp:mochi_rice\u300D\u4E0D\u5B58\u5728\u6216\u65E0\u6548"));
|
|
46
|
+
});
|
|
47
|
+
test("translateBdsLog: \u914D\u65B9\u539F\u6599\u7F3A\u5931", () => {
|
|
48
|
+
const line = "[Recipes] recipes/japanese/rice_eel.json | amp:rice_eel | Recipe for: amp:rice_eel is missing (unknown) ingredient";
|
|
49
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
50
|
+
assert.equal(res.translated, true);
|
|
51
|
+
assert.equal(res.ruleId, "recipe-ingredient-missing");
|
|
52
|
+
assert.ok(res.text.includes("\u4EA7\u7269: amp:rice_eel"));
|
|
53
|
+
assert.ok(res.text.includes("\u7F3A\u5C11\u6709\u6548\u539F\u6599"));
|
|
54
|
+
});
|
|
55
|
+
test("translateBdsLog: \u914D\u65B9\u4EA7\u7269\u683C\u5F0F\u9519\u8BEF", () => {
|
|
56
|
+
const line = "[Recipes] recipes/furniture/money.json | amp:money | Recipe result malformed";
|
|
57
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
58
|
+
assert.equal(res.translated, true);
|
|
59
|
+
assert.equal(res.ruleId, "recipe-result-malformed");
|
|
60
|
+
assert.ok(res.text.includes("\u4EA7\u7269\u7ED3\u679C\u5B9A\u4E49\u683C\u5F0F\u9519\u8BEF"));
|
|
61
|
+
});
|
|
62
|
+
test("translateBdsLog: \u65B9\u5757 Schema \u672A\u77E5\u7EC4\u4EF6\u4E0E\u5B50\u5C5E\u6027\u9519\u8BEF", () => {
|
|
63
|
+
const line1 = "[Blocks] block_definitions | worlds/Bedrock level/behavior_packs/[BP] TouHouLittleMaid_BP | blocks/skull/fairy_skull_2.json | -> components -> tlm:skull: this component was found in the input, but is not present in the Schema";
|
|
64
|
+
const res1 = translateBdsLog(line1, "zh-CN");
|
|
65
|
+
assert.equal(res1.translated, true);
|
|
66
|
+
assert.equal(res1.ruleId, "block-component-schema-unknown");
|
|
67
|
+
assert.ok(res1.text.includes("blocks/skull/fairy_skull_2.json"));
|
|
68
|
+
assert.ok(res1.text.includes("\u672A\u77E5\u7EC4\u4EF6: components -> tlm:skull"));
|
|
69
|
+
const line2 = "[Blocks] block_definitions | worlds/Bedrock level/behavior_packs/[BP] [BM] [\u81EA\u7814] [\u73A9\u6CD5] GlobalCuisine_BP | blocks/steamer/steamer.json | worlds/Bedrock level/behavior_packs/[BP] [BM] [\u81EA\u7814] [\u73A9\u6CD5] GlobalCuisine_BP | blocks/steamer/steamer.json | amp:steamer | components | amp:steamer | child 'amp:steamer' not valid here.";
|
|
70
|
+
const res2 = translateBdsLog(line2, "zh-CN");
|
|
71
|
+
assert.equal(res2.translated, true);
|
|
72
|
+
assert.equal(res2.ruleId, "block-child-component-invalid");
|
|
73
|
+
assert.ok(res2.text.includes("blocks/steamer/steamer.json"));
|
|
74
|
+
assert.ok(res2.text.includes("\u5B50\u5C5E\u6027\u300Camp:steamer\u300D\u5728\u6B64\u5904\u65E0\u6548"));
|
|
75
|
+
});
|
|
76
|
+
test("translateBdsLog: \u811A\u672C\u7EC4\u4EF6\u672A\u6CE8\u518C", () => {
|
|
77
|
+
const line = "[Scripting] Component 'tlm:deprecated' was not registered in script but used on an item";
|
|
78
|
+
const res = translateBdsLog(line, "zh-CN");
|
|
79
|
+
assert.equal(res.translated, true);
|
|
80
|
+
assert.equal(res.ruleId, "script-component-not-registered");
|
|
81
|
+
assert.ok(res.text.includes("\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300Ctlm:deprecated\u300D"));
|
|
82
|
+
});
|
|
83
|
+
test("translateBdsLog: \u670D\u52A1\u7AEF\u751F\u547D\u5468\u671F\u4E0E\u7AEF\u53E3", () => {
|
|
84
|
+
assert.equal(translateBdsLog("Server started.", "zh-CN").text, "[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002");
|
|
85
|
+
assert.equal(translateBdsLog("Stopping server...", "zh-CN").text, "[\u670D\u52A1\u7AEF] \u6B63\u5728\u5173\u95ED\u670D\u52A1\u7AEF...");
|
|
86
|
+
assert.equal(translateBdsLog("Quit correctly", "zh-CN").text, "[\u670D\u52A1\u7AEF] \u670D\u52A1\u7AEF\u5DF2\u6B63\u5E38\u5B89\u5168\u9000\u51FA\u3002");
|
|
87
|
+
assert.equal(
|
|
88
|
+
translateBdsLog("IPv4 supported, port: 19132: Used for gameplay and LAN discovery", "zh-CN").text,
|
|
89
|
+
"[\u7F51\u7EDC] IPv4 \u6E38\u620F\u4E0E\u5C40\u57DF\u7F51\u53D1\u73B0\u7AEF\u53E3: 19132 (UDP)"
|
|
90
|
+
);
|
|
91
|
+
assert.equal(
|
|
92
|
+
translateBdsLog("Allow list is enabled but contains no entries.", "zh-CN").text,
|
|
93
|
+
"[\u767D\u540D\u5355\u8B66\u544A] \u767D\u540D\u5355\u529F\u80FD\u5DF2\u5F00\u542F\u4F46\u540D\u5355\u4E3A\u7A7A\uFF01\u9664\u7BA1\u7406\u5458\u5916\u5176\u4ED6\u73A9\u5BB6\u5C06\u65E0\u6CD5\u52A0\u5165\u670D\u52A1\u5668\u3002"
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
test("translateBdsLog: \u73A9\u5BB6\u52A0\u5165\u4E0E\u79BB\u5F00", () => {
|
|
97
|
+
const join = translateBdsLog("Player connected: Steve, xuid: 2535412345678901", "zh-CN");
|
|
98
|
+
assert.equal(join.text, "[\u73A9\u5BB6\u8FDE\u63A5] \u73A9\u5BB6 Steve \u5DF2\u52A0\u5165\u4E16\u754C (XUID: 2535412345678901)");
|
|
99
|
+
const leave = translateBdsLog("Player disconnected: Steve, xuid: 2535412345678901", "zh-CN");
|
|
100
|
+
assert.equal(leave.text, "[\u73A9\u5BB6\u65AD\u5F00] \u73A9\u5BB6 Steve \u5DF2\u79BB\u5F00\u4E16\u754C (XUID: 2535412345678901)");
|
|
101
|
+
});
|
|
102
|
+
test("translateBdsLog: \u672A\u5339\u914D\u884C\u539F\u6837\u8FD4\u56DE", () => {
|
|
103
|
+
const plain = "A custom line that has no translation rule.";
|
|
104
|
+
const res = translateBdsLog(plain, "zh-CN");
|
|
105
|
+
assert.equal(res.translated, false);
|
|
106
|
+
assert.equal(res.text, plain);
|
|
107
|
+
});
|
|
108
|
+
test("interpolateRegexTemplate & applyRuleReplacement", () => {
|
|
109
|
+
const m = "Hello world 123".match(/Hello (\w+) (\d+)/);
|
|
110
|
+
assert.ok(m);
|
|
111
|
+
const out = interpolateRegexTemplate(m, "Greeting $1 with id $2");
|
|
112
|
+
assert.equal(out, "Greeting world with id 123");
|
|
113
|
+
const replaced = applyRuleReplacement(
|
|
114
|
+
"Warning: player Steve did action 5",
|
|
115
|
+
/Warning: player (\w+) did action (\d+)/,
|
|
116
|
+
"\u8B66\u544A: \u73A9\u5BB6 $1 \u89E6\u53D1\u4E86\u884C\u4E3A $2"
|
|
117
|
+
);
|
|
118
|
+
assert.equal(replaced, "\u8B66\u544A: \u73A9\u5BB6 Steve \u89E6\u53D1\u4E86\u884C\u4E3A 5");
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=log-translator.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/log-translator.test.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * log-translator.test.ts \u2014 BDS \u539F\u7248\u65E5\u5FD7\u672C\u5730\u5316\u7FFB\u8BD1\u5355\u6D4B\n */\nimport assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport {\n applyRuleReplacement,\n interpolateRegexTemplate,\n translateBdsLog,\n} from \"./log-translator.js\";\n\ntest(\"translateBdsLog: Beta APIs \u7F3A\u5931\u963B\u65AD\", () => {\n const line =\n \"Plugin [sfmc-modules - 1.0.0] - requesting dependency on beta APIs [@minecraft/server-admin - 1.0.0-beta], but the Beta APIs experiment is not enabled.\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"beta-apis-missing\");\n assert.ok(res.text.includes(\"\u63D2\u4EF6\u300Csfmc-modules - 1.0.0\u300D\u4F9D\u8D56\u6D4B\u8BD5\u7248 API (@minecraft/server-admin - 1.0.0-beta)\"));\n assert.ok(res.text.includes(\"\u672A\u5F00\u542F\u300C\u6D4B\u8BD5\u7248 API (Beta APIs)\u300D\u5B9E\u9A8C\u5F00\u5173\"));\n});\n\ntest(\"translateBdsLog: \u811A\u672C\u8BED\u6CD5\u9519\u8BEF missing export\", () => {\n const line = \"SyntaxError: Could not find export 'Vector3' in module '@minecraft/server'\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"script-syntax-missing-export\");\n assert.ok(res.text.includes(\"\u6A21\u7EC4\u5C1D\u8BD5\u4ECE\u300C@minecraft/server\u300D\u5BFC\u5165\u4E0D\u5B58\u5728\u7684\u7B26\u53F7\u300CVector3\u300D\"));\n});\n\ntest(\"translateBdsLog: \u6FC0\u6D3B\u5305\u5728\u672C\u5730\u7F3A\u5931\", () => {\n const line = \"Configured pack (id: 3116e462-9838-48bf-be53-354958c1810f, version: 1.21.100) was not found and was ignored\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"configured-pack-missing\");\n assert.ok(res.text.includes(\"UUID: 3116e462-9838-48bf-be53-354958c1810f\"));\n assert.ok(res.text.includes(\"\u7248\u672C: 1.21.100\"));\n});\n\ntest(\"translateBdsLog: \u81EA\u5B9A\u4E49\u65B9\u5757\u5F62\u6001\u6570\u91CF\u8D85\u9650\", () => {\n const line = \"World with over 65536 block permutations may degrade performance. Current world has 74227 permutations.\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"block-permutations-limit\");\n assert.ok(res.text.includes(\"74227 \u4E2A\"));\n assert.ok(res.text.includes(\"\u8D85\u51FA\u63A8\u8350\u4E0A\u9650 65,536\"));\n});\n\ntest(\"translateBdsLog: \u914D\u65B9\u7269\u54C1\u7F3A\u5931\", () => {\n const line =\n \"[Recipes] recipes/japanese/mochi_rice.json | amp:mochi_rice | The Item: amp:mochi_rice is missing or invalid, can't make the recipe\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"recipe-item-missing\");\n assert.ok(res.text.includes(\"\u914D\u65B9\u6587\u4EF6\u300Crecipes/japanese/mochi_rice.json\u300D\"));\n assert.ok(res.text.includes(\"\u7269\u54C1\u300Camp:mochi_rice\u300D\u4E0D\u5B58\u5728\u6216\u65E0\u6548\"));\n});\n\ntest(\"translateBdsLog: \u914D\u65B9\u539F\u6599\u7F3A\u5931\", () => {\n const line =\n \"[Recipes] recipes/japanese/rice_eel.json | amp:rice_eel | Recipe for: amp:rice_eel is missing (unknown) ingredient\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"recipe-ingredient-missing\");\n assert.ok(res.text.includes(\"\u4EA7\u7269: amp:rice_eel\"));\n assert.ok(res.text.includes(\"\u7F3A\u5C11\u6709\u6548\u539F\u6599\"));\n});\n\ntest(\"translateBdsLog: \u914D\u65B9\u4EA7\u7269\u683C\u5F0F\u9519\u8BEF\", () => {\n const line = \"[Recipes] recipes/furniture/money.json | amp:money | Recipe result malformed\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"recipe-result-malformed\");\n assert.ok(res.text.includes(\"\u4EA7\u7269\u7ED3\u679C\u5B9A\u4E49\u683C\u5F0F\u9519\u8BEF\"));\n});\n\ntest(\"translateBdsLog: \u65B9\u5757 Schema \u672A\u77E5\u7EC4\u4EF6\u4E0E\u5B50\u5C5E\u6027\u9519\u8BEF\", () => {\n const line1 =\n \"[Blocks] block_definitions | worlds/Bedrock level/behavior_packs/[BP] TouHouLittleMaid_BP | blocks/skull/fairy_skull_2.json | -> components -> tlm:skull: this component was found in the input, but is not present in the Schema\";\n const res1 = translateBdsLog(line1, \"zh-CN\");\n assert.equal(res1.translated, true);\n assert.equal(res1.ruleId, \"block-component-schema-unknown\");\n assert.ok(res1.text.includes(\"blocks/skull/fairy_skull_2.json\"));\n assert.ok(res1.text.includes(\"\u672A\u77E5\u7EC4\u4EF6: components -> tlm:skull\"));\n\n const line2 =\n \"[Blocks] block_definitions | worlds/Bedrock level/behavior_packs/[BP] [BM] [\u81EA\u7814] [\u73A9\u6CD5] GlobalCuisine_BP | blocks/steamer/steamer.json | worlds/Bedrock level/behavior_packs/[BP] [BM] [\u81EA\u7814] [\u73A9\u6CD5] GlobalCuisine_BP | blocks/steamer/steamer.json | amp:steamer | components | amp:steamer | child 'amp:steamer' not valid here.\";\n const res2 = translateBdsLog(line2, \"zh-CN\");\n assert.equal(res2.translated, true);\n assert.equal(res2.ruleId, \"block-child-component-invalid\");\n assert.ok(res2.text.includes(\"blocks/steamer/steamer.json\"));\n assert.ok(res2.text.includes(\"\u5B50\u5C5E\u6027\u300Camp:steamer\u300D\u5728\u6B64\u5904\u65E0\u6548\"));\n});\n\ntest(\"translateBdsLog: \u811A\u672C\u7EC4\u4EF6\u672A\u6CE8\u518C\", () => {\n const line = \"[Scripting] Component 'tlm:deprecated' was not registered in script but used on an item\";\n const res = translateBdsLog(line, \"zh-CN\");\n assert.equal(res.translated, true);\n assert.equal(res.ruleId, \"script-component-not-registered\");\n assert.ok(res.text.includes(\"\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u300Ctlm:deprecated\u300D\"));\n});\n\ntest(\"translateBdsLog: \u670D\u52A1\u7AEF\u751F\u547D\u5468\u671F\u4E0E\u7AEF\u53E3\", () => {\n assert.equal(translateBdsLog(\"Server started.\", \"zh-CN\").text, \"[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002\");\n assert.equal(translateBdsLog(\"Stopping server...\", \"zh-CN\").text, \"[\u670D\u52A1\u7AEF] \u6B63\u5728\u5173\u95ED\u670D\u52A1\u7AEF...\");\n assert.equal(translateBdsLog(\"Quit correctly\", \"zh-CN\").text, \"[\u670D\u52A1\u7AEF] \u670D\u52A1\u7AEF\u5DF2\u6B63\u5E38\u5B89\u5168\u9000\u51FA\u3002\");\n assert.equal(\n translateBdsLog(\"IPv4 supported, port: 19132: Used for gameplay and LAN discovery\", \"zh-CN\").text,\n \"[\u7F51\u7EDC] IPv4 \u6E38\u620F\u4E0E\u5C40\u57DF\u7F51\u53D1\u73B0\u7AEF\u53E3: 19132 (UDP)\"\n );\n assert.equal(\n translateBdsLog(\"Allow list is enabled but contains no entries.\", \"zh-CN\").text,\n \"[\u767D\u540D\u5355\u8B66\u544A] \u767D\u540D\u5355\u529F\u80FD\u5DF2\u5F00\u542F\u4F46\u540D\u5355\u4E3A\u7A7A\uFF01\u9664\u7BA1\u7406\u5458\u5916\u5176\u4ED6\u73A9\u5BB6\u5C06\u65E0\u6CD5\u52A0\u5165\u670D\u52A1\u5668\u3002\"\n );\n});\n\ntest(\"translateBdsLog: \u73A9\u5BB6\u52A0\u5165\u4E0E\u79BB\u5F00\", () => {\n const join = translateBdsLog(\"Player connected: Steve, xuid: 2535412345678901\", \"zh-CN\");\n assert.equal(join.text, \"[\u73A9\u5BB6\u8FDE\u63A5] \u73A9\u5BB6 Steve \u5DF2\u52A0\u5165\u4E16\u754C (XUID: 2535412345678901)\");\n\n const leave = translateBdsLog(\"Player disconnected: Steve, xuid: 2535412345678901\", \"zh-CN\");\n assert.equal(leave.text, \"[\u73A9\u5BB6\u65AD\u5F00] \u73A9\u5BB6 Steve \u5DF2\u79BB\u5F00\u4E16\u754C (XUID: 2535412345678901)\");\n});\n\ntest(\"translateBdsLog: \u672A\u5339\u914D\u884C\u539F\u6837\u8FD4\u56DE\", () => {\n const plain = \"A custom line that has no translation rule.\";\n const res = translateBdsLog(plain, \"zh-CN\");\n assert.equal(res.translated, false);\n assert.equal(res.text, plain);\n});\n\ntest(\"interpolateRegexTemplate & applyRuleReplacement\", () => {\n const m = \"Hello world 123\".match(/Hello (\\w+) (\\d+)/);\n assert.ok(m);\n const out = interpolateRegexTemplate(m, \"Greeting $1 with id $2\");\n assert.equal(out, \"Greeting world with id 123\");\n\n const replaced = applyRuleReplacement(\n \"Warning: player Steve did action 5\",\n /Warning: player (\\w+) did action (\\d+)/,\n \"\u8B66\u544A: \u73A9\u5BB6 $1 \u89E6\u53D1\u4E86\u884C\u4E3A $2\"\n );\n assert.equal(replaced, \"\u8B66\u544A: \u73A9\u5BB6 Steve \u89E6\u53D1\u4E86\u884C\u4E3A 5\");\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/logs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAa5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAE/C,wDAAwD;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+BhG,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CA6C9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAG/F;AAED,qDAAqD;AACrD,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AASD,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxD;AAuBD,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS/D;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,UAAU,EAAE,CA+BtE;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EASnC,CAAC;AASF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAM3D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA+BD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAW/C;AAwBD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D"}
|
package/dist/logs.js
CHANGED
|
@@ -12,7 +12,8 @@ import path from "node:path";
|
|
|
12
12
|
import {
|
|
13
13
|
getCompiledLogFilter,
|
|
14
14
|
shouldDropForDisk,
|
|
15
|
-
shouldDropForDisplay
|
|
15
|
+
shouldDropForDisplay,
|
|
16
|
+
transformLogEntry
|
|
16
17
|
} from "./log-filter.js";
|
|
17
18
|
import { c, highlightLogLine } from "./theme.js";
|
|
18
19
|
import { ROOT } from "./runtime.js";
|
|
@@ -46,7 +47,7 @@ function pushLog(text, source, level) {
|
|
|
46
47
|
if (embedded) lvl = embedded;
|
|
47
48
|
body = stripBdsLogPrefix(text);
|
|
48
49
|
}
|
|
49
|
-
const
|
|
50
|
+
const rawEntry = { time: /* @__PURE__ */ new Date(), text: body, source, level: lvl };
|
|
50
51
|
const filter = getCompiledLogFilter((src) => {
|
|
51
52
|
try {
|
|
52
53
|
const sink2 = sinkFor("system");
|
|
@@ -61,16 +62,18 @@ function pushLog(text, source, level) {
|
|
|
61
62
|
} catch {
|
|
62
63
|
}
|
|
63
64
|
});
|
|
64
|
-
const dropDisplay = shouldDropForDisplay(
|
|
65
|
-
const dropDisk = shouldDropForDisk(
|
|
65
|
+
const dropDisplay = shouldDropForDisplay(rawEntry, filter);
|
|
66
|
+
const dropDisk = shouldDropForDisk(rawEntry, filter);
|
|
67
|
+
const { entry: transformedEntry } = transformLogEntry(rawEntry, filter);
|
|
66
68
|
if (!dropDisplay) {
|
|
67
|
-
buffer.pushDirect(
|
|
69
|
+
buffer.pushDirect(transformedEntry.text, source, lvl);
|
|
68
70
|
}
|
|
69
71
|
if (dropDisk) return;
|
|
70
72
|
const sink = sinkFor(source);
|
|
71
73
|
if (!sink) return;
|
|
72
74
|
try {
|
|
73
|
-
|
|
75
|
+
const diskEntry = filter.applyTo === "all" ? { ...rawEntry, text: transformedEntry.text } : rawEntry;
|
|
76
|
+
sink.write(diskEntry, formatLogLine(diskEntry, false));
|
|
74
77
|
} catch {
|
|
75
78
|
}
|
|
76
79
|
}
|
|
@@ -210,7 +213,10 @@ function formatLog(l) {
|
|
|
210
213
|
const level = resolveDisplayLevel(l);
|
|
211
214
|
const lvl = levelTag(level);
|
|
212
215
|
const src = formatSourceTag(l.source);
|
|
213
|
-
const
|
|
216
|
+
const body = l.source === "bds" ? stripBdsLogPrefix(l.text) : l.text;
|
|
217
|
+
const filter = getCompiledLogFilter();
|
|
218
|
+
const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);
|
|
219
|
+
const txt = highlightLogLine(entry.text);
|
|
214
220
|
return `${ts} ${src} ${lvl} ${txt}`;
|
|
215
221
|
}
|
|
216
222
|
function charWidth(ch) {
|