Merge pull request #13231 from maxunbearable/fix/6045-custom-translate-crash

Improved safety of customTranslation placeholder parsing
This commit is contained in:
Igor Kulikov 2025-06-02 19:26:29 +03:00 committed by GitHub
commit b865d96e45
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -51,7 +51,7 @@ import cssjs from '@core/css/css';
import { isNotEmptyTbFunction } from '@shared/models/js-function.models';
import { defaultFormProperties, FormProperty } from '@shared/models/dynamic-form.models';
const i18nRegExp = new RegExp(`{${i18nPrefix}:[^{}]+}`, 'g');
const i18nRegExp = new RegExp(`{${i18nPrefix}:([^{}]+)}`, 'g');
const predefinedFunctions: { [func: string]: string } = {
Sin: 'return Math.round(1000*Math.sin(time/5000));',
@ -209,21 +209,20 @@ export class UtilsService {
}
public customTranslation(translationValue: string, defaultValue: string = translationValue): string {
if (translationValue && isString(translationValue)) {
if (translationValue.includes(`{${i18nPrefix}`)) {
const matches = translationValue.match(i18nRegExp);
let result = translationValue;
for (const match of matches) {
const translationId = match.substring(6, match.length - 1);
result = result.replace(match, this.doTranslate(translationId, match));
}
return result;
} else {
return this.doTranslate(translationValue, defaultValue, customTranslationsPrefix);
}
} else {
if (!translationValue || !isString(translationValue)) {
return translationValue;
}
if (!translationValue.includes(`{${i18nPrefix}:`)) {
return this.doTranslate(translationValue, defaultValue, customTranslationsPrefix);
}
const matches = translationValue.matchAll(i18nRegExp);
let result = translationValue;
for (const [fullMatch, translationId] of matches) {
if (translationId) {
result = result.replace(fullMatch, this.doTranslate(translationId, fullMatch));
}
}
return result;
}
private doTranslate(translationValue: string, defaultValue: string, prefix?: string): string {