diff --git a/extension/_locales/en/messages.json b/extension/_locales/en/messages.json index 3d67009..f83971c 100644 --- a/extension/_locales/en/messages.json +++ b/extension/_locales/en/messages.json @@ -8,91 +8,183 @@ "description": "Description of the extension." }, "testUA": { - "message": "Test UA", - "description": "" + "message": "Test UA" }, "userAgentSwitcherandManagerOptions": { - "message": "User-Agent Switcher and Manager :: Options", - "description": "" + "message": "User-Agent Switcher and Manager :: Options" }, "blackListMode": { - "message": "Black-List Mode", - "description": "" + "message": "Black-List Mode" }, "description": { - "message": "Description", - "description": "" + "message": "Description" }, "blackListModeDescription": { - "message": "Apply the custom user-agent string to all tabs except the tabs with the following top-level hostnames (comma-separated list of hostnames). Note that even if a window-based user-agent string is set from the toolbar popup, your browser's default user-agent string is used.", - "description": "" + "message": "Apply the custom user-agent string to all tabs except the tabs with the following top-level hostnames (comma-separated list of hostnames). Note that even if a window-based user-agent string is set from the toolbar popup, your browser's default user-agent string is used." }, "whiteListMode": { - "message": "White-List Mode", - "description": "" + "message": "White-List Mode" }, "whiteListModeDescription": { - "message": "Only apply the custom user-agent string to the tabs with following top-level hostnames. Note that if a window-based user-agent string is set from the toolbar popup, this user-agent will overwrite the global one.", - "description": "" + "message": "Only apply the custom user-agent string to the tabs with following top-level hostnames. Note that if a window-based user-agent string is set from the toolbar popup, this user-agent will overwrite the global one." }, "customMode": { - "message": "Custom Mode", - "description": "" + "message": "Custom Mode" + }, + "customModeDescription": { + "message": "Try to resolve the user-agent string from a JSON object; otherwise either use the default user-agent string or use the one that the user is set from the popup interface. Use \"*\" as the hostname to match all domains. You can randomly select from multiple user-agent strings by providing an array instead of a fixed string. If there is a \"_\" key in your JSON object which refers to an array of hostnames, then the extension only randomly selects the user-agent string once for each hostname inside this list. This is useful if you don't want the random user-agent to change until this browser session is over." + }, + "insertSample": { + "message": "Insert a sample" }, "cache": { - "message": "Use caching to improve performance (recommended value is true). Uncheck this option only if you are using the custom mode and also you need the user-agent string to be altered from the provided list on every single request.", - "description": "" + "message": "Use caching to improve performance (recommended value is true). Uncheck this option only if you are using the custom mode and also you need the user-agent string to be altered from the provided list on every single request." }, "exactMatch": { - "message": "Use exact matching (if checked, you will need to insert all sub-domains in the white-list and black-list modes to be considered. If unchecked, all the sub-domains are passing the matching condition (e.g: www.google.com passes the matching if google.com is in the list))", - "description": "" + "message": "Use exact matching (if checked, you will need to insert all sub-domains in the white-list and black-list modes to be considered. If unchecked, all the sub-domains are passing the matching condition (e.g: www.google.com passes the matching if google.com is in the list))" }, "faqs": { - "message": "Open FAQs page on updates", - "description": "" + "message": "Open FAQs page on updates" }, "log": { - "message": "Display debugging info in the browser console", - "description": "" + "message": "Display debugging info in the browser console" }, "disableSpoofing": { - "message": "Disable Spoofing", - "description": "" + "message": "Disable Spoofing" }, "disableSpoofingDescription": { - "message": "A comma-separated list of keywords that the extension should not spoof the user-agent header. Use this list to protect URLs that contain these protected keywords. Each keyword need to be at least 5 char long.", - "description": "" + "message": "A comma-separated list of keywords that the extension should not spoof the user-agent header. Use this list to protect URLs that contain these protected keywords. Each keyword need to be at least 5 char long." }, "customUserAgentParsing": { - "message": "Custom User-Agent Parsing", - "description": "" + "message": "Custom User-Agent Parsing" + }, + "customUserAgentParsingDescription": { + "message": "A JSON object to bypass the internal user-agent string parsing method. The keys are the actual user-agent strings and the value of each key is an object of the keys that need to be set for the \"navigator\" object. You can use the \"[delete]\" keyword if you want a key in the \"navigator\" object to get deleted." }, "siblingHostnames": { - "message": "Sibling Hostnames", - "description": "" + "message": "Sibling Hostnames" + }, + "siblingHostnamesDescription": { + "message": "A JSON array that contains one or more groups of hostnames to have a single user-agent string per group. For all hostnames in one group, the user-agent string calculation only occurs once, and all the other members use the same calculated string. This is useful to make sure a group of connected websites only access to the same user-agent string." }, "importSettings": { - "message": "Import Settings", - "description": "" + "message": "Import Settings" }, "exportSettings": { - "message": "Export Settings", - "description": "" + "message": "Export Settings" }, "help": { - "message": "FAQs Page (Help)", - "description": "" + "message": "FAQs Page (Help)" }, "donate": { - "message": "Support Development", - "description": "" + "message": "Support Development" }, "reset": { - "message": "Reset", - "description": "" + "message": "Reset" }, "save": { - "message": "Save", - "description": "" + "message": "Save" + }, + "managedStorage": { + "message": "This extension supports managed storage so that preferences can be altered automatically or can be pre-configured by a domain administrator. Read the FAQs page for more info." + }, + "options": { + "message": "Options" + }, + "optionsTitle": { + "message": "Open options page" + }, + "restart": { + "message": "Restart" + }, + "restartTitle": { + "message": "Click to reload the extension. This will cause all the window-based user-agent strings to be cleared" + }, + "refreshTab": { + "message": "Refresh Tab" + }, + "refreshTabTitle": { + "message": "Refresh the current page" + }, + "reset": { + "message": "Reset" + }, + "resetTitle": { + "message": "Reset browser's user-agent string to the default one. This will not reset window-based UA strings. To reset them, use the 'Restart' button" + }, + "testUA": { + "message": "Test UA" + }, + "testUATitle": { + "message": "Test your user-agent string" + }, + "considerContainers": { + "message": "Consider Containers" + }, + "considerContainersTitle": { + "message": "Allow the extension to access your browser's containers. If this permission is granted, tabs inside isolated containers do not follow the default container's user-agent string. You need to set this string for each new container." + }, + "applyActiveWindow": { + "message": "Apply (active window)" + }, + "applyActiveWindowTitle": { + "message": "Set this user-agent string for all tabs inside the current window" + }, + "applyAllWindows": { + "message": "Apply (all windows)" + }, + "applyAllWindowsTitle": { + "message": "Set this user-agent string as the browser's User-Agent string" + }, + "applyContainer": { + "message": "Apply (container)" + }, + "applyContainerTitle": { + "message": "Set this user-agent string as the current container's User-Agent string" + }, + "applyContainerWindow": { + "message": "Apply (container on window)" + }, + "applyContainerWindowTitle": { + "message": "Set this user-agent string for all tabs inside the current window's container" + }, + "resetContainer": { + "message": "Reset (container)" + }, + "resetContainerTitle": { + "message": "Reset the container's user-agent string to the default one. This will not reset window-based UA strings. To reset them, use the 'Restart' button" + }, + "oscpuTitle": { + "message": "This is a readonly field. Use options page for custom parsing." + }, + "appVersionTitle": { + "message": "This is a readonly field. Use options page for custom parsing." + }, + "platformTitle": { + "message": "This is a readonly field. Use options page for custom parsing." + }, + "vendorTitle": { + "message": "This is a readonly field. Use options page for custom parsing." + }, + "productTitle": { + "message": "This is a readonly field. Use options page for custom parsing." + }, + "uaTitle": { + "message": "To set a blank user-agent string, use the 'empty' keyword. To construct a custom user-agent string based on the current browser's navigator object, use ${} notation. Whatever is inside this notation is read from the 'navigator' object. For instance, to append a string to the default user-agent, use '${userAgent} THIS IS THE APPENDED STRING'" + }, + "uaPlaceholder": { + "message": "Your preferred user-agent string" + }, + "msgDefaultUA": { + "message": "Default UA, press the reset button instead" + }, + "msgUASet": { + "message": "User-Agent is Set" + }, + "msgDisabledOnContainer": { + "message": "Disabled on this container. Uses the default user-agent string" + }, + "msgDisabled": { + "message": "Disabled. Uses the default user-agent string" } -} \ No newline at end of file +} diff --git a/extension/data/options/index.html b/extension/data/options/index.html index ea732c7..455b371 100644 --- a/extension/data/options/index.html +++ b/extension/data/options/index.html @@ -1,7 +1,7 @@ - User-Agent Switcher and Manager :: Options + User-Agent Switcher and Manager :: Options @@ -9,70 +9,70 @@
- - Description + + Description
- +
- - Description + + Description
- +
- - Description + + Description
- +
- + - + - + - +
-

