Skip to content

Commit 060680c

Browse files
feat: enable locked patterns for all buckets (#1241)
1 parent 3fd38c2 commit 060680c

File tree

4 files changed

+62
-15
lines changed

4 files changed

+62
-15
lines changed

.changeset/bright-ties-itch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"lingo.dev": minor
3+
---
4+
5+
Enable locked patterns for all buckets

packages/cli/src/cli/loaders/index.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import createMdxFrontmatterSplitLoader from "./mdx2/frontmatter-split";
4242
import createMdxCodePlaceholderLoader from "./mdx2/code-placeholder";
4343
import createLocalizableMdxDocumentLoader from "./mdx2/localizable-document";
4444
import createMdxSectionsSplit2Loader from "./mdx2/sections-split-2";
45-
import createMdxLockedPatternsLoader from "./mdx2/locked-patterns";
45+
import createLockedPatternsLoader from "./locked-patterns";
4646
import createIgnoredKeysLoader from "./ignored-keys";
4747
import createEjsLoader from "./ejs";
4848
import createEnsureKeyOrderLoader from "./ensure-key-order";
@@ -71,6 +71,7 @@ export default function createBucketLoader(
7171
case "android":
7272
return composeLoaders(
7373
createTextFileLoader(bucketPathPattern),
74+
createLockedPatternsLoader(lockedPatterns),
7475
createAndroidLoader(),
7576
createEnsureKeyOrderLoader(),
7677
createFlatLoader(),
@@ -82,6 +83,7 @@ export default function createBucketLoader(
8283
case "csv":
8384
return composeLoaders(
8485
createTextFileLoader(bucketPathPattern),
86+
createLockedPatternsLoader(lockedPatterns),
8587
createCsvLoader(),
8688
createEnsureKeyOrderLoader(),
8789
createFlatLoader(),
@@ -94,6 +96,7 @@ export default function createBucketLoader(
9496
return composeLoaders(
9597
createTextFileLoader(bucketPathPattern),
9698
createFormatterLoader(options.formatter, "html", bucketPathPattern),
99+
createLockedPatternsLoader(lockedPatterns),
97100
createHtmlLoader(),
98101
createLockedKeysLoader(lockedKeys || []),
99102
createIgnoredKeysLoader(ignoredKeys || []),
@@ -103,6 +106,7 @@ export default function createBucketLoader(
103106
case "ejs":
104107
return composeLoaders(
105108
createTextFileLoader(bucketPathPattern),
109+
createLockedPatternsLoader(lockedPatterns),
106110
createEjsLoader(),
107111
createLockedKeysLoader(lockedKeys || []),
108112
createIgnoredKeysLoader(ignoredKeys || []),
@@ -113,6 +117,7 @@ export default function createBucketLoader(
113117
return composeLoaders(
114118
createTextFileLoader(bucketPathPattern),
115119
createFormatterLoader(options.formatter, "json", bucketPathPattern),
120+
createLockedPatternsLoader(lockedPatterns),
116121
createJsonLoader(),
117122
createEnsureKeyOrderLoader(),
118123
createFlatLoader(),
@@ -125,6 +130,7 @@ export default function createBucketLoader(
125130
case "json5":
126131
return composeLoaders(
127132
createTextFileLoader(bucketPathPattern),
133+
createLockedPatternsLoader(lockedPatterns),
128134
createJson5Loader(),
129135
createEnsureKeyOrderLoader(),
130136
createFlatLoader(),
@@ -137,6 +143,7 @@ export default function createBucketLoader(
137143
case "jsonc":
138144
return composeLoaders(
139145
createTextFileLoader(bucketPathPattern),
146+
createLockedPatternsLoader(lockedPatterns),
140147
createJsoncLoader(),
141148
createEnsureKeyOrderLoader(),
142149
createFlatLoader(),
@@ -150,6 +157,7 @@ export default function createBucketLoader(
150157
return composeLoaders(
151158
createTextFileLoader(bucketPathPattern),
152159
createFormatterLoader(options.formatter, "markdown", bucketPathPattern),
160+
createLockedPatternsLoader(lockedPatterns),
153161
createMarkdownLoader(),
154162
createLockedKeysLoader(lockedKeys || []),
155163
createIgnoredKeysLoader(ignoredKeys || []),
@@ -159,6 +167,7 @@ export default function createBucketLoader(
159167
case "markdoc":
160168
return composeLoaders(
161169
createTextFileLoader(bucketPathPattern),
170+
createLockedPatternsLoader(lockedPatterns),
162171
createMarkdocLoader(),
163172
createFlatLoader(),
164173
createEnsureKeyOrderLoader(),
@@ -172,7 +181,7 @@ export default function createBucketLoader(
172181
createTextFileLoader(bucketPathPattern),
173182
createFormatterLoader(options.formatter, "mdx", bucketPathPattern),
174183
createMdxCodePlaceholderLoader(),
175-
createMdxLockedPatternsLoader(lockedPatterns),
184+
createLockedPatternsLoader(lockedPatterns),
176185
createMdxFrontmatterSplitLoader(),
177186
createMdxSectionsSplit2Loader(),
178187
createLocalizableMdxDocumentLoader(),
@@ -186,6 +195,7 @@ export default function createBucketLoader(
186195
case "po":
187196
return composeLoaders(
188197
createTextFileLoader(bucketPathPattern),
198+
createLockedPatternsLoader(lockedPatterns),
189199
createPoLoader(),
190200
createFlatLoader(),
191201
createEnsureKeyOrderLoader(),
@@ -198,6 +208,7 @@ export default function createBucketLoader(
198208
case "properties":
199209
return composeLoaders(
200210
createTextFileLoader(bucketPathPattern),
211+
createLockedPatternsLoader(lockedPatterns),
201212
createPropertiesLoader(),
202213
createLockedKeysLoader(lockedKeys || []),
203214
createIgnoredKeysLoader(ignoredKeys || []),
@@ -207,6 +218,7 @@ export default function createBucketLoader(
207218
case "xcode-strings":
208219
return composeLoaders(
209220
createTextFileLoader(bucketPathPattern),
221+
createLockedPatternsLoader(lockedPatterns),
210222
createXcodeStringsLoader(),
211223
createLockedKeysLoader(lockedKeys || []),
212224
createIgnoredKeysLoader(ignoredKeys || []),
@@ -216,6 +228,7 @@ export default function createBucketLoader(
216228
case "xcode-stringsdict":
217229
return composeLoaders(
218230
createTextFileLoader(bucketPathPattern),
231+
createLockedPatternsLoader(lockedPatterns),
219232
createXcodeStringsdictLoader(),
220233
createFlatLoader(),
221234
createEnsureKeyOrderLoader(),
@@ -228,6 +241,7 @@ export default function createBucketLoader(
228241
return composeLoaders(
229242
createTextFileLoader(bucketPathPattern),
230243
createPlutilJsonTextLoader(),
244+
createLockedPatternsLoader(lockedPatterns),
231245
createJsonLoader(),
232246
createXcodeXcstringsLoader(options.defaultLocale),
233247
createFlatLoader(),
@@ -242,6 +256,7 @@ export default function createBucketLoader(
242256
return composeLoaders(
243257
createTextFileLoader(bucketPathPattern),
244258
createPlutilJsonTextLoader(),
259+
createLockedPatternsLoader(lockedPatterns),
245260
createJsonLoader(),
246261
createXcodeXcstringsLoader(options.defaultLocale),
247262
createXcodeXcstringsV2Loader(options.defaultLocale),
@@ -257,6 +272,7 @@ export default function createBucketLoader(
257272
return composeLoaders(
258273
createTextFileLoader(bucketPathPattern),
259274
createFormatterLoader(options.formatter, "yaml", bucketPathPattern),
275+
createLockedPatternsLoader(lockedPatterns),
260276
createYamlLoader(),
261277
createFlatLoader(),
262278
createEnsureKeyOrderLoader(),
@@ -269,6 +285,7 @@ export default function createBucketLoader(
269285
return composeLoaders(
270286
createTextFileLoader(bucketPathPattern),
271287
createFormatterLoader(options.formatter, "yaml", bucketPathPattern),
288+
createLockedPatternsLoader(lockedPatterns),
272289
createYamlLoader(),
273290
createRootKeyLoader(true),
274291
createFlatLoader(),
@@ -282,6 +299,7 @@ export default function createBucketLoader(
282299
return composeLoaders(
283300
createTextFileLoader(bucketPathPattern),
284301
createFormatterLoader(options.formatter, "json", bucketPathPattern),
302+
createLockedPatternsLoader(lockedPatterns),
285303
createJsonLoader(),
286304
createEnsureKeyOrderLoader(),
287305
createFlutterLoader(),
@@ -294,6 +312,7 @@ export default function createBucketLoader(
294312
case "xliff":
295313
return composeLoaders(
296314
createTextFileLoader(bucketPathPattern),
315+
createLockedPatternsLoader(lockedPatterns),
297316
createXliffLoader(),
298317
createFlatLoader(),
299318
createEnsureKeyOrderLoader(),
@@ -305,6 +324,7 @@ export default function createBucketLoader(
305324
case "xml":
306325
return composeLoaders(
307326
createTextFileLoader(bucketPathPattern),
327+
createLockedPatternsLoader(lockedPatterns),
308328
createXmlLoader(),
309329
createFlatLoader(),
310330
createEnsureKeyOrderLoader(),
@@ -316,6 +336,7 @@ export default function createBucketLoader(
316336
case "srt":
317337
return composeLoaders(
318338
createTextFileLoader(bucketPathPattern),
339+
createLockedPatternsLoader(lockedPatterns),
319340
createSrtLoader(),
320341
createLockedKeysLoader(lockedKeys || []),
321342
createIgnoredKeysLoader(ignoredKeys || []),
@@ -335,6 +356,7 @@ export default function createBucketLoader(
335356
case "vtt":
336357
return composeLoaders(
337358
createTextFileLoader(bucketPathPattern),
359+
createLockedPatternsLoader(lockedPatterns),
338360
createVttLoader(),
339361
createLockedKeysLoader(lockedKeys || []),
340362
createIgnoredKeysLoader(ignoredKeys || []),
@@ -344,6 +366,7 @@ export default function createBucketLoader(
344366
case "php":
345367
return composeLoaders(
346368
createTextFileLoader(bucketPathPattern),
369+
createLockedPatternsLoader(lockedPatterns),
347370
createPhpLoader(),
348371
createSyncLoader(),
349372
createFlatLoader(),
@@ -355,6 +378,7 @@ export default function createBucketLoader(
355378
case "vue-json":
356379
return composeLoaders(
357380
createTextFileLoader(bucketPathPattern),
381+
createLockedPatternsLoader(lockedPatterns),
358382
createVueJsonLoader(),
359383
createSyncLoader(),
360384
createFlatLoader(),
@@ -371,6 +395,7 @@ export default function createBucketLoader(
371395
"typescript",
372396
bucketPathPattern,
373397
),
398+
createLockedPatternsLoader(lockedPatterns),
374399
createTypescriptLoader(),
375400
createFlatLoader(),
376401
createEnsureKeyOrderLoader(),
@@ -382,6 +407,7 @@ export default function createBucketLoader(
382407
case "txt":
383408
return composeLoaders(
384409
createTextFileLoader(bucketPathPattern),
410+
createLockedPatternsLoader(lockedPatterns),
385411
createTxtLoader(),
386412
createLockedKeysLoader(lockedKeys || []),
387413
createIgnoredKeysLoader(ignoredKeys || []),
@@ -392,6 +418,7 @@ export default function createBucketLoader(
392418
return composeLoaders(
393419
createTextFileLoader(bucketPathPattern),
394420
createFormatterLoader(options.formatter, "json", bucketPathPattern),
421+
createLockedPatternsLoader(lockedPatterns),
395422
createJsonLoader(),
396423
createJsonKeysLoader(),
397424
createEnsureKeyOrderLoader(),

packages/cli/src/cli/loaders/mdx2/locked-patterns.spec.ts renamed to packages/cli/src/cli/loaders/locked-patterns.spec.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { describe, it, expect } from "vitest";
2-
import createMdxLockedPatternsLoader from "./locked-patterns";
2+
import createLockedPatternsLoader from "./locked-patterns";
33
import dedent from "dedent";
44

5-
describe("MDX Locked Patterns Loader", () => {
5+
describe("Locked Patterns Loader", () => {
66
describe("Basic functionality", () => {
77
it("should do nothing when no patterns are provided", async () => {
8-
const loader = createMdxLockedPatternsLoader();
8+
const loader = createLockedPatternsLoader();
99
loader.setDefaultLocale("en");
1010

1111
const md = dedent`
@@ -33,7 +33,7 @@ describe("MDX Locked Patterns Loader", () => {
3333
});
3434

3535
it("should preserve content matching patterns", async () => {
36-
const loader = createMdxLockedPatternsLoader([
36+
const loader = createLockedPatternsLoader([
3737
"!params",
3838
"!! [\\w_]+",
3939
"!type [\\w<>\\[\\]\"',]+",
@@ -101,7 +101,7 @@ describe("MDX Locked Patterns Loader", () => {
101101

102102
describe("Real-world patterns", () => {
103103
it("should handle !hover syntax in code blocks", async () => {
104-
const loader = createMdxLockedPatternsLoader([
104+
const loader = createLockedPatternsLoader([
105105
"// !hover[\\s\\S]*?(?=\\n|$)",
106106
"// !hover\\([\\d:]+\\)[\\s\\S]*?(?=\\n|$)",
107107
]);
@@ -126,7 +126,7 @@ describe("MDX Locked Patterns Loader", () => {
126126
});
127127

128128
it("should handle !! parameter headings", async () => {
129-
const loader = createMdxLockedPatternsLoader(["!! [\\w_]+"]);
129+
const loader = createLockedPatternsLoader(["!! [\\w_]+"]);
130130
loader.setDefaultLocale("en");
131131

132132
const md = dedent`
@@ -195,7 +195,7 @@ describe("MDX Locked Patterns Loader", () => {
195195
});
196196

197197
it("should handle !type, !required, and !values declarations", async () => {
198-
const loader = createMdxLockedPatternsLoader([
198+
const loader = createLockedPatternsLoader([
199199
"!! [\\w_]+",
200200
"!type [\\w<>\\[\\]\"',]+",
201201
"!required",

packages/cli/src/cli/loaders/mdx2/locked-patterns.ts renamed to packages/cli/src/cli/loaders/locked-patterns.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import { ILoader } from "../_types";
2-
import { createLoader } from "../_utils";
3-
import { md5 } from "../../utils/md5";
4-
import _ from "lodash";
5-
import { I18nConfig } from "@lingo.dev/_spec";
1+
import { ILoader } from "./_types";
2+
import { createLoader } from "./_utils";
3+
import { md5 } from "../utils/md5";
64

75
/**
86
* Extracts content matching regex patterns and replaces it with placeholders.
@@ -46,7 +44,24 @@ function extractLockedPatterns(
4644
};
4745
}
4846

49-
export default function createMdxLockedPatternsLoader(
47+
/**
48+
* Creates a loader that preserves content matching regex patterns during translation.
49+
*
50+
* This loader extracts content matching the provided regex patterns and replaces it
51+
* with placeholders before translation. After translation, the placeholders are
52+
* restored with the original content.
53+
*
54+
* This is useful for preserving technical terms, code snippets, URLs, template
55+
* variables, and other non-translatable content within translatable files.
56+
*
57+
* Works with any string-based format (JSON, YAML, XML, Markdown, HTML, etc.).
58+
* Note: For structured formats (JSON, XML, YAML), ensure patterns only match
59+
* content within values, not structural syntax, to avoid breaking parsing.
60+
*
61+
* @param defaultPatterns - Array of regex pattern strings to match and preserve
62+
* @returns A loader that handles pattern locking/unlocking
63+
*/
64+
export default function createLockedPatternsLoader(
5065
defaultPatterns?: string[],
5166
): ILoader<string, string> {
5267
return createLoader({

0 commit comments

Comments
 (0)