diff --git a/packages/cookie-banner/src/activation.ts b/packages/cookie-banner/src/activation.ts index 47c5754d9..2a92318d0 100644 --- a/packages/cookie-banner/src/activation.ts +++ b/packages/cookie-banner/src/activation.ts @@ -13,7 +13,6 @@ // PERFORMANCE OF THIS SOFTWARE. import type { BannerTexts } from "./i18n"; -import { interpolate } from "./i18n"; import { removeCookies } from "./cookie-utils"; import { LOCK_ICON } from "./html"; @@ -155,9 +154,13 @@ function createPlaceholder( } } - const phText = texts?.placeholder_text - ? interpolate(texts.placeholder_text, { category: escapeHtml(displayLabel) }) - : `This content requires ${escapeHtml(displayLabel)} cookies.`; + let phText: string; + if (texts?.placeholder_text) { + const parts = texts.placeholder_text.split("{{category}}"); + phText = parts.map(p => escapeHtml(p)).join(`${escapeHtml(displayLabel)}`); + } else { + phText = `This content requires ${escapeHtml(displayLabel)} cookies.`; + } const phButton = texts?.placeholder_button ?? "Manage cookie preferences"; placeholder.innerHTML = [ diff --git a/packages/cookie-banner/src/themed-banner/themed-banner.ts b/packages/cookie-banner/src/themed-banner/themed-banner.ts index 9e2b3d250..df38abe61 100644 --- a/packages/cookie-banner/src/themed-banner/themed-banner.ts +++ b/packages/cookie-banner/src/themed-banner/themed-banner.ts @@ -179,7 +179,8 @@ export class ProboThemedBanner extends HTMLElement { const linkText = this.esc(texts.privacy_policy_link_text ?? "Privacy Policy"); link = `${linkText}`; } - el.innerHTML = interpolate(raw, { privacy_policy_link: link }); + const parts = raw.split("{{privacy_policy_link}}"); + el.innerHTML = parts.map(p => this.esc(p)).join(link); } else if (key === "panel_description") { el.textContent = interpolate(raw, { necessary_category: necessaryCategoryName }); } else { diff --git a/pkg/cookiebanner/service.go b/pkg/cookiebanner/service.go index 399d58eb0..c345dc889 100644 --- a/pkg/cookiebanner/service.go +++ b/pkg/cookiebanner/service.go @@ -276,6 +276,38 @@ func (r *UpsertCookieBannerTranslationRequest) Validate() error { v.Check(r.CookieBannerID, "cookie_banner_id", validator.Required(), validator.GID(coredata.CookieBannerEntityType)) v.Check(r.Language, "language", validator.Required(), validator.SafeTextNoNewLine(10)) + var flat map[string]json.RawMessage + if err := json.Unmarshal(r.Translations, &flat); err != nil { + v.Check("", "translations", validator.Required()) + return v.Error() + } + + for key, raw := range flat { + if key == "categories" { + var cats map[string]json.RawMessage + if json.Unmarshal(raw, &cats) == nil { + for catID, catRaw := range cats { + var catFields map[string]json.RawMessage + if json.Unmarshal(catRaw, &catFields) == nil { + for field, fieldRaw := range catFields { + var s string + if json.Unmarshal(fieldRaw, &s) == nil { + v.Check(s, fmt.Sprintf("translations.categories.%s.%s", catID, field), validator.NoHTML(), validator.MaxLen(2000)) + } + } + } + } + } + continue + } + + var s string + if json.Unmarshal(raw, &s) != nil { + continue + } + v.Check(s, "translations."+key, validator.NoHTML(), validator.MaxLen(2000)) + } + return v.Error() }