@sfmc-bds/bds-tools 0.2.0-beta.10 → 0.2.0-beta.12

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 (48) hide show
  1. package/dist/bds-manager.d.ts.map +1 -1
  2. package/dist/bds-manager.js +12 -1
  3. package/dist/bds-manager.js.map +2 -2
  4. package/dist/check-update.d.ts.map +1 -1
  5. package/dist/check-update.js +6 -5
  6. package/dist/check-update.js.map +2 -2
  7. package/dist/cli-pack-manager.js +11 -1
  8. package/dist/cli-pack-manager.js.map +2 -2
  9. package/dist/dependency-negotiator.d.ts +73 -0
  10. package/dist/dependency-negotiator.d.ts.map +1 -0
  11. package/dist/dependency-negotiator.js +151 -0
  12. package/dist/dependency-negotiator.js.map +7 -0
  13. package/dist/dependency-negotiator.test.js +120 -0
  14. package/dist/dependency-negotiator.test.js.map +7 -0
  15. package/dist/fsx.d.ts +15 -7
  16. package/dist/fsx.d.ts.map +1 -1
  17. package/dist/fsx.js +67 -8
  18. package/dist/fsx.js.map +2 -2
  19. package/dist/fsx.test.js +60 -0
  20. package/dist/fsx.test.js.map +7 -0
  21. package/dist/level-dat.d.ts +87 -0
  22. package/dist/level-dat.d.ts.map +1 -0
  23. package/dist/level-dat.js +326 -0
  24. package/dist/level-dat.js.map +7 -0
  25. package/dist/level-dat.test.js +125 -0
  26. package/dist/level-dat.test.js.map +7 -0
  27. package/dist/pack-manager.d.ts +18 -6
  28. package/dist/pack-manager.d.ts.map +1 -1
  29. package/dist/pack-manager.js +73 -24
  30. package/dist/pack-manager.js.map +2 -2
  31. package/dist/rollback.d.ts.map +1 -1
  32. package/dist/rollback.js +2 -2
  33. package/dist/rollback.js.map +2 -2
  34. package/dist/server-properties-i18n.d.ts +17 -0
  35. package/dist/server-properties-i18n.d.ts.map +1 -0
  36. package/dist/server-properties-i18n.js +197 -0
  37. package/dist/server-properties-i18n.js.map +7 -0
  38. package/dist/server-properties.d.ts +22 -0
  39. package/dist/server-properties.d.ts.map +1 -1
  40. package/dist/server-properties.js +126 -1
  41. package/dist/server-properties.js.map +2 -2
  42. package/dist/server-properties.test.js +127 -0
  43. package/dist/server-properties.test.js.map +7 -0
  44. package/dist/world-packs.d.ts +57 -1
  45. package/dist/world-packs.d.ts.map +1 -1
  46. package/dist/world-packs.js +159 -1
  47. package/dist/world-packs.js.map +2 -2
  48. package/package.json +6 -3
