diff --git a/injected/src/features/page-context.js b/injected/src/features/page-context.js index 797daf5da1..08276dfea4 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,24 @@ export default class PageContext extends ContentFeature { listenForUrlChanges = true; init() { + this.setupActiveSelectionLanguageListener(); if (!this.shouldActivate()) { return; } this.setupListeners(); } + setupActiveSelectionLanguageListener() { + if (!this.getFeatureSettingEnabled('subscribeToActiveSelectionLanguage', 'enabled')) { + return; + } + 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..f550bf2267 --- /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})(?:-(?