diff --git a/frontend/js/i18n/de.js b/frontend/js/i18n/de.js index 4f8bdc8..ed2e8a8 100644 --- a/frontend/js/i18n/de.js +++ b/frontend/js/i18n/de.js @@ -448,7 +448,7 @@ export default { 'settings.custom_domain': 'Benutzerdefinierte Domain', 'settings.favicon_url': 'Favicon-URL', 'settings.custom_css': 'Benutzerdefiniertes CSS (optional)', - 'settings.hide_branding': '„{brandName}"-Branding ausblenden', + 'settings.hide_branding': 'Plattform-Branding ausblenden', 'settings.save_branding': 'Branding speichern', 'settings.preview': 'Vorschau', 'settings.white_label_enterprise_only': 'Benutzerdefiniertes Branding ist im Enterprise-Plan verfügbar', diff --git a/frontend/js/i18n/en.js b/frontend/js/i18n/en.js index 6c6f259..066ecae 100644 --- a/frontend/js/i18n/en.js +++ b/frontend/js/i18n/en.js @@ -922,7 +922,7 @@ export default { 'settings.custom_domain': 'Custom Domain', 'settings.favicon_url': 'Favicon URL', 'settings.custom_css': 'Custom CSS (optional)', - 'settings.hide_branding': 'Hide "{brandName}" branding', + 'settings.hide_branding': 'Hide platform branding', 'settings.save_branding': 'Save Branding', 'settings.preview': 'Preview', 'settings.white_label_enterprise_only': 'Custom branding is available on the Enterprise plan', diff --git a/frontend/js/i18n/es.js b/frontend/js/i18n/es.js index 4abb028..04bc596 100644 --- a/frontend/js/i18n/es.js +++ b/frontend/js/i18n/es.js @@ -478,7 +478,7 @@ export default { 'settings.custom_domain': 'Dominio personalizado', 'settings.favicon_url': 'URL del favicon', 'settings.custom_css': 'CSS personalizado (opcional)', - 'settings.hide_branding': 'Ocultar la marca "{brandName}"', + 'settings.hide_branding': 'Ocultar la marca de la plataforma', 'settings.save_branding': 'Guardar branding', 'settings.preview': 'Previsualizar', 'settings.white_label_enterprise_only': 'El branding personalizado está disponible en el plan Enterprise', diff --git a/frontend/js/i18n/fr.js b/frontend/js/i18n/fr.js index b645d17..6e105e0 100644 --- a/frontend/js/i18n/fr.js +++ b/frontend/js/i18n/fr.js @@ -448,7 +448,7 @@ export default { 'settings.custom_domain': 'Domaine personnalisé', 'settings.favicon_url': 'URL du favicon', 'settings.custom_css': 'CSS personnalisé (facultatif)', - 'settings.hide_branding': 'Masquer la marque « {brandName} »', + 'settings.hide_branding': 'Masquer la marque de la plateforme', 'settings.save_branding': 'Enregistrer le branding', 'settings.preview': 'Aperçu', 'settings.white_label_enterprise_only': 'Le branding personnalisé est disponible sur le plan Enterprise', diff --git a/frontend/js/i18n/it.js b/frontend/js/i18n/it.js index 587b487..ee9d55c 100644 --- a/frontend/js/i18n/it.js +++ b/frontend/js/i18n/it.js @@ -424,7 +424,7 @@ export default { 'settings.custom_domain': 'Dominio Personalizzato', 'settings.favicon_url': 'URL Favicon', 'settings.custom_css': 'CSS Personalizzato (opzionale)', - 'settings.hide_branding': 'Nascondi marchio "{brandName}"', + 'settings.hide_branding': 'Nascondi il marchio della piattaforma', 'settings.save_branding': 'Salva Marchio', 'settings.preview': 'Anteprima', 'settings.white_label_enterprise_only': 'Il marchio personalizzato è disponibile solo nel piano Enterprise', diff --git a/frontend/js/i18n/ja.js b/frontend/js/i18n/ja.js index 25241d1..27f03c1 100644 --- a/frontend/js/i18n/ja.js +++ b/frontend/js/i18n/ja.js @@ -846,7 +846,7 @@ export default { 'settings.custom_domain': "カスタム ドメイン", 'settings.favicon_url': "ファビコンURL", 'settings.custom_css': "カスタム CSS (オプション)", - 'settings.hide_branding': "「{brandName}」ブランドを非表示にする", + 'settings.hide_branding': 'プラットフォームのブランドを非表示にする', 'settings.save_branding': "ブランディングを保存", 'settings.preview': "プレビュー", 'settings.white_label_enterprise_only': "Enterprise プランではカスタム ブランドが利用可能です", diff --git a/frontend/js/i18n/pt.js b/frontend/js/i18n/pt.js index 31415bb..2e9d723 100644 --- a/frontend/js/i18n/pt.js +++ b/frontend/js/i18n/pt.js @@ -448,7 +448,7 @@ export default { 'settings.custom_domain': 'Domínio personalizado', 'settings.favicon_url': 'URL do favicon', 'settings.custom_css': 'CSS personalizado (opcional)', - 'settings.hide_branding': 'Ocultar marca "{brandName}"', + 'settings.hide_branding': 'Ocultar a marca da plataforma', 'settings.save_branding': 'Salvar branding', 'settings.preview': 'Pré-visualizar', 'settings.white_label_enterprise_only': 'Branding personalizado disponível no plano Enterprise', diff --git a/server/test/brand-name-i18n.test.js b/server/test/brand-name-i18n.test.js index 96c38e3..d6b2ab6 100644 --- a/server/test/brand-name-i18n.test.js +++ b/server/test/brand-name-i18n.test.js @@ -31,7 +31,6 @@ const BRANDED_KEYS = [ 'device.owner_provision.constraints', 'device.terminal.welcome', 'settings.signin_err_link_already_used', - 'settings.hide_branding', 'settings.setup_step_1', 'settings.import.invalid_file', 'onboarding.step.welcome.title', @@ -39,6 +38,16 @@ const BRANDED_KEYS = [ const localeFiles = () => fs.readdirSync(I18N_DIR).filter((f) => f.endsWith('.js')); +/* + * ⚠️ DELIBERATELY NOT IN THE LIST ABOVE. + * + * settings.hide_branding used to read 'Hide "ScreenTinker" branding', and substituting the brand + * turned it into 'Hide "Acme" branding' on Acme's own instance — which is backwards: the toggle + * hides the PLATFORM's attribution, not the operator's own name. The reporter of #292 asked for + * generic wording instead, so this string names nobody at all. + */ +const GENERIC_KEY = 'settings.hide_branding'; + test('no locale hardcodes the product name in a white-labelled string', () => { const offences = []; for (const file of localeFiles()) { @@ -123,3 +132,15 @@ test('the interpolation resolves, and falls back to the product name', async () delete globalThis.localStorage; if (!priorNavigator) delete globalThis.navigator; }); + +test('the hide-branding toggle names nobody', () => { + // Neither the upstream product (the original bug) nor the operator's own brand (which would read + // as "Hide Acme branding" on Acme's instance). + for (const file of localeFiles()) { + const src = fs.readFileSync(path.join(I18N_DIR, file), 'utf8'); + const line = src.split('\n').find((l) => l.includes(`'${GENERIC_KEY}'`)); + if (!line) continue; + assert.ok(!line.includes('ScreenTinker'), `${file}: ${GENERIC_KEY} still names the product`); + assert.ok(!line.includes('{brandName}'), `${file}: ${GENERIC_KEY} should be generic wording`); + } +});