@@ -0,0 +1,197 @@
1
+ const SERVER_PROPERTIES_DOCS_ZH_CN = {
2
+ "server-name": {
3
+ desc: "\u670D\u52A1\u5668\u540D\u79F0\uFF08\u663E\u793A\u5728\u5BA2\u6237\u7AEF\u5C40\u57DF\u7F51/\u597D\u53CB\u5217\u8868\u4E2D\uFF09",
4
+ values: "\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u8BF7\u52FF\u5305\u542B\u5206\u53F7 ;\uFF09"
5
+ },
6
+ "gamemode": {
7
+ desc: "\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u4E16\u754C\u65F6\u7684\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F",
8
+ values: "survival (\u751F\u5B58) | creative (\u521B\u9020) | adventure (\u5192\u9669)"
9
+ },
10
+ "force-gamemode": {
11
+ desc: "\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u6BCF\u6B21\u91CD\u65B0\u8FDE\u63A5\u65F6\u90FD\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F",
12
+ values: "true (\u6BCF\u6B21\u8FDB\u670D\u5F3A\u5236\u8F6C\u4E3A\u9ED8\u8BA4\u6A21\u5F0F) | false (\u4FDD\u7559\u73A9\u5BB6\u4E0A\u6B21\u79BB\u7EBF\u65F6\u7684\u6A21\u5F0F)"
13
+ },
14
+ "difficulty": {
15
+ desc: "\u6E38\u620F\u4E16\u754C\u7684\u9ED8\u8BA4\u96BE\u5EA6",
16
+ values: "peaceful (\u548C\u5E73) | easy (\u7B80\u5355) | normal (\u666E\u901A) | hard (\u56F0\u96BE)"
17
+ },
18
+ "allow-cheats": {
19
+ desc: "\u662F\u5426\u5141\u8BB8\u5728\u63A7\u5236\u53F0\u6216\u6E38\u620F\u5185\u4F7F\u7528\u7BA1\u7406\u5458\u6307\u4EE4\uFF08\u4F5C\u5F0A\u6A21\u5F0F\uFF09",
20
+ values: "true | false",
21
+ tip: "\u82E5\u5F00\u542F\u6B64\u9879\uFF0C\u52A0\u5165\u8BE5\u4E16\u754C\u7684\u73A9\u5BB6\u5C06\u65E0\u6CD5\u83B7\u5F97 Xbox \u6210\u5C31"
22
+ },
23
+ "max-players": {
24
+ desc: "\u5141\u8BB8\u540C\u65F6\u5728\u7EBF\u7684\u6700\u5927\u73A9\u5BB6\u6570\u91CF\u9650\u5236",
25
+ values: "\u6B63\u6574\u6570\uFF08\u5982 10\u300120\uFF09"
26
+ },
27
+ "online-mode": {
28
+ desc: "\u662F\u5426\u5F00\u542F\u5FAE\u8F6F Xbox Live \u6B63\u7248\u8EAB\u4EFD\u9A8C\u8BC1",
29
+ values: "true (\u4EC5\u5141\u8BB8\u6B63\u7248\u5FAE\u8F6F\u8D26\u53F7\u767B\u5F55) | false (\u5141\u8BB8\u79BB\u7EBF\u514D\u767B\u5F55\u8FDE\u63A5\uFF0C\u4F46\u6613\u53D7\u5047\u4EBA\u653B\u51FB)",
30
+ tip: "\u516C\u7F51\u670D\u52A1\u5668\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true \u4EE5\u9632\u6B62\u6076\u610F\u4F2A\u9020\u8EAB\u4EFD"
31
+ },
32
+ "white-list": {
33
+ desc: "\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u90E8\u5206\u7248\u672C\u5BF9\u5E94 allow-list\uFF09",
34
+ values: "true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)"
35
+ },
36
+ "allow-list": {
37
+ desc: "\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u9700\u914D\u5408 allowlist.json \u4F7F\u7528\uFF09",
38
+ values: "true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)"
39
+ },
40
+ "server-port": {
41
+ desc: "\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv4 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3",
42
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19132\uFF09"
43
+ },
44
+ "server-portv6": {
45
+ desc: "\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv6 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3",
46
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19133\uFF09"
47
+ },
48
+ "enable-lan-visibility": {
49
+ desc: "\u662F\u5426\u5411\u5C40\u57DF\u7F51\u5E7F\u64AD\u672C\u670D\u52A1\u5668\uFF08\u4F7F\u540C\u5C40\u57DF\u7F51\u73A9\u5BB6\u80FD\u5728\u5BA2\u6237\u7AEF\u300C\u597D\u53CB\u300D\u5217\u8868\u4E2D\u76F4\u63A5\u53D1\u73B0\uFF09",
50
+ values: "true | false"
51
+ },
52
+ "view-distance": {
53
+ desc: "\u670D\u52A1\u7AEF\u5411\u5BA2\u6237\u7AEF\u53D1\u9001\u5730\u56FE\u533A\u5757\u7684\u6700\u5927\u89C6\u8DDD\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09",
54
+ values: "\u6B63\u6574\u6570\uFF08\u5EFA\u8BAE 12 ~ 32\uFF0C\u6570\u503C\u8D8A\u5927\u7F51\u7EDC\u4E0E\u5185\u5B58\u6D88\u8017\u8D8A\u9AD8\uFF09"
55
+ },
56
+ "tick-distance": {
57
+ desc: "\u4E16\u754C\u5B9E\u4F53\u903B\u8F91\u4E0E\u65B9\u5757\u66F4\u65B0\u7684\u6A21\u62DF\u8BA1\u7B97\u8DDD\u79BB\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09",
58
+ values: "4 ~ 12\uFF08\u6570\u503C\u8D8A\u5C0F\u670D\u52A1\u5668\u6027\u80FD\u8D8A\u597D\uFF0C\u4F4E\u914D\u673A\u578B\u63A8\u8350 4\uFF09"
59
+ },
60
+ "player-idle-timeout": {
61
+ desc: "\u73A9\u5BB6\u6302\u673A\u65E0\u64CD\u4F5C\u81EA\u52A8\u8E22\u51FA\u8D85\u65F6\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u5206\u949F\uFF09",
62
+ values: "0 (\u6C38\u4E0D\u8E22\u51FA) \u6216\u5927\u4E8E 0 \u7684\u6574\u6570"
63
+ },
64
+ "max-threads": {
65
+ desc: "BDS \u8FD0\u884C\u53EF\u4F7F\u7528\u7684\u6700\u5927\u5DE5\u4F5C\u7EBF\u7A0B\u6570",
66
+ values: "0 (\u7531\u670D\u52A1\u7AEF\u6839\u636E CPU \u6838\u5FC3\u6570\u81EA\u52A8\u5206\u914D) \u6216\u6307\u5B9A\u7EBF\u7A0B\u6570"
67
+ },
68
+ "level-name": {
69
+ desc: "\u8981\u52A0\u8F7D\u7684\u4E16\u754C\u5B58\u6863\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u5BF9\u5E94 worlds/ \u76EE\u5F55\u4E0B\u7684\u5B50\u6587\u4EF6\u5939\uFF09",
70
+ values: "\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u9ED8\u8BA4\uFF1ABedrock level\uFF09"
71
+ },
72
+ "level-seed": {
73
+ desc: "\u5168\u65B0\u4E16\u754C\u751F\u6210\u65F6\u7684\u968F\u673A\u79CD\u5B50",
74
+ values: "\u4EFB\u610F\u6570\u5B57\u6216\u6587\u672C\uFF08\u7559\u7A7A\u5219\u6BCF\u6B21\u65B0\u5EFA\u4E16\u754C\u968F\u673A\u751F\u6210\uFF09"
75
+ },
76
+ "default-player-permission-level": {
77
+ desc: "\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u65F6\u7684\u9ED8\u8BA4\u6743\u9650\u7EA7\u522B",
78
+ values: "visitor (\u8BBF\u5BA2\uFF0C\u4E0D\u53EF\u7834\u574F\u6216\u4EA4\u4E92) | member (\u666E\u901A\u6210\u5458) | operator (\u64CD\u4F5C\u5458)"
79
+ },
80
+ "texturepack-required": {
81
+ desc: "\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u4E0B\u8F7D\u670D\u52A1\u5668\u6307\u5B9A\u7684\u6750\u8D28\u8D44\u6E90\u5305\u540E\u624D\u80FD\u52A0\u5165",
82
+ values: "true (\u5FC5\u987B\u4E0B\u8F7D) | false (\u53EF\u9009\u4E0B\u8F7D)"
83
+ },
84
+ "content-log-console-output-enabled": {
85
+ desc: "\u662F\u5426\u5C06\u5185\u5BB9\u65E5\u5FD7\uFF08\u6A21\u7EC4/\u884C\u4E3A\u5305\u89E3\u6790\u8B66\u544A\u3001SAPI \u811A\u672C\u62A5\u9519\u4E0E console.log\uFF09\u5B9E\u65F6\u8F93\u51FA\u5230\u63A7\u5236\u53F0",
86
+ values: "true | false",
87
+ tip: "\u5F00\u53D1\u6216\u8C03\u8BD5\u6A21\u7EC4\u65F6\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true\uFF0C\u4EE5\u4FBF\u5373\u65F6\u67E5\u770B\u9519\u8BEF"
88
+ },
89
+ "compression-threshold": {
90
+ desc: "\u7F51\u7EDC\u6570\u636E\u5305\u542F\u7528\u538B\u7F29\u7684\u6700\u5C0F\u5B57\u8282\u9608\u503C",
91
+ values: "0 (\u5168\u90E8\u538B\u7F29) ~ 65535 \u5B57\u8282\uFF081.20+ \u9ED8\u8BA4\u901A\u5E38\u4E3A 1\uFF09"
92
+ },
93
+ "compression-algorithm": {
94
+ desc: "\u7F51\u7EDC\u4F20\u8F93\u6570\u636E\u5305\u7684\u538B\u7F29\u7B97\u6CD5",
95
+ values: "zlib (\u6807\u51C6\u9AD8\u538B\u7F29\u6BD4) | snappy (\u9AD8\u6027\u80FD\u4F4E\u5EF6\u8FDF\uFF0CCPU \u5F00\u9500\u5C0F)"
96
+ },
97
+ "server-authoritative-movement": {
98
+ desc: "\u73A9\u5BB6\u79FB\u52A8\u9A8C\u8BC1\u6743\u5A01\u6A21\u5F0F",
99
+ values: "server-auth (\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A) | client-auth (\u5BA2\u6237\u7AEF\u6743\u5A01)"
100
+ },
101
+ "player-movement-score-threshold": {
102
+ desc: "\u73A9\u5BB6\u79FB\u52A8\u5F02\u5E38\u88AB\u5224\u5B9A\u4E3A\u4F5C\u5F0A\u7684\u7D2F\u8BA1\u5F02\u5E38\u5206\u9608\u503C",
103
+ values: "\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09"
104
+ },
105
+ "player-movement-action-direction-threshold": {
106
+ desc: "\u73A9\u5BB6\u653B\u51FB\u6216\u7834\u574F\u52A8\u4F5C\u4E0E\u89C6\u7EBF\u671D\u5411\u5939\u89D2\u504F\u5DEE\u7684\u5224\u5B9A\u9608\u503C",
107
+ values: "\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.85\uFF09"
108
+ },
109
+ "player-movement-distance-threshold": {
110
+ desc: "\u73A9\u5BB6\u5355\u6B21\u4F4D\u79FB\u8D85\u51FA\u6B63\u5E38\u8303\u56F4\u7684\u5224\u5B9A\u9608\u503C",
111
+ values: "\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.3\uFF09"
112
+ },
113
+ "player-movement-duration-threshold-in-ms": {
114
+ desc: "\u79FB\u52A8\u5F02\u5E38\u5224\u5B9A\u91C7\u6837\u7684\u6ED1\u52A8\u65F6\u95F4\u7A97\u53E3\uFF08\u5355\u4F4D\uFF1A\u6BEB\u79D2\uFF09",
115
+ values: "\u6574\u6570\uFF08\u9ED8\u8BA4 500\uFF09"
116
+ },
117
+ "correct-player-movement": {
118
+ desc: "\u5F53\u68C0\u6D4B\u5230\u73A9\u5BB6\u79FB\u52A8\u4F5C\u5F0A\u6216\u8D85\u6807\u65F6\uFF0C\u662F\u5426\u5F3A\u5236\u5C06\u5176\u62C9\u56DE\u5408\u6CD5\u4F4D\u7F6E\uFF08\u9632\u98DE\u5929/\u52A0\u901F\uFF09",
119
+ values: "true (\u5F3A\u5236\u56DE\u62C9\u7EA0\u6B63) | false (\u4EC5\u5728\u540E\u53F0\u8BB0\u5F55\u8B66\u544A)"
120
+ },
121
+ "server-authoritative-block-breaking": {
122
+ desc: "\u65B9\u5757\u7834\u574F\u52A8\u4F5C\u662F\u5426\u7531\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A\uFF08\u9632\u6B62\u53D8\u901F\u5237\u65B9\u5757\u7B49\u4F5C\u5F0A\u884C\u4E3A\uFF09",
123
+ values: "client-auth | server-auth"
124
+ },
125
+ "chat-restriction": {
126
+ desc: "\u804A\u5929\u8FC7\u6EE4\u9650\u5236\u7B56\u7565",
127
+ values: "None (\u65E0\u9650\u5236) | Dropped (\u9759\u9ED8\u4E22\u5F03\u8FDD\u89C4\u5185\u5BB9) | Disabled (\u5B8C\u5168\u7981\u7528\u804A\u5929)"
128
+ },
129
+ "disable-player-interaction": {
130
+ desc: "\u662F\u5426\u7981\u7528\u9759\u9ED8\u4EA4\u4E92\u68C0\u6D4B\uFF08\u7528\u4E8E\u6392\u67E5\u7F51\u7EDC\u5EF6\u8FDF\u6216\u9632\u5FEB\u901F\u4EA4\u4E92\uFF09",
131
+ values: "true | false"
132
+ },
133
+ "client-side-chunk-generation-enabled": {
134
+ desc: "\u662F\u5426\u5141\u8BB8\u5BA2\u6237\u7AEF\u5728\u672C\u5730\u751F\u6210\u5C1A\u672A\u52A0\u8F7D\u7684\u5730\u5F62\u533A\u5757\uFF08\u52A0\u5FEB\u957F\u8DDD\u79BB\u63A2\u7D22\u65F6\u7684\u89C6\u89C9\u52A0\u8F7D\u901F\u5EA6\uFF09",
135
+ values: "true (\u5141\u8BB8\u5BA2\u6237\u7AEF\u672C\u5730\u9884\u751F\u6210) | false (\u5168\u90E8\u7531\u670D\u52A1\u7AEF\u751F\u6210\u5E76\u4F20\u8F93)"
136
+ },
137
+ "block-network-ids-are-hashes": {
138
+ desc: "\u65B9\u5757\u5728\u7F51\u7EDC\u4F20\u8F93\u4E2D\u7684\u552F\u4E00\u6807\u8BC6\u662F\u5426\u91C7\u7528\u54C8\u5E0C\u503C",
139
+ values: "true | false"
140
+ },
141
+ "disable-persona": {
142
+ desc: "\u662F\u5426\u7981\u7528\u4E2A\u6027\u5316\u88C5\u626E/\u89D2\u8272\u521B\u5EFA\u5668\uFF08Persona \u76AE\u80A4\uFF09",
143
+ values: "true (\u5F3A\u5236\u4F7F\u7528\u7ECF\u5178\u76AE\u80A4) | false (\u5141\u8BB8\u4F7F\u7528\u5B98\u65B9\u634F\u8138\u89D2\u8272)"
144
+ },
145
+ "disable-custom-skins": {
146
+ desc: "\u662F\u5426\u7981\u7528\u73A9\u5BB6\u4E0A\u4F20\u7684\u81EA\u5B9A\u4E49\u7ECF\u5178\u76AE\u80A4\uFF08\u9632\u6B62\u6076\u610F\u6216\u900F\u660E\u76AE\u80A4\uFF09",
147
+ values: "true (\u7981\u7528\u81EA\u5B9A\u4E49\u76AE\u80A4) | false (\u5141\u8BB8\u81EA\u5B9A\u4E49\u76AE\u80A4)"
148
+ },
149
+ "emit-server-telemetry": {
150
+ desc: "\u662F\u5426\u5411 Mojang \u53D1\u9001\u670D\u52A1\u5668\u9065\u6D4B\u4E0E\u8FD0\u884C\u5065\u5EB7\u8BCA\u65AD\u6570\u636E",
151
+ values: "true | false",
152
+ tip: "\u4F7F\u7528\u672C\u5E73\u53F0\u65F6\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA \u534F\u8BAE\uFF0C\u6309\u534F\u8BAE\u4FDD\u6301\u542F\u7528"
153
+ },
154
+ "server-build-radius-ratio": {
155
+ desc: "\u5141\u8BB8\u73A9\u5BB6\u5EFA\u9020\u548C\u4EA4\u4E92\u7684\u4E16\u754C\u533A\u57DF\u534A\u5F84\u6BD4\u4F8B",
156
+ values: "Disabled (\u65E0\u9650\u5236) \u6216 0.0 ~ 1.0 \u7684\u6D6E\u70B9\u6570"
157
+ },
158
+ "allow-outbound-script-debugging": {
159
+ desc: "\u662F\u5426\u5141\u8BB8\u670D\u52A1\u7AEF\u811A\u672C\u4E3B\u52A8\u8FDE\u63A5\u5916\u90E8\u8C03\u8BD5\u5668\uFF08\u5141\u8BB8 /script debugger connect \u6307\u4EE4\uFF09",
160
+ values: "true | false",
161
+ tip: "\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED"
162
+ },
163
+ "allow-inbound-script-debugging": {
164
+ desc: "\u662F\u5426\u5141\u8BB8\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\u4E3B\u52A8\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF08\u5141\u8BB8 /script debugger listen \u6307\u4EE4\uFF09",
165
+ values: "true | false",
166
+ tip: "\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED"
167
+ },
168
+ "force-inbound-debug-port": {
169
+ desc: "\u811A\u672C\u8C03\u8BD5\u5668\u76D1\u542C\u7684\u4E13\u5C5E\u7F51\u7EDC\u7AEF\u53E3",
170
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19144\uFF09"
171
+ },
172
+ "script-debugger-auto-attach": {
173
+ desc: "\u4E16\u754C\u52A0\u8F7D\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u8FDE\u63A5\u6216\u76D1\u542C\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668",
174
+ values: "disabled (\u4E0D\u81EA\u52A8\u9644\u52A0) | connect (\u81EA\u52A8\u5411\u5916\u8FDE\u63A5) | listen (\u81EA\u52A8\u5F00\u542F\u7AEF\u53E3\u76D1\u542C)"
175
+ },
176
+ "script-debugger-auto-attach-connect-address": {
177
+ desc: "\u5F53 auto-attach \u8BBE\u4E3A connect \u65F6\uFF0C\u5C1D\u8BD5\u8FDE\u63A5\u7684\u76EE\u6807\u8C03\u8BD5\u5668\u4E3B\u673A\u4E0E\u7AEF\u53E3",
178
+ values: "ip:port\uFF08\u4F8B\u5982 localhost:19144\uFF09"
179
+ },
180
+ "websocket-retry-time": {
181
+ desc: "\u8FDE\u63A5\u5916\u90E8 WebSocket \u670D\u52A1\u5668\u65AD\u5F00\u540E\u7684\u81EA\u52A8\u91CD\u8BD5\u95F4\u9694\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09",
182
+ values: "\u6B63\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09"
183
+ }
184
+ };
185
+ function getServerPropertyDoc(key, locale = "zh-CN") {
186
+ const normalizedKey = key.trim().toLowerCase();
187
+ const normalizedLocale = locale.toLowerCase();
188
+ if (normalizedLocale === "zh" || normalizedLocale.startsWith("zh-")) {
189
+ return SERVER_PROPERTIES_DOCS_ZH_CN[normalizedKey];
190
+ }
191
+ return void 0;
192
+ }
193
+ export {
194
+ SERVER_PROPERTIES_DOCS_ZH_CN,
195
+ getServerPropertyDoc
196
+ };
197
+ //# sourceMappingURL=server-properties-i18n.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server-properties-i18n.ts"],
4
+ "sourcesContent": ["/**\n * server-properties-i18n.ts \u2014 BDS server.properties \u591A\u8BED\u8A00\u6CE8\u91CA\u5B57\u5178\n */\n\nexport interface ServerPropertyDoc {\n /** \u4E2D\u6587\u529F\u80FD\u6982\u8FF0 */\n desc: string;\n /** \u5408\u6CD5\u53D6\u503C\u4E0E\u679A\u4E3E\u8BF4\u660E */\n values?: string;\n /** \u907F\u5751\u3001\u6027\u80FD\u6216\u5B89\u5168\u6027\u63D0\u793A */\n tip?: string;\n}\n\nexport const SERVER_PROPERTIES_DOCS_ZH_CN: Record<string, ServerPropertyDoc> = {\n \"server-name\": {\n desc: \"\u670D\u52A1\u5668\u540D\u79F0\uFF08\u663E\u793A\u5728\u5BA2\u6237\u7AEF\u5C40\u57DF\u7F51/\u597D\u53CB\u5217\u8868\u4E2D\uFF09\",\n values: \"\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u8BF7\u52FF\u5305\u542B\u5206\u53F7 ;\uFF09\",\n },\n \"gamemode\": {\n desc: \"\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u4E16\u754C\u65F6\u7684\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F\",\n values: \"survival (\u751F\u5B58) | creative (\u521B\u9020) | adventure (\u5192\u9669)\",\n },\n \"force-gamemode\": {\n desc: \"\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u6BCF\u6B21\u91CD\u65B0\u8FDE\u63A5\u65F6\u90FD\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F\",\n values: \"true (\u6BCF\u6B21\u8FDB\u670D\u5F3A\u5236\u8F6C\u4E3A\u9ED8\u8BA4\u6A21\u5F0F) | false (\u4FDD\u7559\u73A9\u5BB6\u4E0A\u6B21\u79BB\u7EBF\u65F6\u7684\u6A21\u5F0F)\",\n },\n \"difficulty\": {\n desc: \"\u6E38\u620F\u4E16\u754C\u7684\u9ED8\u8BA4\u96BE\u5EA6\",\n values: \"peaceful (\u548C\u5E73) | easy (\u7B80\u5355) | normal (\u666E\u901A) | hard (\u56F0\u96BE)\",\n },\n \"allow-cheats\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5728\u63A7\u5236\u53F0\u6216\u6E38\u620F\u5185\u4F7F\u7528\u7BA1\u7406\u5458\u6307\u4EE4\uFF08\u4F5C\u5F0A\u6A21\u5F0F\uFF09\",\n values: \"true | false\",\n tip: \"\u82E5\u5F00\u542F\u6B64\u9879\uFF0C\u52A0\u5165\u8BE5\u4E16\u754C\u7684\u73A9\u5BB6\u5C06\u65E0\u6CD5\u83B7\u5F97 Xbox \u6210\u5C31\",\n },\n \"max-players\": {\n desc: \"\u5141\u8BB8\u540C\u65F6\u5728\u7EBF\u7684\u6700\u5927\u73A9\u5BB6\u6570\u91CF\u9650\u5236\",\n values: \"\u6B63\u6574\u6570\uFF08\u5982 10\u300120\uFF09\",\n },\n \"online-mode\": {\n desc: \"\u662F\u5426\u5F00\u542F\u5FAE\u8F6F Xbox Live \u6B63\u7248\u8EAB\u4EFD\u9A8C\u8BC1\",\n values: \"true (\u4EC5\u5141\u8BB8\u6B63\u7248\u5FAE\u8F6F\u8D26\u53F7\u767B\u5F55) | false (\u5141\u8BB8\u79BB\u7EBF\u514D\u767B\u5F55\u8FDE\u63A5\uFF0C\u4F46\u6613\u53D7\u5047\u4EBA\u653B\u51FB)\",\n tip: \"\u516C\u7F51\u670D\u52A1\u5668\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true \u4EE5\u9632\u6B62\u6076\u610F\u4F2A\u9020\u8EAB\u4EFD\",\n },\n \"white-list\": {\n desc: \"\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u90E8\u5206\u7248\u672C\u5BF9\u5E94 allow-list\uFF09\",\n values: \"true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)\",\n },\n \"allow-list\": {\n desc: \"\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u9700\u914D\u5408 allowlist.json \u4F7F\u7528\uFF09\",\n values: \"true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)\",\n },\n \"server-port\": {\n desc: \"\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv4 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19132\uFF09\",\n },\n \"server-portv6\": {\n desc: \"\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv6 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19133\uFF09\",\n },\n \"enable-lan-visibility\": {\n desc: \"\u662F\u5426\u5411\u5C40\u57DF\u7F51\u5E7F\u64AD\u672C\u670D\u52A1\u5668\uFF08\u4F7F\u540C\u5C40\u57DF\u7F51\u73A9\u5BB6\u80FD\u5728\u5BA2\u6237\u7AEF\u300C\u597D\u53CB\u300D\u5217\u8868\u4E2D\u76F4\u63A5\u53D1\u73B0\uFF09\",\n values: \"true | false\",\n },\n \"view-distance\": {\n desc: \"\u670D\u52A1\u7AEF\u5411\u5BA2\u6237\u7AEF\u53D1\u9001\u5730\u56FE\u533A\u5757\u7684\u6700\u5927\u89C6\u8DDD\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09\",\n values: \"\u6B63\u6574\u6570\uFF08\u5EFA\u8BAE 12 ~ 32\uFF0C\u6570\u503C\u8D8A\u5927\u7F51\u7EDC\u4E0E\u5185\u5B58\u6D88\u8017\u8D8A\u9AD8\uFF09\",\n },\n \"tick-distance\": {\n desc: \"\u4E16\u754C\u5B9E\u4F53\u903B\u8F91\u4E0E\u65B9\u5757\u66F4\u65B0\u7684\u6A21\u62DF\u8BA1\u7B97\u8DDD\u79BB\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09\",\n values: \"4 ~ 12\uFF08\u6570\u503C\u8D8A\u5C0F\u670D\u52A1\u5668\u6027\u80FD\u8D8A\u597D\uFF0C\u4F4E\u914D\u673A\u578B\u63A8\u8350 4\uFF09\",\n },\n \"player-idle-timeout\": {\n desc: \"\u73A9\u5BB6\u6302\u673A\u65E0\u64CD\u4F5C\u81EA\u52A8\u8E22\u51FA\u8D85\u65F6\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u5206\u949F\uFF09\",\n values: \"0 (\u6C38\u4E0D\u8E22\u51FA) \u6216\u5927\u4E8E 0 \u7684\u6574\u6570\",\n },\n \"max-threads\": {\n desc: \"BDS \u8FD0\u884C\u53EF\u4F7F\u7528\u7684\u6700\u5927\u5DE5\u4F5C\u7EBF\u7A0B\u6570\",\n values: \"0 (\u7531\u670D\u52A1\u7AEF\u6839\u636E CPU \u6838\u5FC3\u6570\u81EA\u52A8\u5206\u914D) \u6216\u6307\u5B9A\u7EBF\u7A0B\u6570\",\n },\n \"level-name\": {\n desc: \"\u8981\u52A0\u8F7D\u7684\u4E16\u754C\u5B58\u6863\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u5BF9\u5E94 worlds/ \u76EE\u5F55\u4E0B\u7684\u5B50\u6587\u4EF6\u5939\uFF09\",\n values: \"\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u9ED8\u8BA4\uFF1ABedrock level\uFF09\",\n },\n \"level-seed\": {\n desc: \"\u5168\u65B0\u4E16\u754C\u751F\u6210\u65F6\u7684\u968F\u673A\u79CD\u5B50\",\n values: \"\u4EFB\u610F\u6570\u5B57\u6216\u6587\u672C\uFF08\u7559\u7A7A\u5219\u6BCF\u6B21\u65B0\u5EFA\u4E16\u754C\u968F\u673A\u751F\u6210\uFF09\",\n },\n \"default-player-permission-level\": {\n desc: \"\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u65F6\u7684\u9ED8\u8BA4\u6743\u9650\u7EA7\u522B\",\n values: \"visitor (\u8BBF\u5BA2\uFF0C\u4E0D\u53EF\u7834\u574F\u6216\u4EA4\u4E92) | member (\u666E\u901A\u6210\u5458) | operator (\u64CD\u4F5C\u5458)\",\n },\n \"texturepack-required\": {\n desc: \"\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u4E0B\u8F7D\u670D\u52A1\u5668\u6307\u5B9A\u7684\u6750\u8D28\u8D44\u6E90\u5305\u540E\u624D\u80FD\u52A0\u5165\",\n values: \"true (\u5FC5\u987B\u4E0B\u8F7D) | false (\u53EF\u9009\u4E0B\u8F7D)\",\n },\n \"content-log-console-output-enabled\": {\n desc: \"\u662F\u5426\u5C06\u5185\u5BB9\u65E5\u5FD7\uFF08\u6A21\u7EC4/\u884C\u4E3A\u5305\u89E3\u6790\u8B66\u544A\u3001SAPI \u811A\u672C\u62A5\u9519\u4E0E console.log\uFF09\u5B9E\u65F6\u8F93\u51FA\u5230\u63A7\u5236\u53F0\",\n values: \"true | false\",\n tip: \"\u5F00\u53D1\u6216\u8C03\u8BD5\u6A21\u7EC4\u65F6\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true\uFF0C\u4EE5\u4FBF\u5373\u65F6\u67E5\u770B\u9519\u8BEF\",\n },\n \"compression-threshold\": {\n desc: \"\u7F51\u7EDC\u6570\u636E\u5305\u542F\u7528\u538B\u7F29\u7684\u6700\u5C0F\u5B57\u8282\u9608\u503C\",\n values: \"0 (\u5168\u90E8\u538B\u7F29) ~ 65535 \u5B57\u8282\uFF081.20+ \u9ED8\u8BA4\u901A\u5E38\u4E3A 1\uFF09\",\n },\n \"compression-algorithm\": {\n desc: \"\u7F51\u7EDC\u4F20\u8F93\u6570\u636E\u5305\u7684\u538B\u7F29\u7B97\u6CD5\",\n values: \"zlib (\u6807\u51C6\u9AD8\u538B\u7F29\u6BD4) | snappy (\u9AD8\u6027\u80FD\u4F4E\u5EF6\u8FDF\uFF0CCPU \u5F00\u9500\u5C0F)\",\n },\n \"server-authoritative-movement\": {\n desc: \"\u73A9\u5BB6\u79FB\u52A8\u9A8C\u8BC1\u6743\u5A01\u6A21\u5F0F\",\n values: \"server-auth (\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A) | client-auth (\u5BA2\u6237\u7AEF\u6743\u5A01)\",\n },\n \"player-movement-score-threshold\": {\n desc: \"\u73A9\u5BB6\u79FB\u52A8\u5F02\u5E38\u88AB\u5224\u5B9A\u4E3A\u4F5C\u5F0A\u7684\u7D2F\u8BA1\u5F02\u5E38\u5206\u9608\u503C\",\n values: \"\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09\",\n },\n \"player-movement-action-direction-threshold\": {\n desc: \"\u73A9\u5BB6\u653B\u51FB\u6216\u7834\u574F\u52A8\u4F5C\u4E0E\u89C6\u7EBF\u671D\u5411\u5939\u89D2\u504F\u5DEE\u7684\u5224\u5B9A\u9608\u503C\",\n values: \"\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.85\uFF09\",\n },\n \"player-movement-distance-threshold\": {\n desc: \"\u73A9\u5BB6\u5355\u6B21\u4F4D\u79FB\u8D85\u51FA\u6B63\u5E38\u8303\u56F4\u7684\u5224\u5B9A\u9608\u503C\",\n values: \"\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.3\uFF09\",\n },\n \"player-movement-duration-threshold-in-ms\": {\n desc: \"\u79FB\u52A8\u5F02\u5E38\u5224\u5B9A\u91C7\u6837\u7684\u6ED1\u52A8\u65F6\u95F4\u7A97\u53E3\uFF08\u5355\u4F4D\uFF1A\u6BEB\u79D2\uFF09\",\n values: \"\u6574\u6570\uFF08\u9ED8\u8BA4 500\uFF09\",\n },\n \"correct-player-movement\": {\n desc: \"\u5F53\u68C0\u6D4B\u5230\u73A9\u5BB6\u79FB\u52A8\u4F5C\u5F0A\u6216\u8D85\u6807\u65F6\uFF0C\u662F\u5426\u5F3A\u5236\u5C06\u5176\u62C9\u56DE\u5408\u6CD5\u4F4D\u7F6E\uFF08\u9632\u98DE\u5929/\u52A0\u901F\uFF09\",\n values: \"true (\u5F3A\u5236\u56DE\u62C9\u7EA0\u6B63) | false (\u4EC5\u5728\u540E\u53F0\u8BB0\u5F55\u8B66\u544A)\",\n },\n \"server-authoritative-block-breaking\": {\n desc: \"\u65B9\u5757\u7834\u574F\u52A8\u4F5C\u662F\u5426\u7531\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A\uFF08\u9632\u6B62\u53D8\u901F\u5237\u65B9\u5757\u7B49\u4F5C\u5F0A\u884C\u4E3A\uFF09\",\n values: \"client-auth | server-auth\",\n },\n \"chat-restriction\": {\n desc: \"\u804A\u5929\u8FC7\u6EE4\u9650\u5236\u7B56\u7565\",\n values: \"None (\u65E0\u9650\u5236) | Dropped (\u9759\u9ED8\u4E22\u5F03\u8FDD\u89C4\u5185\u5BB9) | Disabled (\u5B8C\u5168\u7981\u7528\u804A\u5929)\",\n },\n \"disable-player-interaction\": {\n desc: \"\u662F\u5426\u7981\u7528\u9759\u9ED8\u4EA4\u4E92\u68C0\u6D4B\uFF08\u7528\u4E8E\u6392\u67E5\u7F51\u7EDC\u5EF6\u8FDF\u6216\u9632\u5FEB\u901F\u4EA4\u4E92\uFF09\",\n values: \"true | false\",\n },\n \"client-side-chunk-generation-enabled\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5BA2\u6237\u7AEF\u5728\u672C\u5730\u751F\u6210\u5C1A\u672A\u52A0\u8F7D\u7684\u5730\u5F62\u533A\u5757\uFF08\u52A0\u5FEB\u957F\u8DDD\u79BB\u63A2\u7D22\u65F6\u7684\u89C6\u89C9\u52A0\u8F7D\u901F\u5EA6\uFF09\",\n values: \"true (\u5141\u8BB8\u5BA2\u6237\u7AEF\u672C\u5730\u9884\u751F\u6210) | false (\u5168\u90E8\u7531\u670D\u52A1\u7AEF\u751F\u6210\u5E76\u4F20\u8F93)\",\n },\n \"block-network-ids-are-hashes\": {\n desc: \"\u65B9\u5757\u5728\u7F51\u7EDC\u4F20\u8F93\u4E2D\u7684\u552F\u4E00\u6807\u8BC6\u662F\u5426\u91C7\u7528\u54C8\u5E0C\u503C\",\n values: \"true | false\",\n },\n \"disable-persona\": {\n desc: \"\u662F\u5426\u7981\u7528\u4E2A\u6027\u5316\u88C5\u626E/\u89D2\u8272\u521B\u5EFA\u5668\uFF08Persona \u76AE\u80A4\uFF09\",\n values: \"true (\u5F3A\u5236\u4F7F\u7528\u7ECF\u5178\u76AE\u80A4) | false (\u5141\u8BB8\u4F7F\u7528\u5B98\u65B9\u634F\u8138\u89D2\u8272)\",\n },\n \"disable-custom-skins\": {\n desc: \"\u662F\u5426\u7981\u7528\u73A9\u5BB6\u4E0A\u4F20\u7684\u81EA\u5B9A\u4E49\u7ECF\u5178\u76AE\u80A4\uFF08\u9632\u6B62\u6076\u610F\u6216\u900F\u660E\u76AE\u80A4\uFF09\",\n values: \"true (\u7981\u7528\u81EA\u5B9A\u4E49\u76AE\u80A4) | false (\u5141\u8BB8\u81EA\u5B9A\u4E49\u76AE\u80A4)\",\n },\n \"emit-server-telemetry\": {\n desc: \"\u662F\u5426\u5411 Mojang \u53D1\u9001\u670D\u52A1\u5668\u9065\u6D4B\u4E0E\u8FD0\u884C\u5065\u5EB7\u8BCA\u65AD\u6570\u636E\",\n values: \"true | false\",\n tip: \"\u4F7F\u7528\u672C\u5E73\u53F0\u65F6\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA \u534F\u8BAE\uFF0C\u6309\u534F\u8BAE\u4FDD\u6301\u542F\u7528\",\n },\n \"server-build-radius-ratio\": {\n desc: \"\u5141\u8BB8\u73A9\u5BB6\u5EFA\u9020\u548C\u4EA4\u4E92\u7684\u4E16\u754C\u533A\u57DF\u534A\u5F84\u6BD4\u4F8B\",\n values: \"Disabled (\u65E0\u9650\u5236) \u6216 0.0 ~ 1.0 \u7684\u6D6E\u70B9\u6570\",\n },\n \"allow-outbound-script-debugging\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u670D\u52A1\u7AEF\u811A\u672C\u4E3B\u52A8\u8FDE\u63A5\u5916\u90E8\u8C03\u8BD5\u5668\uFF08\u5141\u8BB8 /script debugger connect \u6307\u4EE4\uFF09\",\n values: \"true | false\",\n tip: \"\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED\",\n },\n \"allow-inbound-script-debugging\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\u4E3B\u52A8\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF08\u5141\u8BB8 /script debugger listen \u6307\u4EE4\uFF09\",\n values: \"true | false\",\n tip: \"\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED\",\n },\n \"force-inbound-debug-port\": {\n desc: \"\u811A\u672C\u8C03\u8BD5\u5668\u76D1\u542C\u7684\u4E13\u5C5E\u7F51\u7EDC\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19144\uFF09\",\n },\n \"script-debugger-auto-attach\": {\n desc: \"\u4E16\u754C\u52A0\u8F7D\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u8FDE\u63A5\u6216\u76D1\u542C\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\",\n values: \"disabled (\u4E0D\u81EA\u52A8\u9644\u52A0) | connect (\u81EA\u52A8\u5411\u5916\u8FDE\u63A5) | listen (\u81EA\u52A8\u5F00\u542F\u7AEF\u53E3\u76D1\u542C)\",\n },\n \"script-debugger-auto-attach-connect-address\": {\n desc: \"\u5F53 auto-attach \u8BBE\u4E3A connect \u65F6\uFF0C\u5C1D\u8BD5\u8FDE\u63A5\u7684\u76EE\u6807\u8C03\u8BD5\u5668\u4E3B\u673A\u4E0E\u7AEF\u53E3\",\n values: \"ip:port\uFF08\u4F8B\u5982 localhost:19144\uFF09\",\n },\n \"websocket-retry-time\": {\n desc: \"\u8FDE\u63A5\u5916\u90E8 WebSocket \u670D\u52A1\u5668\u65AD\u5F00\u540E\u7684\u81EA\u52A8\u91CD\u8BD5\u95F4\u9694\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09\",\n values: \"\u6B63\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09\",\n },\n};\n\n/**\n * \u6839\u636E\u5C5E\u6027 key \u548C\u76EE\u6807\u8BED\u8A00\u83B7\u53D6\u8BF4\u660E\u6587\u6863\n */\nexport function getServerPropertyDoc(key: string, locale: string = \"zh-CN\"): ServerPropertyDoc | undefined {\n const normalizedKey = key.trim().toLowerCase();\n const normalizedLocale = locale.toLowerCase();\n\n if (normalizedLocale === \"zh\" || normalizedLocale.startsWith(\"zh-\")) {\n return SERVER_PROPERTIES_DOCS_ZH_CN[normalizedKey];\n }\n return undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -9,4 +9,26 @@ export type ServerPropertiesLogger = {
9
9
  * @returns true = 本次新追加;false = 跳过
10
10
  */
11
11
  export declare function ensureEmitServerTelemetry(bdsRoot: string, logger?: ServerPropertiesLogger): boolean;
12
+ /**
13
+ * 解析并探测当前应当采用的 BDS 本地化语言代码(例如 zh-CN 或 en)。
14
+ */
15
+ export declare function resolveBdsLocale(rootDir?: string): string;
16
+ /**
17
+ * 纯函数:将 server.properties 文本中的注释替换为目标语言的结构化中文说明。
18
+ * 严格保留配置项的 key 与当前生效的 value。若遇到未收录的键或纯注释块,原样保留。
19
+ */
20
+ export declare function localizeServerPropertiesContent(text: string, locale?: string): {
21
+ content: string;
22
+ modified: boolean;
23
+ };
24
+ export interface LocalizeServerPropertiesOptions {
25
+ locale?: string;
26
+ rootDir?: string;
27
+ logger?: ServerPropertiesLogger;
28
+ }
29
+ /**
30
+ * 对 `<bdsRoot>/server.properties` 中的注释执行本地化重写。
31
+ * @returns true = 本次成功重写并保存;false = 跳过或无改动
32
+ */
33
+ export declare function localizeServerProperties(bdsRoot: string, options?: LocalizeServerPropertiesOptions): boolean;
12
34
  //# sourceMappingURL=server-properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-properties.d.ts","sourceRoot":"","sources":["../src/server-properties.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAmBT"}
1
+ {"version":3,"file":"server-properties.d.ts","sourceRoot":"","sources":["../src/server-properties.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA4BzD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAgB,GACvB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAgGxC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAmBT"}
@@ -1,5 +1,8 @@
1
+ import { configPath, readJson } from "@sfmc-bds/sdk/node/config";
1
2
  import fs from "node:fs";
2
3
  import { serverPropertiesPath } from "./pack-manager.js";
4
+ import { ROOT_DIR } from "./paths.js";
5
+ import { getServerPropertyDoc } from "./server-properties-i18n.js";
3
6
  const EMIT_SERVER_TELEMETRY_KEY = "emit-server-telemetry";
4
7
  const EMIT_SERVER_TELEMETRY_LINE = "emit-server-telemetry=true";
5
8
  function ensureEmitServerTelemetry(bdsRoot, logger) {
@@ -20,9 +23,131 @@ function ensureEmitServerTelemetry(bdsRoot, logger) {
20
23
  );
21
24
  return true;
22
25
  }
26
+ function resolveBdsLocale(rootDir) {
27
+ const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;
28
+ if (envLang) {
29
+ return envLang;
30
+ }
31
+ const root = rootDir || ROOT_DIR;
32
+ try {
33
+ const runtime = readJson(configPath(root, "runtime.json"));
34
+ if (runtime?.locale) {
35
+ return runtime.locale;
36
+ }
37
+ } catch {
38
+ }
39
+ const osLangs = [
40
+ process.env.LC_ALL,
41
+ process.env.LC_MESSAGES,
42
+ process.env.LANG,
43
+ Intl.DateTimeFormat().resolvedOptions().locale
44
+ ];
45
+ for (const raw of osLangs) {
46
+ if (raw && /^zh\b/i.test(raw)) {
47
+ return "zh-CN";
48
+ }
49
+ }
50
+ return "en";
51
+ }
52
+ function localizeServerPropertiesContent(text, locale = "zh-CN") {
53
+ const normalizedLocale = locale.toLowerCase();
54
+ if (!normalizedLocale.startsWith("zh")) {
55
+ return { content: text, modified: false };
56
+ }
57
+ if (!text || text.trim().length === 0) {
58
+ return { content: text, modified: false };
59
+ }
60
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
61
+ const lines = text.split(/\r?\n/);
62
+ const blocks = [];
63
+ let currentBlock = [];
64
+ let currentKey;
65
+ let currentValue;
66
+ function flushBlock() {
67
+ if (currentBlock.length > 0) {
68
+ blocks.push({
69
+ key: currentKey,
70
+ value: currentValue,
71
+ originalLines: currentBlock
72
+ });
73
+ currentBlock = [];
74
+ currentKey = void 0;
75
+ currentValue = void 0;
76
+ }
77
+ }
78
+ const kvRegex = /^\s*([A-Za-z0-9._-]+)\s*=\s*(.*)$/;
79
+ for (let i = 0; i < lines.length; i++) {
80
+ const line = lines[i];
81
+ if (typeof line !== "string") continue;
82
+ const isBlank = line.trim() === "";
83
+ if (isBlank) {
84
+ flushBlock();
85
+ continue;
86
+ }
87
+ const match = line.match(kvRegex);
88
+ if (match && match[1] !== void 0) {
89
+ if (currentKey !== void 0) {
90
+ flushBlock();
91
+ }
92
+ currentKey = match[1];
93
+ currentValue = match[2] ?? "";
94
+ currentBlock.push(line);
95
+ } else {
96
+ currentBlock.push(line);
97
+ }
98
+ }
99
+ flushBlock();
100
+ const outputBlocks = [];
101
+ for (const block of blocks) {
102
+ if (block.key) {
103
+ const doc = getServerPropertyDoc(block.key, locale);
104
+ if (doc) {
105
+ const outLines = [`${block.key}=${block.value ?? ""}`];
106
+ outLines.push(`# ${doc.desc}`);
107
+ if (doc.values) {
108
+ outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);
109
+ }
110
+ if (doc.tip) {
111
+ outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);
112
+ }
113
+ outputBlocks.push(outLines.join(eol));
114
+ continue;
115
+ }
116
+ }
117
+ outputBlocks.push(block.originalLines.join(eol));
118
+ }
119
+ let newContent = outputBlocks.join(eol + eol);
120
+ if (newContent.length > 0 && !newContent.endsWith(eol)) {
121
+ newContent += eol;
122
+ }
123
+ return {
124
+ content: newContent,
125
+ modified: newContent !== text
126
+ };
127
+ }
128
+ function localizeServerProperties(bdsRoot, options) {
129
+ const file = serverPropertiesPath(bdsRoot);
130
+ if (!fs.existsSync(file)) return false;
131
+ const locale = options?.locale || resolveBdsLocale(options?.rootDir);
132
+ const normalizedLocale = locale.toLowerCase();
133
+ if (!normalizedLocale.startsWith("zh")) {
134
+ return false;
135
+ }
136
+ const raw = fs.readFileSync(file, "utf8");
137
+ const { content, modified } = localizeServerPropertiesContent(raw, locale);
138
+ if (!modified) {
139
+ return false;
140
+ }
141
+ fs.writeFileSync(file, content, "utf8");
142
+ options?.logger?.info("\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09");
143
+ return true;
144
+ }
23
145
  export {
24
146
  EMIT_SERVER_TELEMETRY_KEY,
25
147
  EMIT_SERVER_TELEMETRY_LINE,
26
- ensureEmitServerTelemetry
148
+ ensureEmitServerTelemetry,
149
+ localizeServerProperties,
150
+ localizeServerPropertiesContent,
151
+ resolveBdsLocale
27
152
  };
