@camscanner/mcp-language-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/utils.js ADDED
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // --- Constants ---
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.LANGUAGE_LOCALE_MAP = exports.PLATFORM_MAP = void 0;
5
+ exports.fixPlaceholders = fixPlaceholders;
6
+ exports.extractStrings = extractStrings;
7
+ exports.mergeLocaleEntries = mergeLocaleEntries;
8
+ exports.findMissingLocales = findMissingLocales;
9
+ exports.PLATFORM_MAP = {
10
+ 1: 'Android',
11
+ 3: 'iOS',
12
+ 4: 'Web',
13
+ 5: 'Windows',
14
+ 7: 'Market',
15
+ 8: 'Harmony',
16
+ 9: 'PC',
17
+ };
18
+ exports.LANGUAGE_LOCALE_MAP = {
19
+ '1': 'ZhCn',
20
+ '2': 'EnUs',
21
+ '3': 'JaJp',
22
+ '4': 'KoKr',
23
+ '5': 'FrFr',
24
+ '6': 'DeDe',
25
+ '7': 'ZhTw',
26
+ '8': 'PtBr',
27
+ '9': 'EsEs',
28
+ '10': 'ItIt',
29
+ '11': 'RuRu',
30
+ '12': 'TrTr',
31
+ '13': 'ArSa',
32
+ '14': 'ThTh',
33
+ '15': 'PlPl',
34
+ '16': 'ViVn',
35
+ '17': 'InId',
36
+ '19': 'MsMy',
37
+ '20': 'NlNl',
38
+ '22': 'HiDi',
39
+ '23': 'BnBd',
40
+ '24': 'CsCs',
41
+ '25': 'SkSk',
42
+ '26': 'FilPh',
43
+ '27': 'ElEl',
44
+ '28': 'PtPt',
45
+ '29': 'RoRo',
46
+ };
47
+ // --- Helpers ---
48
+ function fixPlaceholders(value) {
49
+ let cnt = 0;
50
+ return value
51
+ .replace(/%s/g, () => `{${cnt++}}`)
52
+ .replace(/\\"/g, '"')
53
+ .replace(/\\n/g, '\n');
54
+ }
55
+ function extractStrings(versions, platformId) {
56
+ const result = {};
57
+ for (const version of versions) {
58
+ const strings = version.ar_string || version.strings || [];
59
+ const languages = version.ar_language || [];
60
+ for (const str of strings) {
61
+ const key = str.keys?.[platformId] || str.keys?.['0'] || Object.values(str.keys || {})[0];
62
+ if (!key)
63
+ continue;
64
+ for (const langId of languages) {
65
+ const value = str.values?.[langId];
66
+ if (!value)
67
+ continue;
68
+ if (!result[langId])
69
+ result[langId] = {};
70
+ result[langId][key] = fixPlaceholders(value);
71
+ }
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+ function mergeLocaleEntries(existingObj, newEntries) {
77
+ const merged = { ...existingObj };
78
+ // Fix existing %s placeholders
79
+ for (const key of Object.keys(merged)) {
80
+ if (typeof merged[key] === 'string' && merged[key].includes('%s')) {
81
+ merged[key] = fixPlaceholders(merged[key]);
82
+ }
83
+ }
84
+ // Preserve insert_before_this_line marker
85
+ const insertMarker = merged['insert_before_this_line'];
86
+ delete merged['insert_before_this_line'];
87
+ const keysAdded = [];
88
+ const keysUpdated = [];
89
+ for (const [key, value] of Object.entries(newEntries)) {
90
+ if (merged[key] === undefined) {
91
+ keysAdded.push(key);
92
+ }
93
+ else if (merged[key] !== value) {
94
+ keysUpdated.push(key);
95
+ }
96
+ merged[key] = value;
97
+ }
98
+ if (insertMarker) {
99
+ merged['insert_before_this_line'] = insertMarker;
100
+ }
101
+ return { merged, keysAdded, keysUpdated };
102
+ }
103
+ /**
104
+ * 找出本地存在但远程未返回翻译的 locale 文件名。
105
+ * @param localLocaleNames 本地存在的 locale 名称列表(不含 .json 后缀),如 ['ZhCn', 'EnUs', 'JaJp']
106
+ * @param remoteLanguageIds 远程返回的语言 ID 列表,如 ['1', '2']
107
+ * @returns 本地存在但远程无数据的 locale 名称列表
108
+ */
109
+ function findMissingLocales(localLocaleNames, remoteLanguageIds) {
110
+ const remoteLocaleNames = new Set(remoteLanguageIds.map(id => exports.LANGUAGE_LOCALE_MAP[id]).filter(Boolean));
111
+ return localLocaleNames.filter(name => !remoteLocaleNames.has(name));
112
+ }