PageSourceSearch

https://dedupe.ly/lang.js

js dedupe.ly collected 2026-10-03 23:33:57 UTC 4,196 bytes, 146 lines download raw bytes

1(function () {
2'use strict';
3var COOKIE = 'dw_lang';
4var DISMISSED = 'dw_lang_dismissed';
5var SIX_MONTHS_SECONDS = 60 * 60 * 24 * 183;
6function readCookie(name) {
7var match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
8return match ? decodeURIComponent(match[1]) : null;
9}
10function writeCookie(name, value) {
11document.cookie =
12name +
13'=' +
14encodeURIComponent(value) +
15'; Max-Age=' +
16SIX_MONTHS_SECONDS +
17'; Path=/; SameSite=Lax' +
18(location.protocol === 'https:' ? '; Secure' : '');
19}
20var root = document.querySelector('[data-dw-lang]');
21if (!root) return;
22var current = root.getAttribute('data-dw-current') || 'en';
23var basePath = root.getAttribute('data-dw-path') || '/';
24var available = (root.getAttribute('data-dw-available') || '')
25.split(',')
26.filter(Boolean)
27.map(function (pair) {
28var bits = pair.split(':');
29return { code: bits[0], label: bits.slice(1).join(':') };
30});
31var toggle = root.querySelector('[data-dw-lang-toggle]');
32var menu = root.querySelector('.dw-lang__menu');
33function close() {
34if (!menu || menu.hidden) return;
35menu.hidden = true;
36toggle.setAttribute('aria-expanded', 'false');
37}
38function open() {
39if (!menu) return;
40menu.hidden = false;
41toggle.setAttribute('aria-expanded', 'true');
42var first = menu.querySelector('a');
43if (first) first.focus();
44}
45if (toggle && menu) {
46toggle.addEventListener('click', function (event) {
47event.preventDefault();
48menu.hidden ? open() : close();
49});
50document.addEventListener('click', function (event) {
51if (!root.contains(event.target)) close();
52});
53document.addEventListener('keydown', function (event) {
54if (event.key === 'Escape') close();
55});
56menu.addEventListener('keydown', function (event) {
57if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
58event.preventDefault();
59var links = Array.prototype.slice.call(menu.querySelectorAll('a'));
60var index = links.indexOf(document.activeElement);
61var next = event.key === 'ArrowDown' ? index + 1 : index - 1;
62if (next < 0) next = links.length - 1;
63if (next >= links.length) next = 0;
64links[next].focus();
65});
66}
67root.addEventListener('click', function (event) {
68var link = event.target.closest('[data-dw-lang-choice]');
69if (!link) return;
70close();
71if (toggle) toggle.focus();
72writeCookie(COOKIE, link.getAttribute('data-dw-lang-choice'));
73});
74var AUTO_DETECT = true;
75function isCrawler() {
76return /bot|crawl|spider|slurp|googleother|google-inspectiontool|lighthouse|headlesschrome|facebookexternalhit|embedly|preview|archiver|monitoring/i.test(
77navigator.userAgent || ''
78);
79}
80function bare(path) {
81for (var i = 0; i < available.length; i++) {
82var code = available[i].code;
83if (code === 'en') continue;
84if (path === '/' + code) return '/';
85if (path.indexOf('/' + code + '/') === 0) return path.slice(code.length + 1);
86}
87return path;
88}
89function isLive(code) {
90for (var i = 0; i < available.length; i++) if (available[i].code === code) return true;
91return false;
92}
93function preferred() {
94var list =
95navigator.languages && navigator.languages.length
96? navigator.languages
97: [navigator.language];
98for (var i = 0; i < list.length; i++) {
99var primary = String(list[i] || '')
100.toLowerCase()
101.split('-')[0];
102if (isLive(primary)) return primary;
103}
104return null;
105}
106function readsCurrent() {
107var list =
108navigator.languages && navigator.languages.length
109? navigator.languages
110: [navigator.language];
111for (var i = 0; i < list.length; i++)
112if (
113String(list[i] || '')
114.toLowerCase()
115.split('-')[0] === current
116)
117return true;
118return false;
119}
120var chosen = readCookie(COOKIE);
121var target = null;
122if (chosen && isLive(chosen)) {
123if (chosen !== current) target = chosen;
124} else if (AUTO_DETECT && !isCrawler() && !readsCurrent()) {
125var SEEN = 'dw_lang_auto';
126var already;
127try {
128already = window.sessionStorage.getItem(SEEN);
129} catch (e) {
130already = '1';
131}
132if (!already) {
133try {
134window.sessionStorage.setItem(SEEN, '1');
135} catch (e) {
136}
137var want = preferred();
138if (want && want !== current) target = want;
139}
140}
141if (!target) return;
142var path = bare(window.location.pathname);
143var url = target === 'en' ? path : '/' + target + (path === '/' ? '' : path);
144if (url !== window.location.pathname)
145window.location.replace(url + window.location.search + window.location.hash);
146})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.