From 1ff19013318fbb24b9c0df527af1c78108aa61fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Thu, 23 Apr 2026 11:11:53 +0400 Subject: [PATCH] Add default cookie banner translations for fr, de, es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New banners now get French, German, and Spanish UI string translations seeded alongside English during creation. Signed-off-by: Émile Ré --- pkg/cookiebanner/defaults.go | 160 ++++++++++++++++++++++++++++------- pkg/cookiebanner/service.go | 32 +++---- 2 files changed, 146 insertions(+), 46 deletions(-) diff --git a/pkg/cookiebanner/defaults.go b/pkg/cookiebanner/defaults.go index 674b4c9e5..5d0f908c2 100644 --- a/pkg/cookiebanner/defaults.go +++ b/pkg/cookiebanner/defaults.go @@ -29,35 +29,133 @@ var defaultCategories = []struct { {"Uncategorised", "Cookies that have not been assigned to a category yet.", coredata.CookieCategoryKindUncategorised, 4}, } -var defaultUIStrings = map[string]string{ - "banner_title": "Cookie Preferences", - "banner_description": "We use cookies to improve your experience and analyze site traffic. {{privacy_policy_link}}", - "button_accept_all": "Accept all", - "button_reject_all": "Reject all", - "button_customize": "Customize", - "button_save": "Save preferences", - "panel_title": "Customise Preferences", - "panel_description": "Choose which cookie categories to allow. {{necessary_category}} cookies are always active as they are needed for the site to work.", - "label_description": "Description: {{value}}", - "label_duration": "Duration: {{value}}", - "aria_close": "Close", - "aria_show_details": "Show cookie details", - "aria_hide_details": "Hide cookie details", - "aria_cookie_settings": "Cookie settings", - "privacy_policy_link_text": "Privacy Policy", - "placeholder_text": "This content requires {{category}} cookies.", - "placeholder_button": "Manage cookie preferences", - "duration_year_one": "{{count}} year", - "duration_year_other": "{{count}} years", - "duration_month_one": "{{count}} month", - "duration_month_other": "{{count}} months", - "duration_week_one": "{{count}} week", - "duration_week_other": "{{count}} weeks", - "duration_day_one": "{{count}} day", - "duration_day_other": "{{count}} days", - "duration_hour_one": "{{count}} hour", - "duration_hour_other": "{{count}} hours", - "duration_minute_one": "{{count}} minute", - "duration_minute_other": "{{count}} minutes", - "duration_session": "session", +var defaultUIStringsByLanguage = map[string]map[string]string{ + "en": { + "banner_title": "Cookie Preferences", + "banner_description": "We use cookies to improve your experience and analyze site traffic. {{privacy_policy_link}}", + "button_accept_all": "Accept all", + "button_reject_all": "Reject all", + "button_customize": "Customize", + "button_save": "Save preferences", + "panel_title": "Customise Preferences", + "panel_description": "Choose which cookie categories to allow. {{necessary_category}} cookies are always active as they are needed for the site to work.", + "label_description": "Description: {{value}}", + "label_duration": "Duration: {{value}}", + "aria_close": "Close", + "aria_show_details": "Show cookie details", + "aria_hide_details": "Hide cookie details", + "aria_cookie_settings": "Cookie settings", + "privacy_policy_link_text": "Privacy Policy", + "placeholder_text": "This content requires {{category}} cookies.", + "placeholder_button": "Manage cookie preferences", + "duration_year_one": "{{count}} year", + "duration_year_other": "{{count}} years", + "duration_month_one": "{{count}} month", + "duration_month_other": "{{count}} months", + "duration_week_one": "{{count}} week", + "duration_week_other": "{{count}} weeks", + "duration_day_one": "{{count}} day", + "duration_day_other": "{{count}} days", + "duration_hour_one": "{{count}} hour", + "duration_hour_other": "{{count}} hours", + "duration_minute_one": "{{count}} minute", + "duration_minute_other": "{{count}} minutes", + "duration_session": "session", + }, + "fr": { + "banner_title": "Préférences de cookies", + "banner_description": "Nous utilisons des cookies pour améliorer votre expérience et analyser le trafic du site. {{privacy_policy_link}}", + "button_accept_all": "Tout accepter", + "button_reject_all": "Tout refuser", + "button_customize": "Personnaliser", + "button_save": "Enregistrer les préférences", + "panel_title": "Personnaliser les préférences", + "panel_description": "Choisissez les catégories de cookies à autoriser. Les cookies {{necessary_category}} sont toujours actifs car ils sont nécessaires au fonctionnement du site.", + "label_description": "Description : {{value}}", + "label_duration": "Durée : {{value}}", + "aria_close": "Fermer", + "aria_show_details": "Afficher les détails des cookies", + "aria_hide_details": "Masquer les détails des cookies", + "aria_cookie_settings": "Paramètres des cookies", + "privacy_policy_link_text": "Politique de confidentialité", + "placeholder_text": "Ce contenu nécessite les cookies {{category}}.", + "placeholder_button": "Gérer les préférences de cookies", + "duration_year_one": "{{count}} an", + "duration_year_other": "{{count}} ans", + "duration_month_one": "{{count}} mois", + "duration_month_other": "{{count}} mois", + "duration_week_one": "{{count}} semaine", + "duration_week_other": "{{count}} semaines", + "duration_day_one": "{{count}} jour", + "duration_day_other": "{{count}} jours", + "duration_hour_one": "{{count}} heure", + "duration_hour_other": "{{count}} heures", + "duration_minute_one": "{{count}} minute", + "duration_minute_other": "{{count}} minutes", + "duration_session": "session", + }, + "de": { + "banner_title": "Cookie-Einstellungen", + "banner_description": "Wir verwenden Cookies, um Ihre Erfahrung zu verbessern und den Website-Verkehr zu analysieren. {{privacy_policy_link}}", + "button_accept_all": "Alle akzeptieren", + "button_reject_all": "Alle ablehnen", + "button_customize": "Anpassen", + "button_save": "Einstellungen speichern", + "panel_title": "Einstellungen anpassen", + "panel_description": "Wählen Sie, welche Cookie-Kategorien zugelassen werden sollen. {{necessary_category}}-Cookies sind immer aktiv, da sie für den Betrieb der Website erforderlich sind.", + "label_description": "Beschreibung: {{value}}", + "label_duration": "Dauer: {{value}}", + "aria_close": "Schließen", + "aria_show_details": "Cookie-Details anzeigen", + "aria_hide_details": "Cookie-Details ausblenden", + "aria_cookie_settings": "Cookie-Einstellungen", + "privacy_policy_link_text": "Datenschutzrichtlinie", + "placeholder_text": "Dieser Inhalt erfordert {{category}}-Cookies.", + "placeholder_button": "Cookie-Einstellungen verwalten", + "duration_year_one": "{{count}} Jahr", + "duration_year_other": "{{count}} Jahre", + "duration_month_one": "{{count}} Monat", + "duration_month_other": "{{count}} Monate", + "duration_week_one": "{{count}} Woche", + "duration_week_other": "{{count}} Wochen", + "duration_day_one": "{{count}} Tag", + "duration_day_other": "{{count}} Tage", + "duration_hour_one": "{{count}} Stunde", + "duration_hour_other": "{{count}} Stunden", + "duration_minute_one": "{{count}} Minute", + "duration_minute_other": "{{count}} Minuten", + "duration_session": "Sitzung", + }, + "es": { + "banner_title": "Preferencias de cookies", + "banner_description": "Utilizamos cookies para mejorar su experiencia y analizar el tráfico del sitio. {{privacy_policy_link}}", + "button_accept_all": "Aceptar todo", + "button_reject_all": "Rechazar todo", + "button_customize": "Personalizar", + "button_save": "Guardar preferencias", + "panel_title": "Personalizar preferencias", + "panel_description": "Elija qué categorías de cookies permitir. Las cookies {{necessary_category}} siempre están activas ya que son necesarias para el funcionamiento del sitio.", + "label_description": "Descripción: {{value}}", + "label_duration": "Duración: {{value}}", + "aria_close": "Cerrar", + "aria_show_details": "Mostrar detalles de cookies", + "aria_hide_details": "Ocultar detalles de cookies", + "aria_cookie_settings": "Configuración de cookies", + "privacy_policy_link_text": "Política de privacidad", + "placeholder_text": "Este contenido requiere cookies de {{category}}.", + "placeholder_button": "Gestionar preferencias de cookies", + "duration_year_one": "{{count}} año", + "duration_year_other": "{{count}} años", + "duration_month_one": "{{count}} mes", + "duration_month_other": "{{count}} meses", + "duration_week_one": "{{count}} semana", + "duration_week_other": "{{count}} semanas", + "duration_day_one": "{{count}} día", + "duration_day_other": "{{count}} días", + "duration_hour_one": "{{count}} hora", + "duration_hour_other": "{{count}} horas", + "duration_minute_one": "{{count}} minuto", + "duration_minute_other": "{{count}} minutos", + "duration_session": "sesión", + }, } diff --git a/pkg/cookiebanner/service.go b/pkg/cookiebanner/service.go index 0761ff64a..d14dc64bd 100644 --- a/pkg/cookiebanner/service.go +++ b/pkg/cookiebanner/service.go @@ -545,23 +545,25 @@ func (s *Service) CreateCookieBanner( } } - defaultTranslationsJSON, err := json.Marshal(defaultUIStrings) - if err != nil { - return fmt.Errorf("cannot marshal default UI strings: %w", err) - } + for lang, uiStrings := range defaultUIStringsByLanguage { + translationsJSON, err := json.Marshal(uiStrings) + if err != nil { + return fmt.Errorf("cannot marshal default UI strings for %s: %w", lang, err) + } - defaultTranslation := &coredata.CookieBannerTranslation{ - ID: gid.New(scope.GetTenantID(), coredata.CookieBannerTranslationEntityType), - OrganizationID: banner.OrganizationID, - CookieBannerID: banner.ID, - Language: "en", - Translations: defaultTranslationsJSON, - CreatedAt: now, - UpdatedAt: now, - } + translation := &coredata.CookieBannerTranslation{ + ID: gid.New(scope.GetTenantID(), coredata.CookieBannerTranslationEntityType), + OrganizationID: banner.OrganizationID, + CookieBannerID: banner.ID, + Language: lang, + Translations: translationsJSON, + CreatedAt: now, + UpdatedAt: now, + } - if err := defaultTranslation.Insert(ctx, tx, scope); err != nil { - return fmt.Errorf("cannot insert default translation: %w", err) + if err := translation.Insert(ctx, tx, scope); err != nil { + return fmt.Errorf("cannot insert default translation for %s: %w", lang, err) + } } if _, err := s.ensureDraftVersionForBanner(ctx, tx, scope, banner.ID); err != nil {