Skip to content

Commit 8523b7b

Browse files
docs-botCopilotheiskr
authored
fix(translations): add new Liquid corruption correction patterns (2026-04-20) (#60856)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Kevin Heis <heiskr@users.noreply.github.com>
1 parent c1af815 commit 8523b7b

2 files changed

Lines changed: 163 additions & 0 deletions

File tree

src/languages/lib/correct-translation-content.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ export function correctTranslatedContentStrings(
2626
// Remove colon prefix on Liquid tags: `{%:` → `{%`
2727
content = content.replace(/\{%:/g, '{%')
2828

29+
// `{% siVersion X %}` — Spanish "si" (if) fused with "Version" = ifversion
30+
content = content.replaceAll('{% siVersion ', '{% ifversion ')
31+
content = content.replaceAll('{%- siVersion ', '{%- ifversion ')
32+
2933
content = content.replaceAll('{% vulnerables variables.', '{% data variables.')
3034
content = content.replaceAll('{% datos variables', '{% data variables')
3135
content = content.replaceAll('{% de datos variables', '{% data variables')
@@ -235,9 +239,17 @@ export function correctTranslatedContentStrings(
235239
}
236240

237241
if (context.code === 'pt') {
242+
// `{%–` — en-dash (U+2013) used instead of hyphen in `{%-` trim modifier
243+
content = content.replaceAll('{%–', '{%-')
244+
238245
content = content.replaceAll('{% dados variables', '{% data variables')
239246
content = content.replaceAll('{% de dados variables', '{% data variables')
240247
content = content.replaceAll('{% dados reusables', '{% data reusables')
248+
// `{% dadosvariables` / `{% datavariables` — no space between "dados"/"data" and "variables"
249+
content = content.replaceAll('{% dadosvariables', '{% data variables')
250+
content = content.replaceAll('{%- dadosvariables', '{%- data variables')
251+
content = content.replaceAll('{% datavariables', '{% data variables')
252+
content = content.replaceAll('{%- datavariables', '{%- data variables')
241253
// Fully translated reusables path: `{% dados reutilizáveis.X.Y %}` → `{% data reusables.X.Y %}`
242254
content = content.replaceAll('{% dados reutilizáveis.', '{% data reusables.')
243255
// Translated path segment inside reusables path: `repositórios` → `repositories`
@@ -292,6 +304,9 @@ export function correctTranslatedContentStrings(
292304
if (context.code === 'zh') {
293305
content = content.replaceAll('{% 数据variables', '{% data variables')
294306
content = content.replaceAll('{% 数据 variables', '{% data variables')
307+
// `{%数据variables` — no space between `{%` and 数据 (data)
308+
content = content.replaceAll('{%数据variables', '{% data variables')
309+
content = content.replaceAll('{%数据 variables', '{% data variables')
295310
// Order matters: the more specific `s.` variant must run first to
296311
// avoid the broader rule producing a double-s (`reusabless`).
297312
content = content.replaceAll('{% 数据可重用s.', '{% data reusables.')
@@ -467,6 +482,12 @@ export function correctTranslatedContentStrings(
467482
content = content.replaceAll('{% données variables', '{% data variables')
468483
content = content.replaceAll('{% données réutilisables.', '{% data reusables.')
469484
content = content.replaceAll('{% variables de données.', '{% data variables.')
485+
// `{% de données variables.` — preposition "de" prepended to "données variables"
486+
content = content.replaceAll('{% de données variables.', '{% data variables.')
487+
content = content.replaceAll('{%- de données variables.', '{%- data variables.')
488+
// `{% de data variables.` — partially-corrected form (données already fixed to data)
489+
content = content.replaceAll('{% de data variables.', '{% data variables.')
490+
content = content.replaceAll('{%- de data variables.', '{%- data variables.')
470491
content = content.replaceAll('{% autre %}', '{% else %}')
471492
content = content.replaceAll('{%- autre %}', '{%- else %}')
472493
content = content.replaceAll('{% brut %}', '{% raw %}')
@@ -571,6 +592,10 @@ export function correctTranslatedContentStrings(
571592
content = content.replaceAll('{% 옥티콘 ', '{% octicon ')
572593
content = content.replaceAll('{%- 옥티콘 ', '{%- octicon ')
573594

595+
// `{% data Variables.` — capital V in "Variables" (Korean translator capitalised the word)
596+
content = content.replaceAll('{% data Variables.', '{% data variables.')
597+
content = content.replaceAll('{%- data Variables.', '{%- data variables.')
598+
574599
// Korean translation of github-glossary.md
575600
content = content.replaceAll('{{ 용어집.term }}', '{{ glossary.term }}')
576601
// `{% 데이터 재사용.` — Korean translation of "data reusables" path
@@ -662,8 +687,23 @@ export function correctTranslatedContentStrings(
662687
// `{% Endnotiz %}` — "end note" = endnote
663688
content = content.replaceAll('{% Endnotiz %}', '{% endnote %}')
664689
content = content.replaceAll('{%- Endnotiz %}', '{%- endnote %}')
690+
// `{% data-variables.` — hyphen used instead of space between "data" and "variables"
691+
content = content.replaceAll('{% data-variables.', '{% data variables.')
692+
content = content.replaceAll('{%- data-variables.', '{%- data variables.')
693+
// `{%- Datenworkflow variables.` — compound "Datenworkflow" (data workflow) = data
694+
content = content.replaceAll('{%- Datenworkflow variables.', '{%- data variables.')
695+
content = content.replaceAll('{% Datenworkflow variables.', '{% data variables.')
696+
// `{% ifec ` — truncated/corrupted form of "ifversion"
697+
content = content.replaceAll('{% ifec ', '{% ifversion ')
698+
content = content.replaceAll('{%- ifec ', '{%- ifversion ')
699+
// `{% andere %}` / `{%- andere %}` — German "andere" (other) = else
700+
content = content.replaceAll('{% andere %}', '{% else %}')
701+
content = content.replaceAll('{%- andere %}', '{%- else %}')
665702
// `{% Dateninstanz` — "data instance" = data
666703
content = content.replaceAll('{% Dateninstanz ', '{% data ')
704+
// `{% Datenauflistung ` — "data listing" (compound) = data
705+
content = content.replaceAll('{% Datenauflistung ', '{% data ')
706+
content = content.replaceAll('{%- Datenauflistung ', '{%- data ')
667707
// `{% ifversion-Sicherheitskonfigurationen %}` — hyphenated compound
668708
content = content.replaceAll(
669709
'{% ifversion-Sicherheitskonfigurationen %}',
@@ -731,6 +771,20 @@ export function correctTranslatedContentStrings(
731771
content = content.replaceAll('{% dada variables', '{% data variables')
732772
content = content.replaceAll('{% % data', '{% data')
733773

774+
// Leading dot in `{% data` paths: `{% data .variables.X %}` / `{% data .reusables.X %}`
775+
// — translator inserted a stray dot. Affects ja, pt, zh.
776+
content = content.replaceAll('{% data .variables.', '{% data variables.')
777+
content = content.replaceAll('{%- data .variables.', '{%- data variables.')
778+
content = content.replaceAll('{% data .reusables.', '{% data reusables.')
779+
content = content.replaceAll('{%- data .reusables.', '{%- data reusables.')
780+
781+
// Singular "variable" / "reusable" in `{% data` paths:
782+
// `{% data variable.product.X %}` → `{% data variables.product.X %}` (es, zh)
783+
content = content.replaceAll('{% data variable.', '{% data variables.')
784+
content = content.replaceAll('{%- data variable.', '{%- data variables.')
785+
content = content.replaceAll('{% data reusable.', '{% data reusables.')
786+
content = content.replaceAll('{%- data reusable.', '{%- data reusables.')
787+
734788
// Double-quote corruption in href attributes
735789
content = content.replace(/href=""https:\/\//g, 'href="https://')
736790

src/languages/tests/correct-translation-content.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ describe('correctTranslatedContentStrings', () => {
131131
'{% data reusables.profile.access_org %}',
132132
)
133133
})
134+
135+
test('fixes siVersion → ifversion', () => {
136+
expect(fix('{% siVersion productos-ghas %}', 'es')).toBe('{% ifversion productos-ghas %}')
137+
expect(fix('{%- siVersion productos-ghas %}', 'es')).toBe('{%- ifversion productos-ghas %}')
138+
})
134139
})
135140

136141
// ─── JAPANESE (ja) ──────────────────────────────────────────────────
@@ -318,6 +323,26 @@ describe('correctTranslatedContentStrings', () => {
318323
)
319324
})
320325

326+
test('fixes en-dash in trim modifier', () => {
327+
// `{%–` — en-dash (U+2013) used instead of hyphen in `{%-` trim modifier
328+
expect(fix('{%– ifversion projects-v1 %}', 'pt')).toBe('{%- ifversion projects-v1 %}')
329+
expect(fix('{%– endif %}', 'pt')).toBe('{%- endif %}')
330+
})
331+
332+
test('fixes datavariables / dadosvariables (no space)', () => {
333+
// `{% datavariables` — no space between "data" and "variables" (post-translation)
334+
expect(fix('{% datavariables.product.github %}', 'pt')).toBe(
335+
'{% data variables.product.github %}',
336+
)
337+
expect(fix('{%- datavariables.product.github %}', 'pt')).toBe(
338+
'{%- data variables.product.github %}',
339+
)
340+
// `{% dadosvariables` — Portuguese "dados" fused with "variables"
341+
expect(fix('{% dadosvariables.product.github %}', 'pt')).toBe(
342+
'{% data variables.product.github %}',
343+
)
344+
})
345+
321346
test('fixes translated else variants', () => {
322347
expect(fix('{% senão %}', 'pt')).toBe('{% else %}')
323348
expect(fix('{%- senão %}', 'pt')).toBe('{%- else %}')
@@ -434,6 +459,13 @@ describe('correctTranslatedContentStrings', () => {
434459
'{% data variables.product.github %}',
435460
)
436461
expect(fix('{% 数据可重用s.foo %}', 'zh')).toBe('{% data reusables.foo %}')
462+
// No space between `{%` and 数据
463+
expect(fix('{%数据variables.product.github%}', 'zh')).toBe(
464+
'{% data variables.product.github%}',
465+
)
466+
expect(fix('{%数据 variables.product.github%}', 'zh')).toBe(
467+
'{% data variables.product.github%}',
468+
)
437469
})
438470

439471
test('fixes translated else and raw', () => {
@@ -687,6 +719,14 @@ describe('correctTranslatedContentStrings', () => {
687719
'{% data variables.product.github %}',
688720
)
689721
expect(fix('{% données reusables.foo %}', 'fr')).toBe('{% data reusables.foo %}')
722+
// `{% de données variables.` — preposition "de" prepended
723+
expect(fix('{% de données variables.product.github %}', 'fr')).toBe(
724+
'{% data variables.product.github %}',
725+
)
726+
// `{% de data variables.` — partially-corrected form
727+
expect(fix('{% de data variables.product.github %}', 'fr')).toBe(
728+
'{% data variables.product.github %}',
729+
)
690730
})
691731

692732
test('fixes translated else', () => {
@@ -889,6 +929,15 @@ describe('correctTranslatedContentStrings', () => {
889929
expect(fix('{% 주석 끝 %}', 'ko')).toBe('{% endnote %}')
890930
expect(fix('{%- 주석 끝 %}', 'ko')).toBe('{%- endnote %}')
891931
})
932+
933+
test('fixes capitalized Variables → data variables', () => {
934+
expect(fix('{% data Variables.product.github %}', 'ko')).toBe(
935+
'{% data variables.product.github %}',
936+
)
937+
expect(fix('{%- data Variables.product.github %}', 'ko')).toBe(
938+
'{%- data variables.product.github %}',
939+
)
940+
})
892941
})
893942

894943
// ─── GERMAN (de) ──────────────────────────────────────────────────
@@ -1088,6 +1137,44 @@ describe('correctTranslatedContentStrings', () => {
10881137
'{% ifversion enterprise-installed-apps %}',
10891138
)
10901139
})
1140+
1141+
test('fixes data-variables (hyphen instead of space)', () => {
1142+
expect(fix('{% data-variables.product.github %}', 'de')).toBe(
1143+
'{% data variables.product.github %}',
1144+
)
1145+
expect(fix('{%- data-variables.product.github %}', 'de')).toBe(
1146+
'{%- data variables.product.github %}',
1147+
)
1148+
})
1149+
1150+
test('fixes Datenworkflow variables → data variables', () => {
1151+
expect(fix('{%- Datenworkflow variables.product.prodname_actions %}', 'de')).toBe(
1152+
'{%- data variables.product.prodname_actions %}',
1153+
)
1154+
expect(fix('{% Datenworkflow variables.product.prodname_actions %}', 'de')).toBe(
1155+
'{% data variables.product.prodname_actions %}',
1156+
)
1157+
})
1158+
1159+
test('fixes ifec → ifversion', () => {
1160+
expect(fix('{% ifec ghec %}', 'de')).toBe('{% ifversion ghec %}')
1161+
expect(fix('{%- ifec ghec %}', 'de')).toBe('{%- ifversion ghec %}')
1162+
})
1163+
1164+
test('fixes andere → else', () => {
1165+
expect(fix('{% andere %}', 'de')).toBe('{% else %}')
1166+
expect(fix('{%- andere %}', 'de')).toBe('{%- else %}')
1167+
})
1168+
1169+
test('fixes Datenauflistung → data', () => {
1170+
// `{% Datenauflistung variables.X %}` — "data listing" compound = data
1171+
expect(fix('{% Datenauflistung variables.product.github %}', 'de')).toBe(
1172+
'{% data variables.product.github %}',
1173+
)
1174+
expect(fix('{%- Datenauflistung variables.product.github %}', 'de')).toBe(
1175+
'{%- data variables.product.github %}',
1176+
)
1177+
})
10911178
})
10921179

10931180
describe('Generic fixes (all languages)', () => {
@@ -1108,6 +1195,28 @@ describe('correctTranslatedContentStrings', () => {
11081195
)
11091196
})
11101197

1198+
test('fixes leading dot in {% data paths', () => {
1199+
// `{% data .variables.X %}` — translator inserted a stray dot
1200+
expect(fix('{% data .variables.product.prodname_ghe_server %}', 'ja')).toBe(
1201+
'{% data variables.product.prodname_ghe_server %}',
1202+
)
1203+
expect(fix('{%- data .variables.product.github %}', 'pt')).toBe(
1204+
'{%- data variables.product.github %}',
1205+
)
1206+
expect(fix('{% data .reusables.foo.bar %}', 'zh')).toBe('{% data reusables.foo.bar %}')
1207+
})
1208+
1209+
test('fixes singular variable / reusable in {% data paths', () => {
1210+
// `{% data variable.product.X %}` (singular) → `{% data variables.product.X %}`
1211+
expect(fix('{% data variable.product.prodname_container_registry %}', 'zh')).toBe(
1212+
'{% data variables.product.prodname_container_registry %}',
1213+
)
1214+
expect(fix('{%- data variable.product.github %}', 'es')).toBe(
1215+
'{%- data variables.product.github %}',
1216+
)
1217+
expect(fix('{% data reusable.foo.bar %}', 'fr')).toBe('{% data reusables.foo.bar %}')
1218+
})
1219+
11111220
test('fixes capitalized platform tags across all languages', () => {
11121221
expect(fix('{% Windows %}', 'zh')).toBe('{% windows %}')
11131222
expect(fix('{% Eclipse %}', 'zh')).toBe('{% eclipse %}')

0 commit comments

Comments
 (0)