Disable Spoofing

- Description +

Disable Spoofing

+ Description
- +
-

Custom User-Agent Parsing

- Description +

Custom User-Agent Parsing

+ Description
- +
-

Sibling Hostnames

- Description +

Sibling Hostnames

+ Description
- + -
This extension supports managed storage. All the preferences can be pre-configured by the domain administrator
+
This extension supports managed storage. All the preferences can be pre-configured by the domain administrator
- - + +
- - - - + + + +
diff --git a/extension/data/options/index.js b/extension/data/options/index.js index c6be5a6..81e722e 100644 --- a/extension/data/options/index.js +++ b/extension/data/options/index.js @@ -1,5 +1,14 @@ 'use strict'; +// localization +document.querySelectorAll('[data-localize]').forEach(e => { + const ref = e.dataset.localize; + const translated = chrome.i18n.getMessage(ref); + if (translated) { + e.textContent = translated; + } +}); + function notify(msg, period = 750) { // Update status to let user know options were saved. const status = document.getElementById('status'); @@ -258,15 +267,3 @@ document.getElementById('toggle-parser-desc').addEventListener('click', () => { document.getElementById('toggle-sibling-desc').addEventListener('click', () => { document.querySelector('[for="toggle-sibling-desc"]').classList.toggle('hidden'); }); - - -const textElements = document.querySelectorAll('[data-localize]'); -textElements.forEach((e) => { - const ref = e.dataset.localize; - if (ref) { - const translated= ref.replace(/__MSG_(\w+)__/g, (match, theGroup) => chrome.i18n.getMessage(theGroup)); - if (translated) { - e.innerText = translated; - } - } -}); diff --git a/extension/data/popup/index.html b/extension/data/popup/index.html index 7bb6b15..c22a30f 100644 --- a/extension/data/popup/index.html +++ b/extension/data/popup/index.html @@ -78,7 +78,7 @@ userAgent
- +
@@ -86,7 +86,7 @@ appVersion
- +
@@ -94,13 +94,13 @@ platform
- +
vendor
- +
@@ -108,13 +108,13 @@ product
- +
oscpu
- +
@@ -122,14 +122,14 @@
- - - - - - - - + + + + + + + +
diff --git a/extension/data/popup/index.js b/extension/data/popup/index.js index 6e7f778..f259e15 100644 --- a/extension/data/popup/index.js +++ b/extension/data/popup/index.js @@ -1,5 +1,22 @@ 'use strict'; +// localization +document.querySelectorAll('[data-localized-value]').forEach(e => { + const ref = e.dataset.localizedValue; + const translated = chrome.i18n.getMessage(ref); + if (translated) { + e.value = translated; + } +}); + +document.querySelectorAll('[data-localized-title]').forEach(e => { + const ref = e.dataset.localizedTitle; + const translated = chrome.i18n.getMessage(ref); + if (translated) { + e.title = translated; + } +}); + const DCSI = 'firefox-default'; document.body.dataset.android = navigator.userAgent.indexOf('Android') !== -1; @@ -14,16 +31,16 @@ chrome.tabs.query({ tab = tbs[0]; if ('cookieStoreId' in tab) { const apply = document.querySelector('[data-cmd="apply"]'); - apply.value = 'Apply (container)'; - apply.title = 'Set this user-agent string as the current container\'s User-Agent string'; + apply.value = chrome.i18n.getMessage('applyContainer'); + apply.title = chrome.i18n.getMessage('applyContainerTitle'); const w = document.querySelector('[data-cmd="window"]'); - w.value = 'Apply (container on window)'; - w.title = 'Set this user-agent string for all tabs inside the current window\'s container'; + w.value = chrome.i18n.getMessage('applyContainerWindow'); + w.title = chrome.i18n.getMessage('applyContainerWindowTitle'); const reset = document.querySelector('[data-cmd="reset"]'); - reset.value = 'Reset (container)'; - reset.title = 'Reset the container\'s user-agent string to the default one. This will not reset window-based UA strings. To reset them, use the \'Restart\' button'; + reset.value = chrome.i18n.getMessage('resetContainer'); + reset.title = chrome.i18n.getMessage('resetContainerTitle'); } } }); @@ -251,10 +268,10 @@ document.addEventListener('click', ({target}) => { if (cmd === 'apply') { const value = document.getElementById('ua').value; if (value === navigator.userAgent) { - msg('Default UA, press the reset button instead'); + msg(chrome.i18n.getMessage('msgDefaultUA')); } else { - msg('User-Agent is Set'); + msg(chrome.i18n.getMessage('msgUASet')); } if (value !== navigator.userAgent) { // prevent a container ua string from overwriting the default one @@ -296,13 +313,13 @@ document.addEventListener('click', ({target}) => { chrome.storage.local.set(prefs); }); - msg('Disabled on this container. Uses the default user-agent string'); + msg(chrome.i18n.getMessage('msgDisabledOnContainer')); } else { chrome.storage.local.set({ ua: '' }); - msg('Disabled. Uses the default user-agent string'); + msg(chrome.i18n.getMessage('msgDisabled')); } } else if (cmd === 'refresh') { @@ -357,7 +374,7 @@ document.getElementById('ua').addEventListener('keyup', e => { }); /* container support */ -document.querySelector('[data-cmd="container"]').addEventListener('click', e => { +document.querySelector('[data-cmd="container"]').addEventListener('click', () => { chrome.permissions.request({ permissions: ['cookies'] }, granted => { diff --git a/store/store.txt b/store/store.txt new file mode 100644 index 0000000..be471e8 --- /dev/null +++ b/store/store.txt @@ -0,0 +1,30 @@ +Usage example: You can alter your user-agent string to indicate you’re on a mobile device if you prefer seeing mobile versions of sites so they load quicker. + +-- + +This extension allows you to spoof your browser "user-agent" string to a custom designation, making it impossible for websites to know specific details about your browsing arrangement. + +Overview: +https://www.youtube.com/watch?v=4M6_Zc4o1MQ + +Notes: +1. You can easily set custom "user-agent" strings from the toolbar popup +2. The extension uses a two-factor technique to mimic your default "user-agent" string, which is the most reliable method +3. The extension does not use any resources when it is not spoofing the user-agent +4. The extension enables user-agent spoofing on specific domains only; it is conversely possible to exclude certain domains from spoofing. Check the Options page for more info. +5. You can set per-site user-agent strings +6. There is an option to randomize user-agent strings. +7. It is possible to set the user-agent string for a single-window; you can have a separate user-agent string for each browser window +8. This extension supports managed storage so that preferences can be altered automatically or can be pre-configured by a domain administrator + +Supported operating systems: +Windows, Mac OS, Linux, Chromium OS, Ubuntu, Debian, Android, iOS, AmigaOS, OpenBSD, BeOS, Haiku, Solaris, NetBSD, FreeBSD, Slackware, SUSE, gentoo, Fedora, Gentoo, Mageia, CentOS, Mint, DragonFly, Kubuntu, Mandriva, Zenwalk, Unix, GNU, OS/2, AIX, QNX, BEOS, RISC OS, Symbian, Nintendo, OpenSolaris, Kubuntu + +Supported browsers: +Internet Explorer, Safari, Chrome, Firefox, Opera, Edge, WebKit, Avant, Maxthon, Arora, Mozilla, Epiphany, Camino, Chimera, Chromium, Dragon, conkeror, Conkeror, Dillo, Links, Firebird, Swiftfox, Netscape, Flock, iCab, Iceape, icecat, IceCat, IceWeasel, Iron, Meleon, Konqueror, Lunascape, Lynx, MAXTHON, midori, Midori, KHTML, Mosaic, NetSurf, OmniWeb, Tablet, Mini, Phoenix, RockMelt, Safari, Browser, SeaMonkey, Slim, Webkit, w3m + +For more info and general bug reports please use: +https://add0n.com/useragent-switcher.html + +For technical bug reports please use: +https://github.com/ray-lothian/UserAgent-Switcher/