From 3960b44f99199a939a80886b96b11008c4c5f613 Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Fri, 19 Sep 2025 10:53:48 +0100 Subject: [PATCH 1/4] Migrate active selection language script --- injected/src/features/page-context.js | 10 ++++++ injected/src/features/page-context/utils.js | 40 +++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 injected/src/features/page-context/utils.js diff --git a/injected/src/features/page-context.js b/injected/src/features/page-context.js index 797daf5da1..f18cb510c4 100644 --- a/injected/src/features/page-context.js +++ b/injected/src/features/page-context.js @@ -1,6 +1,7 @@ import ContentFeature from '../content-feature.js'; import { getFaviconList } from './favicon.js'; import { isDuckAi, isBeingFramed, getTabUrl } from '../utils.js'; +import { getActiveSelectionLanguage } from './page-context/utils.js'; const MSG_PAGE_CONTEXT_RESPONSE = 'collectionResult'; function collapseWhitespace(str) { @@ -76,12 +77,21 @@ export default class PageContext extends ContentFeature { listenForUrlChanges = true; init() { + this.setupActiveSelectionLanguageListener(); if (!this.shouldActivate()) { return; } this.setupListeners(); } + setupActiveSelectionLanguageListener() { + this.messaging.subscribe('getActiveSelectionLanguage', () => { + const activeSelectionLanguage = getActiveSelectionLanguage(); + this.log.info('Active selection language', activeSelectionLanguage); + this.messaging.notify('getActiveSelectionLanguageResult', { activeSelectionLanguage }); + }); + } + setupListeners() { this.observeContentChanges(); if (this.getFeatureSettingEnabled('subscribeToCollect', 'enabled')) { diff --git a/injected/src/features/page-context/utils.js b/injected/src/features/page-context/utils.js new file mode 100644 index 0000000000..9d5c980659 --- /dev/null +++ b/injected/src/features/page-context/utils.js @@ -0,0 +1,40 @@ +export function getActiveSelectionLanguage() { + // BCP 47 language tag regex + const bcp47 = /^(?:en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang|(?(?[A-Za-z]{2,3}(?-[A-Za-z]{3}(-[A-Za-z]{3}){0,2})?|[A-Za-z]{4,8})(?:-(?