28
153
  //# sourceMappingURL=server-properties.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server-properties.ts"],
4
- "sourcesContent": ["/**\n * server.properties \u8F85\u52A9\uFF1A\u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true\n */\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n"],
5
- "mappings": "AAGA,OAAO,QAAQ;AACf,SAAS,4BAA4B;AAE9B,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AAWnC,SAAS,0BACd,SACA,QACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,MAAI,OAAO,GAAG,aAAa,MAAM,MAAM;AACvC,MAAI,kCAAkC,KAAK,IAAI,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AAC3C,YAAQ;AAAA,EACV;AACA,UAAQ,GAAG,0BAA0B;AAAA;AACrC,KAAG,cAAc,MAAM,MAAM,MAAM;AAEnC,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * server-properties.ts \u2014 BDS server.properties \u8F85\u52A9\u5DE5\u5177\u96C6\n *\n * \u804C\u8D23\uFF1A\n * 1. \u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true\n * 2. \u5B89\u88C5/\u66F4\u65B0/\u542F\u52A8\u65F6\u652F\u6301\u5C06\u914D\u7F6E\u6CE8\u91CA\u7ED3\u6784\u5316\u672C\u5730\u5316\uFF08\u5982\u7FFB\u8BD1\u4E3A\u7B80\u4F53\u4E2D\u6587 zh-CN\uFF09\uFF0C\n * \u4E25\u683C\u4FDD\u7559\u6240\u6709\u914D\u7F6E\u952E\uFF08Key\uFF09\u4E0E\u7528\u6237\u914D\u7F6E\u503C\uFF08Value\uFF09\u3002\n */\nimport { configPath, readJson } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\nimport { ROOT_DIR } from \"./paths.js\";\nimport { getServerPropertyDoc } from \"./server-properties-i18n.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n\n/**\n * \u89E3\u6790\u5E76\u63A2\u6D4B\u5F53\u524D\u5E94\u5F53\u91C7\u7528\u7684 BDS \u672C\u5730\u5316\u8BED\u8A00\u4EE3\u7801\uFF08\u4F8B\u5982 zh-CN \u6216 en\uFF09\u3002\n */\nexport function resolveBdsLocale(rootDir?: string): string {\n const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;\n if (envLang) {\n return envLang;\n }\n\n const root = rootDir || ROOT_DIR;\n try {\n const runtime = readJson<{ locale?: string }>(configPath(root, \"runtime.json\"));\n if (runtime?.locale) {\n return runtime.locale;\n }\n } catch {\n // \u5FFD\u7565\u5F02\u5E38\uFF0C\u964D\u7EA7\u5230\u7CFB\u7EDF\u8BED\u8A00\u63A2\u6D4B\n }\n\n const osLangs = [\n process.env.LC_ALL,\n process.env.LC_MESSAGES,\n process.env.LANG,\n Intl.DateTimeFormat().resolvedOptions().locale,\n ];\n for (const raw of osLangs) {\n if (raw && /^zh\\b/i.test(raw)) {\n return \"zh-CN\";\n }\n }\n return \"en\";\n}\n\n/**\n * \u7EAF\u51FD\u6570\uFF1A\u5C06 server.properties \u6587\u672C\u4E2D\u7684\u6CE8\u91CA\u66FF\u6362\u4E3A\u76EE\u6807\u8BED\u8A00\u7684\u7ED3\u6784\u5316\u4E2D\u6587\u8BF4\u660E\u3002\n * \u4E25\u683C\u4FDD\u7559\u914D\u7F6E\u9879\u7684 key \u4E0E\u5F53\u524D\u751F\u6548\u7684 value\u3002\u82E5\u9047\u5230\u672A\u6536\u5F55\u7684\u952E\u6216\u7EAF\u6CE8\u91CA\u5757\uFF0C\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function localizeServerPropertiesContent(\n text: string,\n locale: string = \"zh-CN\"\n): { content: string; modified: boolean } {\n const normalizedLocale = locale.toLowerCase();\n // \u76EE\u524D\u4EC5\u5BF9\u4E2D\u6587\u505A\u672C\u5730\u5316\u91CD\u5199\uFF1B\u82F1\u6587\u6216\u5176\u4ED6\u8BED\u8A00\u4FDD\u6301\u539F\u6C41\u539F\u5473\n if (!normalizedLocale.startsWith(\"zh\")) {\n return { content: text, modified: false };\n }\n\n if (!text || text.trim().length === 0) {\n return { content: text, modified: false };\n }\n\n const eol = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const lines = text.split(/\\r?\\n/);\n\n interface Block {\n key: string | undefined;\n value: string | undefined;\n originalLines: string[];\n }\n\n const blocks: Block[] = [];\n let currentBlock: string[] = [];\n let currentKey: string | undefined;\n let currentValue: string | undefined;\n\n function flushBlock() {\n if (currentBlock.length > 0) {\n blocks.push({\n key: currentKey,\n value: currentValue,\n originalLines: currentBlock,\n });\n currentBlock = [];\n currentKey = undefined;\n currentValue = undefined;\n }\n }\n\n const kvRegex = /^\\s*([A-Za-z0-9._-]+)\\s*=\\s*(.*)$/;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (typeof line !== \"string\") continue;\n const isBlank = line.trim() === \"\";\n\n if (isBlank) {\n flushBlock();\n continue;\n }\n\n const match = line.match(kvRegex);\n if (match && match[1] !== undefined) {\n // \u82E5\u5F53\u524D\u5757\u5185\u5DF2\u7ECF\u5B58\u5728\u4E00\u4E2A\u952E\u503C\u5BF9\uFF0C\u5219\u5148\u7ED3\u7B97\u4E0A\u4E00\u5757\n if (currentKey !== undefined) {\n flushBlock();\n }\n currentKey = match[1];\n currentValue = match[2] ?? \"\";\n currentBlock.push(line);\n } else {\n currentBlock.push(line);\n }\n }\n flushBlock();\n\n const outputBlocks: string[] = [];\n\n for (const block of blocks) {\n if (block.key) {\n const doc = getServerPropertyDoc(block.key, locale);\n if (doc) {\n const outLines: string[] = [`${block.key}=${block.value ?? \"\"}`];\n outLines.push(`# ${doc.desc}`);\n if (doc.values) {\n outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);\n }\n if (doc.tip) {\n outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);\n }\n outputBlocks.push(outLines.join(eol));\n continue;\n }\n }\n // \u672A\u6536\u5F55\u7684\u9879\u6216\u666E\u901A\u6CE8\u91CA\u5757\uFF0C\u4FDD\u7559\u539F\u6587\u672C\n outputBlocks.push(block.originalLines.join(eol));\n }\n\n let newContent = outputBlocks.join(eol + eol);\n if (newContent.length > 0 && !newContent.endsWith(eol)) {\n newContent += eol;\n }\n\n return {\n content: newContent,\n modified: newContent !== text,\n };\n}\n\nexport interface LocalizeServerPropertiesOptions {\n locale?: string;\n rootDir?: string;\n logger?: ServerPropertiesLogger;\n}\n\n/**\n * \u5BF9 `<bdsRoot>/server.properties` \u4E2D\u7684\u6CE8\u91CA\u6267\u884C\u672C\u5730\u5316\u91CD\u5199\u3002\n * @returns true = \u672C\u6B21\u6210\u529F\u91CD\u5199\u5E76\u4FDD\u5B58\uFF1Bfalse = \u8DF3\u8FC7\u6216\u65E0\u6539\u52A8\n */\nexport function localizeServerProperties(\n bdsRoot: string,\n options?: LocalizeServerPropertiesOptions\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n const locale = options?.locale || resolveBdsLocale(options?.rootDir);\n const normalizedLocale = locale.toLowerCase();\n if (!normalizedLocale.startsWith(\"zh\")) {\n return false;\n }\n\n const raw = fs.readFileSync(file, \"utf8\");\n const { content, modified } = localizeServerPropertiesContent(raw, locale);\n if (!modified) {\n return false;\n }\n\n fs.writeFileSync(file, content, \"utf8\");\n options?.logger?.info(\"\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09\");\n return true;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,127 @@
1
+ import assert from "node:assert/strict";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { describe, it } from "node:test";
6
+ import { rmSafe } from "./fsx.js";
7
+ import {
8
+ ensureEmitServerTelemetry,
9
+ localizeServerProperties,
10
+ localizeServerPropertiesContent,
11
+ resolveBdsLocale
12
+ } from "./server-properties.js";
13
+ const SAMPLE_VANILLA_PROPERTIES = `server-name=Dedicated Server
14
+ # Used as the server name
15
+ # Allowed values: Any string without semicolon symbol.
16
+
17
+ gamemode=survival
18
+ # Sets the game mode for new players.
19
+ # Allowed values: "survival", "creative", or "adventure"
20
+
21
+ force-gamemode=false
22
+ # Prevents the server from sending level settings to clients
23
+
24
+ allow-cheats=false
25
+ # If true then cheats like commands can be used.
26
+
27
+ custom-unknown-flag=hello-world
28
+ # This is a third-party or future setting
29
+ `;
30
+ describe("server-properties: localizeServerPropertiesContent", () => {
31
+ it("\u5C06\u5DF2\u77E5\u914D\u7F6E\u9879\u7684\u82F1\u6587\u6CE8\u91CA\u66FF\u6362\u4E3A\u4E2D\u6587\uFF0C\u4E14\u4E25\u683C\u4FDD\u7559\u7528\u6237\u914D\u7F6E\u503C", () => {
32
+ const customText = `server-name=\u6211\u7684\u4E16\u754C\u670D\u52A1\u5668
33
+ # Used as the server name
34
+
35
+ gamemode=creative
36
+ # Sets the game mode for new players.
37
+
38
+ server-port=25565
39
+ `;
40
+ const { content, modified } = localizeServerPropertiesContent(customText, "zh-CN");
41
+ assert.equal(modified, true);
42
+ assert.match(content, /server-name=我的世界服务器/);
43
+ assert.match(content, /gamemode=creative/);
44
+ assert.match(content, /server-port=25565/);
45
+ assert.match(content, /# 服务器名称(显示在客户端局域网\/好友列表中)/);
46
+ assert.match(content, /# 新玩家首次加入世界时的默认游戏模式/);
47
+ assert.match(content, /# 服务端监听的 IPv4 UDP 网络通信端口/);
48
+ });
49
+ it("\u4FDD\u6301\u5E42\u7B49\u6027\uFF1A\u4E8C\u6B21\u8FD0\u884C\u8F93\u51FA\u5185\u5BB9\u5B8C\u5168\u4E00\u81F4\uFF0Cmodified \u4E3A false", () => {
50
+ const firstRun = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, "zh-CN");
51
+ assert.equal(firstRun.modified, true);
52
+ const secondRun = localizeServerPropertiesContent(firstRun.content, "zh-CN");
53
+ assert.equal(secondRun.modified, false);
54
+ assert.equal(secondRun.content, firstRun.content);
55
+ });
56
+ it("\u4FDD\u7559\u672A\u6536\u5F55\u7684\u672A\u77E5\u9879\u4E0E\u7B2C\u4E09\u65B9\u6CE8\u91CA\u4E0D\u53D8", () => {
57
+ const { content } = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, "zh-CN");
58
+ assert.match(content, /custom-unknown-flag=hello-world/);
59
+ assert.match(content, /# This is a third-party or future setting/);
60
+ });
61
+ it("\u5F53 locale \u4E3A en \u6216\u975E\u4E2D\u6587\u65F6\uFF0C\u8DF3\u8FC7\u4FEE\u6539\u5E76\u8FD4\u56DE modified: false", () => {
62
+ const resEn = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, "en");
63
+ assert.equal(resEn.modified, false);
64
+ assert.equal(resEn.content, SAMPLE_VANILLA_PROPERTIES);
65
+ });
66
+ it("\u7A7A\u6587\u672C\u5B89\u5168\u5904\u7406", () => {
67
+ const res = localizeServerPropertiesContent("", "zh-CN");
68
+ assert.equal(res.modified, false);
69
+ assert.equal(res.content, "");
70
+ });
71
+ });
72
+ describe("server-properties: \u6587\u4EF6\u8BFB\u5199\u4E0E\u78C1\u76D8\u96C6\u6210", () => {
73
+ it("localizeServerProperties \u6B63\u786E\u5C31\u5730\u91CD\u5199\u78C1\u76D8\u6587\u4EF6", () => {
74
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-server-props-"));
75
+ try {
76
+ const propFile = path.join(tmp, "server.properties");
77
+ fs.writeFileSync(propFile, "server-name=TestServer\ngamemode=survival\n", "utf8");
78
+ const msgs = [];
79
+ const ok = localizeServerProperties(tmp, {
80
+ locale: "zh-CN",
81
+ logger: { info: (m) => msgs.push(m) }
82
+ });
83
+ assert.equal(ok, true);
84
+ assert.equal(msgs.length, 1);
85
+ const updated = fs.readFileSync(propFile, "utf8");
86
+ assert.match(updated, /server-name=TestServer/);
87
+ assert.match(updated, /# 服务器名称/);
88
+ const okAgain = localizeServerProperties(tmp, { locale: "zh-CN" });
89
+ assert.equal(okAgain, false);
90
+ } finally {
91
+ rmSafe(tmp);
92
+ }
93
+ });
94
+ it("\u7ED3\u5408 ensureEmitServerTelemetry\uFF1A\u65B0\u8FFD\u52A0\u7684\u9065\u6D4B\u5F00\u5173\u540C\u6837\u80FD\u83B7\u5F97\u4E2D\u6587\u6CE8\u91CA", () => {
95
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-server-props-telemetry-"));
96
+ try {
97
+ const propFile = path.join(tmp, "server.properties");
98
+ fs.writeFileSync(propFile, "server-name=Dedicated Server\n", "utf8");
99
+ const wrote = ensureEmitServerTelemetry(tmp);
100
+ assert.equal(wrote, true);
101
+ const ok = localizeServerProperties(tmp, { locale: "zh-CN" });
102
+ assert.equal(ok, true);
103
+ const content = fs.readFileSync(propFile, "utf8");
104
+ assert.match(content, /emit-server-telemetry=true/);
105
+ assert.match(content, /# 是否向 Mojang 发送服务器遥测与运行健康诊断数据/);
106
+ assert.match(content, /# 提示:使用本平台时因您已同意 Mojang EULA 协议,按协议保持启用/);
107
+ } finally {
108
+ rmSafe(tmp);
109
+ }
110
+ });
111
+ it("resolveBdsLocale \u652F\u6301\u73AF\u5883\u53D8\u91CF\u4E0E\u7CFB\u7EDF\u56DE\u9000", () => {
112
+ const oldEnv = process.env.SFMC_LOCALE;
113
+ try {
114
+ process.env.SFMC_LOCALE = "zh-CN";
115
+ assert.equal(resolveBdsLocale(), "zh-CN");
116
+ process.env.SFMC_LOCALE = "en";
117
+ assert.equal(resolveBdsLocale(), "en");
118
+ } finally {
119
+ if (oldEnv !== void 0) {
120
+ process.env.SFMC_LOCALE = oldEnv;
121
+ } else {
122
+ delete process.env.SFMC_LOCALE;
123
+ }
124
+ }
125
+ });
126
+ });
127
+ //# sourceMappingURL=server-properties.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server-properties.test.ts"],
4
+ "sourcesContent": ["import assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { describe, it } from \"node:test\";\nimport { rmSafe } from \"./fsx.js\";\nimport {\n ensureEmitServerTelemetry,\n localizeServerProperties,\n localizeServerPropertiesContent,\n resolveBdsLocale,\n} from \"./server-properties.js\";\n\nconst SAMPLE_VANILLA_PROPERTIES = `server-name=Dedicated Server\n# Used as the server name\n# Allowed values: Any string without semicolon symbol.\n\ngamemode=survival\n# Sets the game mode for new players.\n# Allowed values: \"survival\", \"creative\", or \"adventure\"\n\nforce-gamemode=false\n# Prevents the server from sending level settings to clients\n\nallow-cheats=false\n# If true then cheats like commands can be used.\n\ncustom-unknown-flag=hello-world\n# This is a third-party or future setting\n`;\n\ndescribe(\"server-properties: localizeServerPropertiesContent\", () => {\n it(\"\u5C06\u5DF2\u77E5\u914D\u7F6E\u9879\u7684\u82F1\u6587\u6CE8\u91CA\u66FF\u6362\u4E3A\u4E2D\u6587\uFF0C\u4E14\u4E25\u683C\u4FDD\u7559\u7528\u6237\u914D\u7F6E\u503C\", () => {\n const customText = `server-name=\u6211\u7684\u4E16\u754C\u670D\u52A1\u5668\n# Used as the server name\n\ngamemode=creative\n# Sets the game mode for new players.\n\nserver-port=25565\n`;\n const { content, modified } = localizeServerPropertiesContent(customText, \"zh-CN\");\n assert.equal(modified, true);\n\n // \u9A8C\u8BC1\u503C\u672A\u88AB\u8986\u76D6\u91CD\u7F6E\n assert.match(content, /server-name=\u6211\u7684\u4E16\u754C\u670D\u52A1\u5668/);\n assert.match(content, /gamemode=creative/);\n assert.match(content, /server-port=25565/);\n\n // \u9A8C\u8BC1\u6CE8\u91CA\u5DF2\u8F6C\u4E3A\u4E2D\u6587\n assert.match(content, /# \u670D\u52A1\u5668\u540D\u79F0\uFF08\u663E\u793A\u5728\u5BA2\u6237\u7AEF\u5C40\u57DF\u7F51\\/\u597D\u53CB\u5217\u8868\u4E2D\uFF09/);\n assert.match(content, /# \u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u4E16\u754C\u65F6\u7684\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F/);\n assert.match(content, /# \u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv4 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3/);\n });\n\n it(\"\u4FDD\u6301\u5E42\u7B49\u6027\uFF1A\u4E8C\u6B21\u8FD0\u884C\u8F93\u51FA\u5185\u5BB9\u5B8C\u5168\u4E00\u81F4\uFF0Cmodified \u4E3A false\", () => {\n const firstRun = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, \"zh-CN\");\n assert.equal(firstRun.modified, true);\n\n const secondRun = localizeServerPropertiesContent(firstRun.content, \"zh-CN\");\n assert.equal(secondRun.modified, false);\n assert.equal(secondRun.content, firstRun.content);\n });\n\n it(\"\u4FDD\u7559\u672A\u6536\u5F55\u7684\u672A\u77E5\u9879\u4E0E\u7B2C\u4E09\u65B9\u6CE8\u91CA\u4E0D\u53D8\", () => {\n const { content } = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, \"zh-CN\");\n assert.match(content, /custom-unknown-flag=hello-world/);\n assert.match(content, /# This is a third-party or future setting/);\n });\n\n it(\"\u5F53 locale \u4E3A en \u6216\u975E\u4E2D\u6587\u65F6\uFF0C\u8DF3\u8FC7\u4FEE\u6539\u5E76\u8FD4\u56DE modified: false\", () => {\n const resEn = localizeServerPropertiesContent(SAMPLE_VANILLA_PROPERTIES, \"en\");\n assert.equal(resEn.modified, false);\n assert.equal(resEn.content, SAMPLE_VANILLA_PROPERTIES);\n });\n\n it(\"\u7A7A\u6587\u672C\u5B89\u5168\u5904\u7406\", () => {\n const res = localizeServerPropertiesContent(\"\", \"zh-CN\");\n assert.equal(res.modified, false);\n assert.equal(res.content, \"\");\n });\n});\n\ndescribe(\"server-properties: \u6587\u4EF6\u8BFB\u5199\u4E0E\u78C1\u76D8\u96C6\u6210\", () => {\n it(\"localizeServerProperties \u6B63\u786E\u5C31\u5730\u91CD\u5199\u78C1\u76D8\u6587\u4EF6\", () => {\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-server-props-\"));\n try {\n const propFile = path.join(tmp, \"server.properties\");\n fs.writeFileSync(propFile, \"server-name=TestServer\\ngamemode=survival\\n\", \"utf8\");\n\n const msgs: string[] = [];\n const ok = localizeServerProperties(tmp, {\n locale: \"zh-CN\",\n logger: { info: (m) => msgs.push(m) },\n });\n\n assert.equal(ok, true);\n assert.equal(msgs.length, 1);\n\n const updated = fs.readFileSync(propFile, \"utf8\");\n assert.match(updated, /server-name=TestServer/);\n assert.match(updated, /# \u670D\u52A1\u5668\u540D\u79F0/);\n\n // \u4E8C\u6B21\u6267\u884C\u8DF3\u8FC7\n const okAgain = localizeServerProperties(tmp, { locale: \"zh-CN\" });\n assert.equal(okAgain, false);\n } finally {\n rmSafe(tmp);\n }\n });\n\n it(\"\u7ED3\u5408 ensureEmitServerTelemetry\uFF1A\u65B0\u8FFD\u52A0\u7684\u9065\u6D4B\u5F00\u5173\u540C\u6837\u80FD\u83B7\u5F97\u4E2D\u6587\u6CE8\u91CA\", () => {\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-server-props-telemetry-\"));\n try {\n const propFile = path.join(tmp, \"server.properties\");\n fs.writeFileSync(propFile, \"server-name=Dedicated Server\\n\", \"utf8\");\n\n // 1. \u8FFD\u52A0\u9065\u6D4B\n const wrote = ensureEmitServerTelemetry(tmp);\n assert.equal(wrote, true);\n\n // 2. \u672C\u5730\u5316\n const ok = localizeServerProperties(tmp, { locale: \"zh-CN\" });\n assert.equal(ok, true);\n\n const content = fs.readFileSync(propFile, \"utf8\");\n assert.match(content, /emit-server-telemetry=true/);\n assert.match(content, /# \u662F\u5426\u5411 Mojang \u53D1\u9001\u670D\u52A1\u5668\u9065\u6D4B\u4E0E\u8FD0\u884C\u5065\u5EB7\u8BCA\u65AD\u6570\u636E/);\n assert.match(content, /# \u63D0\u793A\uFF1A\u4F7F\u7528\u672C\u5E73\u53F0\u65F6\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA \u534F\u8BAE\uFF0C\u6309\u534F\u8BAE\u4FDD\u6301\u542F\u7528/);\n } finally {\n rmSafe(tmp);\n }\n });\n\n it(\"resolveBdsLocale \u652F\u6301\u73AF\u5883\u53D8\u91CF\u4E0E\u7CFB\u7EDF\u56DE\u9000\", () => {\n const oldEnv = process.env.SFMC_LOCALE;\n try {\n process.env.SFMC_LOCALE = \"zh-CN\";\n assert.equal(resolveBdsLocale(), \"zh-CN\");\n\n process.env.SFMC_LOCALE = \"en\";\n assert.equal(resolveBdsLocale(), \"en\");\n } finally {\n if (oldEnv !== undefined) {\n process.env.SFMC_LOCALE = oldEnv;\n } else {\n delete process.env.SFMC_LOCALE;\n }\n }\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }