@langapi/mcp-server 1.1.1 → 1.2.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/README.md CHANGED
@@ -20,12 +20,13 @@ This package enables AI assistants like Claude, Cursor, and VS Code extensions t
20
20
 
21
21
  ## Features
22
22
 
23
- - **Locale Detection**: Automatically detect i18n framework (next-intl, i18next, react-intl) and locale files
23
+ - **Locale Detection**: Automatically detect i18n framework (next-intl, i18next, react-intl, iOS/macOS) and locale files
24
24
  - **Translation Status**: Compare source and target locales to find missing translations
25
25
  - **Sync Translations**: Translate missing keys via LangAPI with credit-based billing
26
26
  - **Dry Run Mode**: Preview changes and costs before syncing (enabled by default)
27
27
  - **Format Preservation**: Maintains JSON formatting when writing translated files
28
28
  - **Delta Detection**: Only translate new/changed keys, saving up to 90% on costs
29
+ - **Apple Localization**: Support for iOS/macOS `.strings`, `.xcstrings`, and `.stringsdict` files
29
30
 
30
31
  ## Installation
31
32
 
@@ -76,14 +77,10 @@ After editing, **restart Claude Desktop** for changes to take effect.
76
77
 
77
78
  ```bash
78
79
  # Add to current project (stored in .mcp.json)
79
- claude mcp add --transport stdio langapi \
80
+ claude mcp add langapi \
80
81
  --env LANGAPI_API_KEY=your-api-key-here \
81
- -- npx @langapi/mcp-server
82
+ -- npx -y @langapi/mcp-server
82
83
 
83
- # Or add globally for all projects (stored in ~/.claude.json)
84
- claude mcp add --transport stdio langapi --scope user \
85
- --env LANGAPI_API_KEY=your-api-key-here \
86
- -- npx @langapi/mcp-server
87
84
  ```
88
85
 
89
86
  **Option 2: Project-level config** (recommended for teams)
@@ -301,8 +298,7 @@ Compare source locale against targets to identify missing keys and estimate cost
301
298
  {
302
299
  "source_lang": "en",
303
300
  "target_langs": ["de", "fr"], // optional, all non-source by default
304
- "project_path": "/path/to/project", // optional
305
- "app_id": "your-app-id" // optional, for accurate cost estimate
301
+ "project_path": "/path/to/project" // optional
306
302
  }
307
303
  ```
308
304
 
@@ -380,37 +376,6 @@ Sync translations via the LangAPI API. **Default is dry_run=true for safety.**
380
376
  }
381
377
  ```
382
378
 
383
- ### `get_diff`
384
-
385
- Compare current source locale against the last synced version.
386
-
387
- **Input:**
388
- ```json
389
- {
390
- "source_lang": "en",
391
- "project_path": "/path/to/project" // optional
392
- }
393
- ```
394
-
395
- **Output:**
396
- ```json
397
- {
398
- "has_changes": true,
399
- "summary": {
400
- "new_keys": 3,
401
- "changed_keys": 1,
402
- "removed_keys": 0,
403
- "unchanged_keys": 146
404
- },
405
- "diff": {
406
- "new": ["feature.title", "feature.description", "feature.cta"],
407
- "changed": ["home.welcome"],
408
- "removed": [],
409
- "unchanged": ["..."]
410
- }
411
- }
412
- ```
413
-
414
379
  ---
415
380
 
416
381
  ## Prompt Examples
@@ -459,8 +424,6 @@ Compare current source locale against the last synced version.
459
424
  ### Advanced Operations
460
425
 
461
426
  ```
462
- "What changed since my last sync?"
463
- "Show diff between current and last synced version"
464
427
  "Are there any extra keys in German that aren't in English?"
465
428
  "Skip the settings.* keys when syncing"
466
429
  "Only sync the home.* and nav.* keys"
@@ -502,6 +465,7 @@ The server automatically detects these i18n frameworks:
502
465
  | **next-intl** | `messages/*.json`, `locales/*.json` | `i18n.ts`, `next.config.js` |
503
466
  | **i18next** | `public/locales/*/*.json`, `locales/*/*.json` | `i18next.config.js`, `i18n.js` |
504
467
  | **react-intl** | `src/lang/*.json`, `lang/*.json` | `src/i18n.ts` |
468
+ | **iOS/macOS** | `.strings`, `.xcstrings`, `.stringsdict` | `Info.plist` |
505
469
  | **generic** | Various common patterns | - |
506
470
 
507
471
  ---
@@ -20,5 +20,14 @@ export declare class LangAPIClient {
20
20
  * Sync translations with the LangAPI service
21
21
  */
22
22
  sync(request: SyncRequest): Promise<SyncResponse>;
23
+ /**
24
+ * Sync translations with extra precision using the LangAPI service
25
+ * Uses the /api/v1/extra-sync endpoint for higher quality translations (2 credits/word)
26
+ */
27
+ extraSync(request: SyncRequest): Promise<SyncResponse>;
28
+ /**
29
+ * Internal method to call sync endpoints
30
+ */
31
+ private callSyncEndpoint;
23
32
  }
24
33
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAGb,MAAM,YAAY,CAAC;AAoCpB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAGxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAqB,EAC9B,SAAS,GAAE,MAA2B;IAOxC;;;OAGG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;IAU9B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA2FxD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAGb,MAAM,YAAY,CAAC;AAoCpB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAGxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAqB,EAC9B,SAAS,GAAE,MAA2B;IAOxC;;;OAGG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;IAU9B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvD;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAI5D;;OAEG;YACW,gBAAgB;CA8F/B"}
@@ -61,11 +61,24 @@ export class LangAPIClient {
61
61
  * Sync translations with the LangAPI service
62
62
  */
63
63
  async sync(request) {
64
+ return this.callSyncEndpoint(`${this.baseUrl}/api/v1/sync`, request);
65
+ }
66
+ /**
67
+ * Sync translations with extra precision using the LangAPI service
68
+ * Uses the /api/v1/extra-sync endpoint for higher quality translations (2 credits/word)
69
+ */
70
+ async extraSync(request) {
71
+ return this.callSyncEndpoint(`${this.baseUrl}/api/v1/extra-sync`, request);
72
+ }
73
+ /**
74
+ * Internal method to call sync endpoints
75
+ */
76
+ async callSyncEndpoint(url, request) {
64
77
  // Create abort controller for timeout
65
78
  const controller = new AbortController();
66
79
  const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
67
80
  try {
68
- const response = await fetch(`${this.baseUrl}/api/v1/sync`, {
81
+ const response = await fetch(url, {
69
82
  method: "POST",
70
83
  headers: {
71
84
  "Content-Type": "application/json",
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQ3D,2DAA2D;AAC3D,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAa;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,OAAO,CACL,GAAG,CAAC,OAAO,KAAK,IAAI;QACpB,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC7B,GAAG,CAAC,KAAK,KAAK,IAAI;QAClB,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,KAAK,IAAI;QACjB,kBAAkB,IAAK,GAAG,CAAC,IAAgC,CAC5D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,OAAO,CACL,GAAG,CAAC,OAAO,KAAK,IAAI;QACpB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,KAAK,IAAI;QACjB,aAAa,IAAK,GAAG,CAAC,IAAgC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,SAAS,CAAS;IAE1B,YACE,MAAc,EACd,UAAkB,YAAY,EAC9B,YAAoB,kBAAkB;QAEtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAM;QACX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS;QACd,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,OAAoB;QAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,GAAW,EACX,OAAoB;QAEpB,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,8BAA8B;gBAC9B,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;oBACvC,CAAC,CAAE,IAAgC;oBACnC,CAAC,CAAC,EAAE,CAAC;gBACT,MAAM,SAAS,GACb,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;oBAC3D,CAAC,CAAE,QAAQ,CAAC,KAAiC;oBAC7C,CAAC,CAAC,EAAE,CAAC;gBAET,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW;wBACvE,OAAO,EACL,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;4BACnC,CAAC,CAAC,SAAS,CAAC,OAAO;4BACnB,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE;wBAC/B,cAAc,EACZ,OAAO,SAAS,CAAC,cAAc,KAAK,QAAQ;4BAC1C,CAAC,CAAC,SAAS,CAAC,cAAc;4BAC1B,CAAC,CAAC,SAAS;wBACf,eAAe,EACb,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ;4BAC3C,CAAC,CAAC,SAAS,CAAC,eAAe;4BAC3B,CAAC,CAAC,SAAS;wBACf,QAAQ,EACN,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;4BACpC,CAAC,CAAC,SAAS,CAAC,QAAQ;4BACpB,CAAC,CAAC,SAAS;qBAChB;iBACF,CAAC;YACJ,CAAC;YAED,iDAAiD;YACjD,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,0BAA0B;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,4CAA4C;iBACtD;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,2BAA2B,IAAI,CAAC,SAAS,IAAI;qBACvD;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB;iBAC1E;aACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
@@ -6,6 +6,7 @@ export interface KeyValue {
6
6
  key: string;
7
7
  value: string;
8
8
  }
9
+ export type SyncPrecision = "standard" | "extra";
9
10
  export interface SyncRequest {
10
11
  source_lang: string;
11
12
  target_langs: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAGD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAGD,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAIjD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAGD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAGD,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,CAAC"}
@@ -45,14 +45,12 @@ export declare function xcstringsHasMissingKeys(xcstringsData: XCStringsFile, ta
45
45
  *
46
46
  * @param sourceData Parsed xcstrings source data
47
47
  * @param targetLang Target language code
48
- * @param cachedContent Cached content from previous sync (null if no cache)
49
- * @param deltaContent Content that changed since last sync
50
48
  * @param isMissingLang Whether the target language is completely missing
51
- * @param hasMissingKeys Whether target has any missing keys
52
49
  * @param skipKeys Set of keys to skip for this language
50
+ * @param hardSync If true, re-translate all keys even if target already has translations
53
51
  * @returns Content to sync (after filtering skip keys)
54
52
  */
55
- export declare function getXCStringsContentToSync(sourceData: XCStringsSourceData, targetLang: string, cachedContent: Record<string, string> | null, deltaContent: KeyValue[], isMissingLang: boolean, hasMissingKeys: boolean, skipKeys: Set<string>): {
53
+ export declare function getXCStringsContentToSync(sourceData: XCStringsSourceData, targetLang: string, isMissingLang: boolean, skipKeys: Set<string>, hardSync?: boolean): {
56
54
  contentToSync: KeyValue[];
57
55
  skippedKeys: string[];
58
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"xcstrings-sync-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/xcstrings-sync-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACd,mBAAmB,GAAG,IAAI,CAW5B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GACjB,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,QAAQ,EAAE,GACxB,OAAO,CAIT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EAC5C,YAAY,EAAE,QAAQ,EAAE,EACxB,aAAa,EAAE,OAAO,EACtB,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GACpB;IAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CA+BtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,aAAa,EAC1B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,QAAQ,EAAE,GACvB,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
1
+ {"version":3,"file":"xcstrings-sync-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/xcstrings-sync-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACd,mBAAmB,GAAG,IAAI,CAW5B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GACjB,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,QAAQ,EAAE,GACxB,OAAO,CAIT;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,QAAQ,GAAE,OAAe,GACxB;IAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CA4BtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,aAAa,EAC1B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,QAAQ,EAAE,GACvB,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
@@ -58,28 +58,22 @@ export function xcstringsHasMissingKeys(xcstringsData, targetLang, sourceContent
58
58
  *
59
59
  * @param sourceData Parsed xcstrings source data
60
60
  * @param targetLang Target language code
61
- * @param cachedContent Cached content from previous sync (null if no cache)
62
- * @param deltaContent Content that changed since last sync
63
61
  * @param isMissingLang Whether the target language is completely missing
64
- * @param hasMissingKeys Whether target has any missing keys
65
62
  * @param skipKeys Set of keys to skip for this language
63
+ * @param hardSync If true, re-translate all keys even if target already has translations
66
64
  * @returns Content to sync (after filtering skip keys)
67
65
  */
68
- export function getXCStringsContentToSync(sourceData, targetLang, cachedContent, deltaContent, isMissingLang, hasMissingKeys, skipKeys) {
66
+ export function getXCStringsContentToSync(sourceData, targetLang, isMissingLang, skipKeys, hardSync = false) {
69
67
  let contentToSync;
70
- if (isMissingLang) {
71
- // New language: sync all source content
68
+ if (hardSync || isMissingLang) {
69
+ // Hard sync or new language: sync all source content
72
70
  contentToSync = sourceData.flatContent;
73
71
  }
74
- else if (!cachedContent || hasMissingKeys) {
75
- // No cache OR target has missing translations: sync missing keys
72
+ else {
73
+ // Existing language: sync only keys missing from target
76
74
  const existingTargetKeys = getXCStringsExistingKeys(sourceData.xcstringsData, targetLang);
77
75
  contentToSync = sourceData.flatContent.filter((item) => !existingTargetKeys.has(item.key));
78
76
  }
79
- else {
80
- // Has cache: use delta
81
- contentToSync = deltaContent;
82
- }
83
77
  // Apply skip_keys filter
84
78
  const skippedKeys = [];
85
79
  const filteredContent = contentToSync.filter((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"xcstrings-sync-handler.js","sourceRoot":"","sources":["../../src/handlers/xcstrings-sync-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xcstrings-sync-handler.js","sourceRoot":"","sources":["../../src/handlers/xcstrings-sync-handler.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,7 +9,6 @@
9
9
  * - list_local_locales: Scan project for locale files
10
10
  * - get_translation_status: Compare source vs target locales
11
11
  * - sync_translations: Sync translations via LangAPI API
12
- * - get_diff: Compare source against sync cache for delta detection
13
12
  */
14
13
  export {};
15
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
package/dist/index.js CHANGED
@@ -9,7 +9,6 @@
9
9
  * - list_local_locales: Scan project for locale files
10
10
  * - get_translation_status: Compare source vs target locales
11
11
  * - sync_translations: Sync translations via LangAPI API
12
- * - get_diff: Compare source against sync cache for delta detection
13
12
  */
14
13
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
14
  import { createServer } from "./server.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAaxC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAYxC"}
package/dist/server.js CHANGED
@@ -5,7 +5,6 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { registerListLocalLocales } from "./tools/list-local-locales.js";
6
6
  import { registerGetTranslationStatus } from "./tools/get-translation-status.js";
7
7
  import { registerSyncTranslations } from "./tools/sync-translations.js";
8
- import { registerGetDiff } from "./tools/get-diff.js";
9
8
  /**
10
9
  * Create and configure the MCP server
11
10
  */
@@ -18,7 +17,6 @@ export function createServer() {
18
17
  registerListLocalLocales(server);
19
18
  registerGetTranslationStatus(server);
20
19
  registerSyncTranslations(server);
21
- registerGetDiff(server);
22
20
  return server;
23
21
  }
24
22
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -11,11 +11,15 @@ declare const SyncTranslationsSchema: z.ZodObject<{
11
11
  project_path: z.ZodOptional<z.ZodString>;
12
12
  write_to_files: z.ZodDefault<z.ZodBoolean>;
13
13
  skip_keys: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>>;
14
+ hard_sync: z.ZodDefault<z.ZodBoolean>;
15
+ precision: z.ZodDefault<z.ZodEnum<["standard", "extra"]>>;
14
16
  }, "strip", z.ZodTypeAny, {
15
17
  source_lang: string;
16
18
  target_langs: string[];
17
19
  dry_run: boolean;
18
20
  write_to_files: boolean;
21
+ hard_sync: boolean;
22
+ precision: "standard" | "extra";
19
23
  project_path?: string | undefined;
20
24
  skip_keys?: Record<string, string[]> | undefined;
21
25
  }, {
@@ -25,11 +29,36 @@ declare const SyncTranslationsSchema: z.ZodObject<{
25
29
  dry_run?: boolean | undefined;
26
30
  write_to_files?: boolean | undefined;
27
31
  skip_keys?: Record<string, string[]> | undefined;
32
+ hard_sync?: boolean | undefined;
33
+ precision?: "standard" | "extra" | undefined;
28
34
  }>;
29
35
  export type SyncTranslationsInput = z.infer<typeof SyncTranslationsSchema>;
36
+ /**
37
+ * Get keys to skip for a specific language
38
+ */
39
+ declare function getSkipKeysForLang(skipKeys: Record<string, string[]> | undefined, lang: string): Set<string>;
40
+ /**
41
+ * Deep merge two objects, with source values overriding target values
42
+ */
43
+ declare function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown>;
44
+ /**
45
+ * Remove keys from a nested object using flattened key notation (e.g., "greeting.hello")
46
+ */
47
+ declare function removeKeysFromObject(obj: Record<string, unknown>, keysToRemove: string[]): Record<string, unknown>;
48
+ /**
49
+ * Remove any keys from target that don't exist in source (to keep target in sync with source structure)
50
+ */
51
+ declare function removeExtraKeys(targetObj: Record<string, unknown>, sourceKeys: Set<string>): Record<string, unknown>;
52
+ /**
53
+ * Compute target file path by replacing source language with target language.
54
+ * Handles both directory-based (locales/en/file.json) and flat (locales/en.json) structures.
55
+ * Also supports Flutter ARB files with underscore naming (app_en.arb → app_ko.arb).
56
+ * Also supports iOS/macOS .lproj directories (en.lproj/Localizable.strings → de.lproj/Localizable.strings).
57
+ */
58
+ declare function computeTargetFilePath(sourcePath: string, sourceLang: string, targetLang: string): string | null;
30
59
  /**
31
60
  * Register the sync_translations tool with the MCP server
32
61
  */
33
62
  export declare function registerSyncTranslations(server: McpServer): void;
34
- export {};
63
+ export { computeTargetFilePath, deepMerge, removeExtraKeys, removeKeysFromObject, getSkipKeysForLang, };
35
64
  //# sourceMappingURL=sync-translations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-translations.d.ts","sourceRoot":"","sources":["../../src/tools/sync-translations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDzE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAqB1B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AA8N3E;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAk1BhE"}
1
+ {"version":3,"file":"sync-translations.d.ts","sourceRoot":"","sources":["../../src/tools/sync-translations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmDzE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC1B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAmE3E;;GAEG;AACH,iBAAS,kBAAkB,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAC9C,IAAI,EAAE,MAAM,GACX,GAAG,CAAC,MAAM,CAAC,CAIb;AAED;;GAEG;AACH,iBAAS,SAAS,CAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BzB;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB;AAED;;GAEG;AACH,iBAAS,eAAe,CACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAyCf;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAi4BhE;AAGD,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,CAAC"}