Files
web/scripts/i18n/syncDefaultMessage/syncIntlFormatMessage.ts
Joakim Jäderberg aafad9781f Merged in feat/lokalise-rebuild (pull request #2993)
Feat/lokalise rebuild

* chore(lokalise): update translation ids

* chore(lokalise): easier to switch between projects

* chore(lokalise): update translation ids

* .

* .

* .

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* chore(lokalise): new translations

* merge

* switch to errors for missing id's

* merge

* sync translations


Approved-by: Linus Flood
2025-10-22 11:00:03 +00:00

48 lines
1.7 KiB
TypeScript

export function syncIntlFormatMessage({
translations,
fileContent,
}: {
translations: Record<string, string>;
fileContent: string;
}): { updated: boolean; fileContent: string } {
let updated = false;
const entries = Object.entries(translations);
for (const [messageId, messageValue] of entries) {
const escapedId = messageId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
// Find intl.formatMessage({...}) blocks that contain the specific id
const outerRegex = new RegExp(
`intl\\.formatMessage\\(\\s*\\{([^}]*?\\bid\\s*:\\s*['"]${escapedId}['"][^}]*?)\\}\\s*\\)`,
"gs"
);
fileContent = fileContent.replace(
outerRegex,
(fullMatch, innerObject) => {
// Find defaultMessage: '...' or "..."
const dmRegex =
/defaultMessage\s*:\s*(['"])((?:\\.|[\s\S])*?)\1/;
if (!dmRegex.test(innerObject)) return fullMatch;
const newInner = innerObject.replace(
dmRegex,
(_m: unknown, quote: string, _old: unknown) => {
// Escape backslashes first, then the surrounding quote, and newlines
const escaped = messageValue
.replace(/\\/g, "\\\\")
.replace(new RegExp(quote, "g"), `\\${quote}`)
.replace(/\n/g, "\\n");
return `defaultMessage: ${quote}${escaped}${quote}`;
}
);
updated = true;
return `intl.formatMessage({${newInner}})`;
}
);
}
return { updated, fileContent };
}