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
48 lines
1.7 KiB
TypeScript
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 };
|
|
}
|