diff --git a/README.md b/README.md
index 6204affb3..240b4d20f 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,9 @@ Patterns (regular expressions) are kept in [`src/technologies/`](https://github.
"meta": {
"generator": "(?:Example|Another Example)"
},
+ "probe": {
+ "/path": ""
+ },
"scriptSrc": "example-([0-9.]+)\\.js\\;confidence:50\\;version:\\1",
"scripts": "function webpackJsonpCallback\\(data\\) {",
"url": "example\\.com",
@@ -367,6 +370,14 @@ Plus any of:
"\\.example-class" |
+
+ probe |
+ Object |
+
+ Request a URL to test for its existence or match text content (NPM driver only).
+ |
+ { "/path": "Example text" } |
+
robots |
String | Array |
diff --git a/schema.json b/schema.json
index 0ff6516c8..fcc621371 100644
--- a/schema.json
+++ b/schema.json
@@ -153,18 +153,16 @@
}
]
},
- "magento": {
- "oneOf": [
- {
- "type": "array",
- "items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
- }
+ "probe": {
+ "type": "object",
+ "additionalProperties": false,
+ "patternProperties": {
+ "^.+$": {
},
- {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "additionalProperties": {
+ "type": "string"
}
- ]
+ }
},
"certIssuer": {
"oneOf": [
diff --git a/src/categories.json b/src/categories.json
index f9f3eaa27..a5d7ab64e 100644
--- a/src/categories.json
+++ b/src/categories.json
@@ -744,6 +744,20 @@
"priority": 6
},
"108": {
+ "groups": [
+ 1
+ ],
+ "name": "Ecommerce frontends",
+ "priority": 6
+ },
+ "109": {
+ "groups": [
+ 6
+ ],
+ "name": "Domain parking",
+ "priority": 9
+ },
+ "110": {
"groups": [
1
],
diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md
index d73ec227a..5f4181513 100644
--- a/src/drivers/npm/README.md
+++ b/src/drivers/npm/README.md
@@ -21,22 +21,27 @@ wappalyzer [options]
#### Options
```
--b, --batch-size=... Process links in batches
--d, --debug Output debug messages
--t, --delay=ms Wait for ms milliseconds between requests
--h, --help This text
---html-max-cols=... Limit the number of HTML characters per line processed
---html-max-rows=... Limit the number of HTML lines processed
--D, --max-depth=... Don't analyse pages more than num levels deep
--m, --max-urls=... Exit when num URLs have been analysed
--w, --max-wait=... Wait no more than ms milliseconds for page resources to load
--P, --pretty Pretty-print JSON output
--p, --probe Perform a deeper scan by performing additional requests and inspecting DNS records
---proxy=... Proxy URL, e.g. 'http://user:pass@proxy:8080'
--r, --recursive Follow links on pages (crawler)
--a, --user-agent=... Set the user agent string
--n, --no-scripts Disabled JavaScript on web pages
--N, --no-redirect Disable cross-domain redirects
+-b, --batch-size=... Process links in batches
+-d, --debug Output debug messages
+-t, --delay=ms Wait for ms milliseconds between requests
+-h, --help This text
+-H, --header Extra header to send with requests
+--html-max-cols=... Limit the number of HTML characters per line processed
+--html-max-rows=... Limit the number of HTML lines processed
+-D, --max-depth=... Don't analyse pages more than num levels deep
+-m, --max-urls=... Exit when num URLs have been analysed
+-w, --max-wait=... Wait no more than ms milliseconds for page resources to load
+-p, --probe=[basic|full] Perform a deeper scan by performing additional requests and inspecting DNS records
+-P, --pretty Pretty-print JSON output
+--proxy=... Proxy URL, e.g. 'http://user:pass@proxy:8080'
+-r, --recursive Follow links on pages (crawler)
+-a, --user-agent=... Set the user agent string
+-n, --no-scripts Disabled JavaScript on web pages
+-N, --no-redirect Disable cross-domain redirects
+-e, --extended Output additional information
+--local-storage=... JSON object to use as local storage
+--session-storage=... JSON object to use as session storage
+
```
@@ -51,9 +56,9 @@ $ npm i wappalyzer
### Usage
```javascript
-const Wappalyzer = require('wappalyzer');
+const Wappalyzer = require('wappalyzer')
-const url = 'https://www.wappalyzer.com';
+const url = 'https://www.wappalyzer.com'
const options = {
debug: false,
@@ -81,7 +86,13 @@ const wappalyzer = new Wappalyzer(options)
// Optionally set additional request headers
const headers = {}
- const site = await wappalyzer.open(url, headers)
+ // Optionally set local and/or session storage
+ const storage = {
+ local: {}
+ session: {}
+ }
+
+ const site = await wappalyzer.open(url, headers, storage)
// Optionally capture and output errors
site.on('error', console.error)
diff --git a/src/drivers/npm/cli.js b/src/drivers/npm/cli.js
index e3b243f57..357fbf975 100755
--- a/src/drivers/npm/cli.js
+++ b/src/drivers/npm/cli.js
@@ -72,28 +72,43 @@ Examples:
docker wappalyzer/cli https://www.example.com --pretty
Options:
- -b, --batch-size=... Process links in batches
- -d, --debug Output debug messages
- -t, --delay=ms Wait for ms milliseconds between requests
- -h, --help This text
- -H, --header Extra header to send with requests
- --html-max-cols=... Limit the number of HTML characters per line processed
- --html-max-rows=... Limit the number of HTML lines processed
- -D, --max-depth=... Don't analyse pages more than num levels deep
- -m, --max-urls=... Exit when num URLs have been analysed
- -w, --max-wait=... Wait no more than ms milliseconds for page resources to load
- -p, --probe Perform a deeper scan by performing additional requests and inspecting DNS records
- -P, --pretty Pretty-print JSON output
- --proxy=... Proxy URL, e.g. 'http://user:pass@proxy:8080'
- -r, --recursive Follow links on pages (crawler)
- -a, --user-agent=... Set the user agent string
- -n, --no-scripts Disabled JavaScript on web pages
- -N, --no-redirect Disable cross-domain redirects
- -e, --extended Output additional information
+ -b, --batch-size=... Process links in batches
+ -d, --debug Output debug messages
+ -t, --delay=ms Wait for ms milliseconds between requests
+ -h, --help This text
+ -H, --header Extra header to send with requests
+ --html-max-cols=... Limit the number of HTML characters per line processed
+ --html-max-rows=... Limit the number of HTML lines processed
+ -D, --max-depth=... Don't analyse pages more than num levels deep
+ -m, --max-urls=... Exit when num URLs have been analysed
+ -w, --max-wait=... Wait no more than ms milliseconds for page resources to load
+ -p, --probe=[basic|full] Perform a deeper scan by performing additional requests and inspecting DNS records
+ -P, --pretty Pretty-print JSON output
+ --proxy=... Proxy URL, e.g. 'http://user:pass@proxy:8080'
+ -r, --recursive Follow links on pages (crawler)
+ -a, --user-agent=... Set the user agent string
+ -n, --no-scripts Disabled JavaScript on web pages
+ -N, --no-redirect Disable cross-domain redirects
+ -e, --extended Output additional information
+ --local-storage=... JSON object to use as local storage
+ --session-storage=... JSON object to use as session storage
`)
process.exit(options.help ? 0 : 1)
}
+try {
+ const { hostname } = new URL(url)
+
+ if (!hostname) {
+ throw new Error('Invalid URL')
+ }
+} catch (error) {
+ // eslint-disable-next-line no-console
+ console.log(error.message || error.toString())
+
+ process.exit(1)
+}
+
const headers = {}
if (options.header) {
@@ -106,13 +121,38 @@ if (options.header) {
)
}
+const storage = {
+ local: {},
+ session: {},
+}
+
+for (const type of Object.keys(storage)) {
+ if (options[`${type}Storage`]) {
+ try {
+ storage[type] = JSON.parse(options[`${type}Storage`])
+
+ if (
+ !options[`${type}Storage`] ||
+ !Object.keys(options[`${type}Storage`]).length
+ ) {
+ throw new Error('Object has no properties')
+ }
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.log(`${type}Storage error: ${error.message || error}`)
+
+ process.exit(1)
+ }
+ }
+}
+
;(async function () {
const wappalyzer = new Wappalyzer(options)
try {
await wappalyzer.init()
- const site = await wappalyzer.open(url, headers)
+ const site = await wappalyzer.open(url, headers, storage)
const results = await site.analyze()
@@ -124,10 +164,23 @@ if (options.header) {
process.exit(0)
} catch (error) {
- // eslint-disable-next-line no-console
- console.error(error)
+ try {
+ await Promise.race([
+ wappalyzer.destroy(),
+ new Promise((resolve, reject) =>
+ setTimeout(
+ () => reject(new Error('Attempt to close the browser timed out')),
+ 3000
+ )
+ ),
+ ])
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error(error.message || String(error))
+ }
- await wappalyzer.destroy()
+ // eslint-disable-next-line no-console
+ console.error(error.message || String(error))
process.exit(1)
}
diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js
index 6a2653e39..f51d288df 100644
--- a/src/drivers/npm/driver.js
+++ b/src/drivers/npm/driver.js
@@ -131,7 +131,20 @@ function getDom(page, technologies = Wappalyzer.technologies) {
dom[selector].forEach(({ exists, text, properties, attributes }) => {
nodes.forEach((node) => {
- if (exists) {
+ if (
+ technologies.filter(({ name: _name }) => _name === name)
+ .length >= 50
+ ) {
+ return
+ }
+
+ if (
+ exists &&
+ technologies.findIndex(
+ ({ name: _name, selector: _selector, exists }) =>
+ name === _name && selector === _selector && exists === ''
+ ) === -1
+ ) {
technologies.push({
name,
selector,
@@ -140,9 +153,18 @@ function getDom(page, technologies = Wappalyzer.technologies) {
}
if (text) {
- const value = node.textContent.trim()
-
- if (value) {
+ // eslint-disable-next-line unicorn/prefer-text-content
+ const value = (
+ node.textContent ? node.textContent.trim() : ''
+ ).slice(0, 1000000)
+
+ if (
+ value &&
+ technologies.findIndex(
+ ({ name: _name, selector: _selector, text }) =>
+ name === _name && selector === _selector && text === value
+ ) === -1
+ ) {
technologies.push({
name,
selector,
@@ -153,7 +175,21 @@ function getDom(page, technologies = Wappalyzer.technologies) {
if (properties) {
Object.keys(properties).forEach((property) => {
- if (Object.prototype.hasOwnProperty.call(node, property)) {
+ if (
+ Object.prototype.hasOwnProperty.call(node, property) &&
+ technologies.findIndex(
+ ({
+ name: _name,
+ selector: _selector,
+ property: _property,
+ value,
+ }) =>
+ name === _name &&
+ selector === _selector &&
+ property === _property &&
+ value === toScalar(value)
+ ) === -1
+ ) {
const value = node[property]
if (typeof value !== 'undefined') {
@@ -170,7 +206,21 @@ function getDom(page, technologies = Wappalyzer.technologies) {
if (attributes) {
Object.keys(attributes).forEach((attribute) => {
- if (node.hasAttribute(attribute)) {
+ if (
+ node.hasAttribute(attribute) &&
+ technologies.findIndex(
+ ({
+ name: _name,
+ selector: _selector,
+ attribute: _atrribute,
+ value,
+ }) =>
+ name === _name &&
+ selector === _selector &&
+ attribute === _atrribute &&
+ value === toScalar(value)
+ ) === -1
+ ) {
const value = node.getAttribute(attribute)
technologies.push({
@@ -239,7 +289,7 @@ function get(url, options = {}) {
},
},
(response) => {
- if (response.statusCode >= 400) {
+ if (response.statusCode >= 300) {
return reject(
new Error(`${response.statusCode} ${response.statusMessage}`)
)
@@ -287,7 +337,12 @@ class Driver {
this.options.debug = Boolean(+this.options.debug)
this.options.recursive = Boolean(+this.options.recursive)
- this.options.probe = Boolean(+this.options.probe)
+ this.options.probe =
+ String(this.options.probe || '').toLowerCase() === 'basic'
+ ? 'basic'
+ : String(this.options.probe || '').toLowerCase() === 'full'
+ ? 'full'
+ : Boolean(+this.options.probe) && 'full'
this.options.delay = parseInt(this.options.delay, 10)
this.options.maxDepth = parseInt(this.options.maxDepth, 10)
this.options.maxUrls = parseInt(this.options.maxUrls, 10)
@@ -355,8 +410,42 @@ class Driver {
}
}
- open(url, headers = {}) {
- return new Site(url.split('#')[0], headers, this)
+ async open(url, headers = {}, storage = {}) {
+ const site = new Site(url.split('#')[0], headers, this)
+
+ if (storage.local || storage.session) {
+ this.log('Setting storage...')
+
+ const page = await site.newPage(site.originalUrl)
+
+ await page.setRequestInterception(true)
+
+ page.on('request', (request) =>
+ request.respond({
+ status: 200,
+ contentType: 'text/plain',
+ body: 'ok',
+ })
+ )
+
+ await page.goto(url)
+
+ await page.evaluate((storage) => {
+ ;['local', 'session'].forEach((type) => {
+ Object.keys(storage[type] || {}).forEach((key) => {
+ window[`${type}Storage`].setItem(key, storage[type][key])
+ })
+ })
+ }, storage)
+
+ try {
+ await page.close()
+ } catch {
+ // Continue
+ }
+ }
+
+ return site
}
log(message, source = 'driver') {
@@ -487,50 +576,10 @@ class Site {
status: 0,
}
- if (!this.browser) {
- await this.initDriver()
-
- if (!this.browser) {
- throw new Error('Browser closed')
- }
- }
-
- let page
-
- try {
- page = await this.browser.newPage()
-
- if (!page || page.isClosed()) {
- throw new Error('Page did not open')
- }
- } catch (error) {
- error.message += ` (${url})`
-
- this.error(error)
-
- await this.initDriver()
-
- page = await this.browser.newPage()
- }
-
- this.pages.push(page)
-
- page.setJavaScriptEnabled(!this.options.noScripts)
-
- page.setDefaultTimeout(this.options.maxWait)
+ const page = await this.newPage(url)
await page.setRequestInterception(true)
- await page.setUserAgent(this.options.userAgent)
-
- page.on('dialog', (dialog) => dialog.dismiss())
-
- page.on('error', (error) => {
- error.message += ` (${url})`
-
- this.error(error)
- })
-
let responseReceived = false
page.on('request', async (request) => {
@@ -693,6 +742,15 @@ class Site {
}),
{}
)
+
+ // Change Google Analytics 4 cookie from _ga_XXXXXXXXXX to _ga_*
+ Object.keys(cookies).forEach((name) => {
+ if (/_ga_[A-Z0-9]+/.test(name)) {
+ cookies['_ga_*'] = cookies[name]
+
+ delete cookies[name]
+ }
+ })
} catch (error) {
error.message += ` (${url})`
@@ -980,6 +1038,52 @@ class Site {
}
}
+ async newPage(url) {
+ if (!this.browser) {
+ await this.initDriver()
+
+ if (!this.browser) {
+ throw new Error('Browser closed')
+ }
+ }
+
+ let page
+
+ try {
+ page = await this.browser.newPage()
+
+ if (!page || page.isClosed()) {
+ throw new Error('Page did not open')
+ }
+ } catch (error) {
+ error.message += ` (${url})`
+
+ this.error(error)
+
+ await this.initDriver()
+
+ page = await this.browser.newPage()
+ }
+
+ this.pages.push(page)
+
+ page.setJavaScriptEnabled(!this.options.noScripts)
+
+ page.setDefaultTimeout(this.options.maxWait)
+
+ await page.setUserAgent(this.options.userAgent)
+
+ page.on('dialog', (dialog) => dialog.dismiss())
+
+ page.on('error', (error) => {
+ error.message += ` (${url})`
+
+ this.error(error)
+ })
+
+ return page
+ }
+
async analyze(url = this.originalUrl, index = 1, depth = 1) {
if (this.options.recursive) {
await sleep(this.options.delay * index)
@@ -1067,6 +1171,7 @@ class Site {
website,
cpe,
categories,
+ rootPath,
}) => ({
slug,
name,
@@ -1081,6 +1186,7 @@ class Site {
slug,
name,
})),
+ rootPath,
})
),
patterns,
@@ -1092,9 +1198,25 @@ class Site {
}
async probe(url) {
- const files = {
- robots: '/robots.txt',
- magento: '/magento_version',
+ const paths = [
+ {
+ type: 'robots',
+ path: '/robots.txt',
+ },
+ ]
+
+ if (this.options.probe === 'full') {
+ Wappalyzer.technologies
+ .filter(({ probe }) => Object.keys(probe).length)
+ .forEach((technology) => {
+ paths.push(
+ ...Object.keys(technology.probe).map((path) => ({
+ type: 'probe',
+ path,
+ technology,
+ }))
+ )
+ })
}
// DNS
@@ -1120,9 +1242,7 @@ class Site {
await Promise.allSettled([
// Static files
- ...Object.keys(files).map(async (file, index) => {
- const path = files[file]
-
+ ...paths.map(async ({ type, path, technology }, index) => {
try {
await sleep(this.options.delay * index)
@@ -1133,7 +1253,17 @@ class Site {
this.log(`Probe ok (${path})`)
- await this.onDetect(url, analyze({ [file]: body.slice(0, 100000) }))
+ const text = body.slice(0, 100000)
+
+ await this.onDetect(
+ url,
+ analyze(
+ {
+ [type]: path ? { [path]: [text] } : text,
+ },
+ technology && [technology]
+ )
+ )
} catch (error) {
this.error(`Probe failed (${path}): ${error.message || error}`)
}
@@ -1196,14 +1326,32 @@ class Site {
this.detections = this.detections
.concat(detections)
.filter(
- ({ technology: { name }, pattern: { regex } }, index, detections) =>
+ (
+ { technology: { name }, pattern: { regex }, version },
+ index,
+ detections
+ ) =>
detections.findIndex(
- ({ technology: { name: _name }, pattern: { regex: _regex } }) =>
+ ({
+ technology: { name: _name },
+ pattern: { regex: _regex },
+ version: _version,
+ }) =>
name === _name &&
+ version === _version &&
(!regex || regex.toString() === _regex.toString())
) === index
)
+ // Track if technology was identified on website's root path
+ detections.forEach(({ technology: { name } }) => {
+ const detection = this.detections.find(
+ ({ technology: { name: _name } }) => name === _name
+ )
+
+ detection.rootPath = detection.rootPath || url.pathname === '/'
+ })
+
if (this.cache[url.href]) {
const resolved = resolve(this.detections)
diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json
index 220d1300e..dee09ea96 100644
--- a/src/drivers/npm/package.json
+++ b/src/drivers/npm/package.json
@@ -13,7 +13,7 @@
"software"
],
"homepage": "https://www.wappalyzer.com/",
- "version": "6.10.44",
+ "version": "6.10.53",
"author": "Wappalyzer",
"license": "MIT",
"repository": {
@@ -43,4 +43,4 @@
"engines": {
"node": ">=16"
}
-}
+}
\ No newline at end of file
diff --git a/src/drivers/webextension/_locales/ca/messages.json b/src/drivers/webextension/_locales/ca/messages.json
index dde197615..622d6a333 100644
--- a/src/drivers/webextension/_locales/ca/messages.json
+++ b/src/drivers/webextension/_locales/ca/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Esborrar la memòria cau de les deteccions" },
"nothingToDo": { "message": "Res a fer aquí." },
"noAppsDetected": { "message": "No s'ha detectat cap tecnologia." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Mostrar sempre la icona" },
"termsAccept": { "message": "M'està bé" },
"termsDecline": { "message": "Desactivar" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json
index 15573f1c1..bf6043970 100644
--- a/src/drivers/webextension/_locales/de/messages.json
+++ b/src/drivers/webextension/_locales/de/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Cache leeren" },
"nothingToDo": { "message": "Nichts zu tun." },
"noAppsDetected": { "message": "Keine Applikationen gefunden" },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Icon immer anzeigen" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json
index 3bd1c2597..a9c99b344 100644
--- a/src/drivers/webextension/_locales/el/messages.json
+++ b/src/drivers/webextension/_locales/el/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -199,5 +200,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json
index dc4f6e94a..0deb4c40c 100644
--- a/src/drivers/webextension/_locales/en/messages.json
+++ b/src/drivers/webextension/_locales/en/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No technologies detected." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -204,5 +205,7 @@
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
"categoryName107": { "message": "Fulfilment" },
- "categoryName108": { "message": "Form builder" }
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
+ "categoryName110": { "message": "Form builder" }
}
diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json
index 71351b2e7..3ea15a8f1 100644
--- a/src/drivers/webextension/_locales/es/messages.json
+++ b/src/drivers/webextension/_locales/es/messages.json
@@ -6,59 +6,60 @@
"optionsSave": { "message": "Guardar opciones" },
"optionsSaved": { "message": "Guardado" },
"optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
- "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
+ "optionDynamicIcon": { "message": "Usa el icono de la aplicación en lugar del logo de Wappalyzer" },
"optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" },
"optionThemeMode": { "message": "Habilitar la compatibilidad del modo oscuro." },
- "optionBadge": { "message": "Show the number of identified technologies on the icon" },
- "optionShowCached": { "message": "Include cached detections in results" },
+ "optionBadge": { "message": "Mostrar la cantidad de tecnologías identificadas en el icono" },
+ "optionShowCached": { "message": "Incluir detecciones cacheadas en los resultados" },
"optionApiKey": { "message": "API key" },
- "optionApiKeyDescription": { "message": "get your API key" },
- "disableOnDomain": { "message": "Disable on this website" },
- "clearCache": { "message": "Clear cached detections" },
+ "optionApiKeyDescription": { "message": "obtiene tu API key" },
+ "disableOnDomain": { "message": "Deshabilitar para este sitio" },
+ "clearCache": { "message": "Limpiar detecciones cacheadas" },
"nothingToDo": { "message": "Nada que hacer aquí." },
"noAppsDetected": { "message": "Aplicaciones no detectadas." },
- "categoryPin": { "message": "Always show icon" },
- "termsAccept": { "message": "I'm ok with that" },
- "termsDecline": { "message": "Disable" },
- "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." },
- "privacyPolicy": { "message": "Privacy policy" },
- "createAlert": { "message": "Create an alert for this website" },
+ "playGame": { "message": "Play a game?" },
+ "categoryPin": { "message": "Siempre mostrar icono" },
+ "termsAccept": { "message": "Estoy bien con eso" },
+ "termsDecline": { "message": "Deshabilitar" },
+ "termsContent": { "message": "Esta extensión envía informacion anónima sobre los sitios que visitas, inluyendo el nombre de dominio y las tecnologías identificadas, a wappalyzer.com. Esto puede deshabilitarse en las opciones." },
+ "privacyPolicy": { "message": "Política de privacidad" },
+ "createAlert": { "message": "Crear una alerta para este sitio" },
"leadLists": { "message": "Lead generation tools" },
- "tabTechnologies": { "message": "Technologies" },
- "tabPlus": { "message": "More info" },
- "creditBalance": { "message": "Credits:" },
- "plusMessageHeading": { "message": "Get Plus for $$9/mo" },
- "plusMessage": { "message": "With Plus, company and contact details of websites you visit are shown here." },
- "plusButton": { "message": "Sign up" },
- "plusEmpty": { "message": "No results found." },
- "plusCrawl": { "message": "No results found, please check back later." },
- "formSave": { "message": "Save" },
- "issue": { "message": "Something wrong or missing?" },
+ "tabTechnologies": { "message": "Tecnologías" },
+ "tabPlus": { "message": "Más información" },
+ "creditBalance": { "message": "Créditos:" },
+ "plusMessageHeading": { "message": "Obtiene Plus por $$9/mo" },
+ "plusMessage": { "message": "Con Plus, los datos de contacto de los sitios que visitas se muestran aquí." },
+ "plusButton": { "message": "Regístrate" },
+ "plusEmpty": { "message": "No se encontraron resultados." },
+ "plusCrawl": { "message": "No se encontraron resultados, intente más tarde." },
+ "formSave": { "message": "Guardar" },
+ "issue": { "message": "¿Algo funciona mal o falta?" },
- "setCompany": { "message": "Company information" },
- "setKeywords": { "message": "Keywords" },
- "setEmail": { "message": "Email addresses" },
- "setPhone": { "message": "Phone numbers" },
- "setAddress": { "message": "Addresses" },
- "setContact": { "message": "Contact details" },
- "setSocial": { "message": "Social media accounts" },
+ "setCompany": { "message": "Información de la empresa" },
+ "setKeywords": { "message": "Palabras clave" },
+ "setEmail": { "message": "Direcciones de correo electrónico" },
+ "setPhone": { "message": "Números de teléfono" },
+ "setAddress": { "message": "Direcciones" },
+ "setContact": { "message": "Datos de contacto" },
+ "setSocial": { "message": "Cuentas de redes sociales" },
"setMeta": { "message": "Metadata" },
"setLocale": { "message": "Locale" },
"setTrackers": { "message": "Trackers" },
- "setSecurity": { "message": "Security" },
+ "setSecurity": { "message": "Seguridad" },
"setSignals": { "message": "Signals" },
"attributeTechnologySpend": { "message": "Technology spend" },
- "attributeIpCountry": { "message": "IP country" },
- "attributeIpRegion": { "message": "IP region" },
- "attributeLanguage": { "message": "Language" },
- "attributeEmail": { "message": "Email address" },
- "attributeVerifiedEmail": { "message": "Email address (verified)" },
- "attributeSafeEmail": { "message": "Email address (safe)" },
- "attributePhone": { "message": "Phone number" },
+ "attributeIpCountry": { "message": "IP país" },
+ "attributeIpRegion": { "message": "IP región" },
+ "attributeLanguage": { "message": "Lenguaje" },
+ "attributeEmail": { "message": "Dirección de correo" },
+ "attributeVerifiedEmail": { "message": "Dirección de correo (verificada)" },
+ "attributeSafeEmail": { "message": "Dirección de correo (segura)" },
+ "attributePhone": { "message": "Número telefónico" },
"attributeSkype": { "message": "Skype" },
"attributeWhatsapp": { "message": "WhatsApp" },
- "attributeInferredCompanyName": { "message": "Inferred company name" },
+ "attributeInferredCompanyName": { "message": "Nombre de empresa inferido" },
"attributeTwitter": { "message": "Twitter" },
"attributeFacebook": { "message": "Facebook" },
"attributeInstagram": { "message": "Instagram" },
@@ -86,15 +87,15 @@
"attributeTrackerMedianet": { "message": "Medianet" },
"attributeTrackerFacebook": { "message": "Facebook" },
"attributeTrackerOptimizely": { "message": "Optimizely" },
- "attributeCompanyName": { "message": "Company name" },
- "attributeIndustry": { "message": "Industry" },
- "attributeAbout": { "message": "About" },
- "attributeLocations": { "message": "Locations" },
- "attributeCompanySize": { "message": "Company size" },
- "attributeCompanyType": { "message": "Company type" },
- "attributeCompanyFounded": { "message": "Company founded" },
- "attributeKeywords": { "message": "Keywords" },
- "attributeEmployees": { "message": "People" },
+ "attributeCompanyName": { "message": "Nombre de la empresa" },
+ "attributeIndustry": { "message": "Industria" },
+ "attributeAbout": { "message": "Acerca de" },
+ "attributeLocations": { "message": "Ubicaciones" },
+ "attributeCompanySize": { "message": "Tamaño de la empresa" },
+ "attributeCompanyType": { "message": "Tipo de empresa" },
+ "attributeCompanyFounded": { "message": "Empresa fundada" },
+ "attributeKeywords": { "message": "Palabras clave" },
+ "attributeEmployees": { "message": "Personas" },
"attributeDns_spf": { "message": "SPF record" },
"attributeDns_dmarc": { "message": "DMARC record" },
"attributeSchemaOrgTypes": { "message": "schema.org types" },
@@ -114,7 +115,7 @@
"categoryName13": { "message": "Gestor de Incidencias" },
"categoryName14": { "message": "Reproductor de Vídeo" },
"categoryName15": { "message": "Sistema de Comentarios" },
- "categoryName16": { "message": "Security" },
+ "categoryName16": { "message": "Seguridad" },
"categoryName17": { "message": "Tipografía" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Miscelánea" },
@@ -135,75 +136,77 @@
"categoryName34": { "message": "Base de Datos" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Red de Publicidad" },
- "categoryName37": { "message": "Network Service" },
- "categoryName38": { "message": "Media Server" },
- "categoryName39": { "message": "Webcam" },
+ "categoryName37": { "message": "Servicio de red" },
+ "categoryName38": { "message": "Servidor multimedia" },
+ "categoryName39": { "message": "Cámara web" },
"categoryName40": { "message": "Printer" },
- "categoryName41": { "message": "Payment Processor" },
+ "categoryName41": { "message": "Procesador de pagos" },
"categoryName42": { "message": "Tag Manager" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Build/CI System" },
"categoryName45": { "message": "SCADA System" },
- "categoryName46": { "message": "Remote Access" },
- "categoryName47": { "message": "Development Tool" },
- "categoryName48": { "message": "Network Storage" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Document Management Systems" },
+ "categoryName46": { "message": "Acceso remoto" },
+ "categoryName47": { "message": "Herramienta de desarrollo" },
+ "categoryName48": { "message": "Almacenamiento de red" },
+ "categoryName49": { "message": "Lectores de feed" },
+ "categoryName50": { "message": "Sistema de gestión de documentos" },
"categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Live Chat" },
+ "categoryName52": { "message": "Chat en vivo" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
- "categoryName55": { "message": "Accounting" },
+ "categoryName55": { "message": "Contabilidad" },
"categoryName56": { "message": "Cryptominer" },
- "categoryName57": { "message": "Static Site Generator" },
+ "categoryName57": { "message": "Generador de sitios estáticos" },
"categoryName58": { "message": "User Onboarding" },
- "categoryName59": { "message": "JavaScript Libraries" },
- "categoryName60": { "message": "Containers" },
+ "categoryName59": { "message": "Librerías JavaScript" },
+ "categoryName60": { "message": "Contenedores" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
- "categoryName64": { "message": "Reverse Proxy" },
- "categoryName65": { "message": "Load Balancer" },
+ "categoryName64": { "message": "Proxy reverso" },
+ "categoryName65": { "message": "Balanceador de carga" },
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
- "categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Authentication" },
- "categoryName70": { "message": "SSL/TLS certificate authorities" },
- "categoryName71": { "message": "Affiliate programs" },
+ "categoryName68": { "message": "Accesibilidad" },
+ "categoryName69": { "message": "Autenticación" },
+ "categoryName70": { "message": "Autoridades certificadoras SSL/TLS" },
+ "categoryName71": { "message": "Marketing de afiliación" },
"categoryName72": { "message": "Appointment scheduling" },
- "categoryName73": { "message": "Surveys" },
+ "categoryName73": { "message": "Encuestas" },
"categoryName74": { "message": "A/B testing" },
"categoryName75": { "message": "Email" },
- "categoryName76": { "message": "Personalisation" },
+ "categoryName76": { "message": "Personalización" },
"categoryName77": { "message": "Retargeting" },
"categoryName78": { "message": "RUM" },
- "categoryName79": { "message": "Geolocation" },
- "categoryName80": { "message": "WordPress themes" },
- "categoryName81": { "message": "Shopify themes" },
- "categoryName82": { "message": "Drupal themes" },
+ "categoryName79": { "message": "Geolocalización" },
+ "categoryName80": { "message": "Temas de WordPress" },
+ "categoryName81": { "message": "Temas de Shopify" },
+ "categoryName82": { "message": "Temas de Drupal" },
"categoryName83": { "message": "Browser fingerprinting" },
"categoryName84": { "message": "Loyalty & rewards" },
"categoryName85": { "message": "Feature management" },
- "categoryName86": { "message": "Segmentation" },
+ "categoryName86": { "message": "Segmentación" },
"categoryName87": { "message": "WordPress plugins" },
"categoryName88": { "message": "Hosting" },
- "categoryName89": { "message": "Translation" },
- "categoryName90": { "message": "Reviews" },
+ "categoryName89": { "message": "Traductor" },
+ "categoryName90": { "message": "Reseñas" },
"categoryName91": { "message": "Buy now pay later" },
"categoryName92": { "message": "Performance" },
- "categoryName93": { "message": "Reservations & delivery" },
+ "categoryName93": { "message": "Reservas y delivery" },
"categoryName94": { "message": "Referral marketing" },
"categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" },
- "categoryName98": { "message": "Cart abandonment" },
- "categoryName99": { "message": "Shipping carriers" },
+ "categoryName98": { "message": "Abandono de carritos" },
+ "categoryName99": { "message": "Transportistas" },
"categoryName100": { "message": "Shopify apps" },
"categoryName101": { "message": "Recruitment & staffing" },
"categoryName102": { "message": "Returns" },
- "categoryName103": { "message": "Livestreaming" },
- "categoryName104": { "message": "Ticket booking" },
- "categoryName105": { "message": "Augmented reality" },
+ "categoryName103": { "message": "Transmisiónes en vivo" },
+ "categoryName104": { "message": "Reserva de entradas" },
+ "categoryName105": { "message": "Realidad aumentada" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json
index 7245cb391..7f2570c81 100644
--- a/src/drivers/webextension/_locales/fa/messages.json
+++ b/src/drivers/webextension/_locales/fa/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "پاکسازی شناسایی های کش شده" },
"nothingToDo": { "message": "هیچ چیز برای انجام اینجا نیست." },
"noAppsDetected": { "message": "هیچ فنآوری شناسایی نشده است." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "همیشه نماد را نشان بده" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json
index e6807b729..8bcd54f39 100644
--- a/src/drivers/webextension/_locales/fr/messages.json
+++ b/src/drivers/webextension/_locales/fr/messages.json
@@ -3,6 +3,7 @@
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller sur wappalyzer.com" },
"noAppsDetected": { "message": "Pas d'applications détectées." },
+ "playGame": { "message": "Play a game?" },
"nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" },
"optionThemeMode": { "message": "Activer la compatibilité de mode sombre." },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Réservation de tickets" },
"categoryName105": { "message": "Réalité augmentée" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/gl_ES/messages.json b/src/drivers/webextension/_locales/gl_ES/messages.json
index 9eb454d91..3a0bd0dda 100644
--- a/src/drivers/webextension/_locales/gl_ES/messages.json
+++ b/src/drivers/webextension/_locales/gl_ES/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nada que facer por aquí." },
"noAppsDetected": { "message": "Non se identificaron aplicativos." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Amosar sempre icono" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json
index 89ad9f36d..0650ba7a3 100644
--- a/src/drivers/webextension/_locales/gr/messages.json
+++ b/src/drivers/webextension/_locales/gr/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -201,5 +202,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json
index a9aafdb7a..4a070e034 100644
--- a/src/drivers/webextension/_locales/id/messages.json
+++ b/src/drivers/webextension/_locales/id/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Tak ada yang dilakukan disini." },
"noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json
index 4305cee6d..a4b853dfb 100644
--- a/src/drivers/webextension/_locales/it/messages.json
+++ b/src/drivers/webextension/_locales/it/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Niente da fare qui." },
"noAppsDetected": { "message": "Nessuna applicazione rilevata." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/ja/messages.json b/src/drivers/webextension/_locales/ja/messages.json
index 1c1539665..e7e7c375d 100644
--- a/src/drivers/webextension/_locales/ja/messages.json
+++ b/src/drivers/webextension/_locales/ja/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "キャッシュされた検出値のクリア" },
"nothingToDo": { "message": "ここでは特定出来ません。" },
"noAppsDetected": { "message": "技術は検出されませんでした。" },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "常にアイコンを表示" },
"termsAccept": { "message": "OK" },
"termsDecline": { "message": "無効にする" },
@@ -203,5 +204,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/kk/messages.json b/src/drivers/webextension/_locales/kk/messages.json
new file mode 100644
index 000000000..9742eb2bf
--- /dev/null
+++ b/src/drivers/webextension/_locales/kk/messages.json
@@ -0,0 +1,210 @@
+{
+ "github": { "message": "GitHub сайтында Wappalyzer жобасының шанышқысын жасау!" },
+ "twitter": { "message": "Wappalyzer-ге Twitter-де жазылыныз" },
+ "website": { "message": "wappalyzer.com сайтына өтіңіз" },
+ "options": { "message": "Опциялар" },
+ "optionsSave": { "message": "Опцияларды сақтау" },
+ "optionsSaved": { "message": "Сақталды" },
+ "optionUpgradeMessage": { "message": "Жаңартулар туралы хабарлама" },
+ "optionDynamicIcon": { "message": "Wappalyzer логотипінің орнына технология белгішесін пайдаланыңыз" },
+ "optionTracking": { "message": "Анонимді түрде анықталған технологияларды wappalyzer.com сайтына жіберіңіз" },
+ "optionThemeMode": { "message": "Қараңғы режим үйлесімділігін қосу" },
+ "optionBadge": { "message": "Белгішеде анықталған технологиялардың санын көрсетіңіз" },
+ "optionShowCached": { "message": "Нәтижелерге кэштелген анықтауларды қосыңыз" },
+ "optionApiKey": { "message": "API key" },
+ "optionApiKeyDescription": { "message": "API кілтін алыңыз" },
+ "disableOnDomain": { "message": "Осы веб-сайтта кенейтуді қолданбау" },
+ "clearCache": { "message": "Кэштелген анықтауларды тазалау" },
+ "nothingToDo": { "message": "Мұнда ештеңе істеуге болмайды." },
+ "noAppsDetected": { "message": "Ешқандай технологиялар анықталмады." },
+ "playGame": { "message": "Play a game?" },
+ "categoryPin": { "message": "Әрқашан белгішені көрсету" },
+ "termsAccept": { "message": "Мен мұнымен жақсымын" },
+ "termsDecline": { "message": "Өшіру" },
+ "termsContent": { "message": "Бұл кеңейтім сіз кіретін веб-сайттар туралы, соның ішінде домен атауы мен анықталған технологиялар туралы анонимді ақпаратты wappalyzer.com мекенжайына жібереді. Мұны параметрлерде өшіруге болады." },
+ "privacyPolicy": { "message": "Құпиялылық саясаты" },
+ "createAlert": { "message": "Осы веб-сайт үшін ескерту жасаңыз" },
+ "leadLists": { "message": "Lead генерациялау құралдары" },
+ "tabTechnologies": { "message": "Технологиялар" },
+ "tabPlus": { "message": "Қосымша ақпарат" },
+ "creditBalance": { "message": "Несиелер:" },
+ "plusMessageHeading": { "message": "Plus тарифын $$9/айна қосу" },
+ "plusMessage": { "message": "Plus көмегімен сіз кіретін веб-сайттардың компания және байланыс мәліметтері осы жерде көрсетіледі." },
+ "plusButton": { "message": "Тіркелу" },
+ "plusEmpty": { "message": "Нәтиже табылмады." },
+ "plusCrawl": { "message": "Нәтижелер табылмады, кейінірек қайта тексеріңіз." },
+ "formSave": { "message": "Сақтау" },
+ "issue": { "message": "Бірдеңе дұрыс емес пе, әлде жоқ па?" },
+
+ "setCompany": { "message": "Компания туралы ақпарат" },
+ "setKeywords": { "message": "Негізгі сөздер" },
+ "setEmail": { "message": "Электрондық пошта" },
+ "setPhone": { "message": "Телефон нөмірі" },
+ "setAddress": { "message": "Мекенжайлар" },
+ "setContact": { "message": "Байланыс деректері" },
+ "setSocial": { "message": "Әлеуметтік желідегі аккаунттар" },
+ "setMeta": { "message": "Meta деректер" },
+ "setLocale": { "message": "Орналасуы" },
+ "setTrackers": { "message": "Трекерлер" },
+ "setSecurity": { "message": "Қауіпсіздік" },
+ "setSignals": { "message": "Сигналдар" },
+
+ "attributeTechnologySpend": { "message": "Технология шығыны" },
+ "attributeIpCountry": { "message": "IP-дін елі" },
+ "attributeIpRegion": { "message": "IP-дін аймағы" },
+ "attributeLanguage": { "message": "Тілі" },
+ "attributeEmail": { "message": "Электрондық пошта" },
+ "attributeVerifiedEmail": { "message": "Электрондық пошта (тексерілген)" },
+ "attributeSafeEmail": { "message": "Электрондық пошта (қауіпсіз)" },
+ "attributePhone": { "message": "Телефон нөмірі" },
+ "attributeSkype": { "message": "Skype" },
+ "attributeWhatsapp": { "message": "WhatsApp" },
+ "attributeInferredCompanyName": { "message": "Болжалды компания атауы" },
+ "attributeTwitter": { "message": "Twitter" },
+ "attributeFacebook": { "message": "Facebook" },
+ "attributeInstagram": { "message": "Instagram" },
+ "attributeGithub": { "message": "GitHub" },
+ "attributeTiktok": { "message": "TikTok" },
+ "attributeYoutube": { "message": "YouTube" },
+ "attributePinterest": { "message": "Pinterest" },
+ "attributeLinkedin": { "message": "LinkedIn" },
+ "attributeOwler": { "message": "Owler" },
+ "attributeTitle": { "message": "Тақырып" },
+ "attributeDescription": { "message": "Сипаттама" },
+ "attributeCopyright": { "message": "Авторлық құқық" },
+ "attributeCopyrightYear": { "message": "Авторлық құқық жылы" },
+ "attributeResponsive": { "message": "Жауапты" },
+ "attributeCertInfo_subjectOrg": { "message": "Сертификат берушi организация" },
+ "attributeCertInfo_subjectCountry":{ "message": "Сертификат берушiнiң елди мекені" },
+ "attributeCertInfo_subjectState": { "message": "Сертификат state" },
+ "attributeCertInfo_subjectLocality":{ "message": "Сертификат жері" },
+ "attributeCertInfo_issuer": { "message": "Сертификат беруші" },
+ "attributeCertInfo_protocol": { "message": "Сертификаттау хаттамасы" },
+ "attributeCertInfo_validTo": { "message": "Сертификаттың жарамдылық мерзімі" },
+ "attributeHttps": { "message": "SSL/TLS қосылған" },
+ "attributeTrackerGoogleAnalytics": { "message": "Google Analytics" },
+ "attributeTrackerGoogleAdSense": { "message": "Google AdSense" },
+ "attributeTrackerMedianet": { "message": "Medianet" },
+ "attributeTrackerFacebook": { "message": "Facebook" },
+ "attributeTrackerOptimizely": { "message": "Optimizely" },
+ "attributeCompanyName": { "message": "Компанияның аты" },
+ "attributeIndustry": { "message": "Өнеркәсіп" },
+ "attributeAbout": { "message": "About" },
+ "attributeLocations": { "message": "Компания орналасқан жерлері" },
+ "attributeCompanySize": { "message": "Компания мөлшері" },
+ "attributeCompanyType": { "message": "Компания түрі" },
+ "attributeCompanyFounded": { "message": "Компанияның құрылған уақыты" },
+ "attributeKeywords": { "message": "Кілт сөздер" },
+ "attributeEmployees": { "message": "Адамдар" },
+ "attributeDns_spf": { "message": "SPF жазба" },
+ "attributeDns_dmarc": { "message": "DMARC жазба" },
+ "attributeSchemaOrgTypes": { "message": "schema.org түрлері" },
+
+ "categoryName1": { "message": "Контент басқару жүйелері (CMS)" },
+ "categoryName2": { "message": "Хабарлама тақталары" },
+ "categoryName3": { "message": "Дерекқор менеджерлері" },
+ "categoryName4": { "message": "Құжаттама құралдары" },
+ "categoryName5": { "message": "Виджеттер" },
+ "categoryName6": { "message": "Электрондық коммерция" },
+ "categoryName7": { "message": "Фотогалереялар" },
+ "categoryName8": { "message": "Викилер" },
+ "categoryName9": { "message": "Хостинг панельдері" },
+ "categoryName10": { "message": "Аналитика" },
+ "categoryName11": { "message": "Блогтар" },
+ "categoryName12": { "message": "JavaScript фреймворктары" },
+ "categoryName13": { "message": "Ақаулық трекерлер" },
+ "categoryName14": { "message": "Бейне ойнатқыштар" },
+ "categoryName15": { "message": "Түсініктеме жүйелері" },
+ "categoryName16": { "message": "Қауіпсіздік" },
+ "categoryName17": { "message": "Қаріп сценарийлері" },
+ "categoryName18": { "message": "Веб фреймворктары" },
+ "categoryName19": { "message": "Әртүрлі" },
+ "categoryName20": { "message": "Редактор" },
+ "categoryName21": { "message": "Оқытуды басқару жүйелері (LMS)" },
+ "categoryName22": { "message": "Веб-серверлер" },
+ "categoryName23": { "message": "Кэштеу" },
+ "categoryName24": { "message": "Мәтіндік редакторлар" },
+ "categoryName25": { "message": "JavaScript графика" },
+ "categoryName26": { "message": "Мобилдік фреймворктар" },
+ "categoryName27": { "message": "Бағдарламалау тілдері" },
+ "categoryName28": { "message": "Операциялық жүйелер" },
+ "categoryName29": { "message": "Іздеу жүйелері" },
+ "categoryName30": { "message": "Веб-пошта" },
+ "categoryName31": { "message": "Контент жеткізу желісі (CDN)" },
+ "categoryName32": { "message": "Маркетингті автоматтандыру" },
+ "categoryName33": { "message": "Веб-сервер кеңейтімдері" },
+ "categoryName34": { "message": "Мәліметтер базалары" },
+ "categoryName35": { "message": "Карталар" },
+ "categoryName36": { "message": "Жарнама" },
+ "categoryName37": { "message": "Желі қызметтері" },
+ "categoryName38": { "message": "Медиа серверлері" },
+ "categoryName39": { "message": "Веб-камералар" },
+ "categoryName40": { "message": "Принтерлер" },
+ "categoryName41": { "message": "Төлем процессорлары" },
+ "categoryName42": { "message": "Тег менеджерлері" },
+ "categoryName44": { "message": "CI" },
+ "categoryName46": { "message": "Қашықтан қол жеткізу" },
+ "categoryName47": { "message": "Әзірлеу" },
+ "categoryName48": { "message": "Желілік сақтау" },
+ "categoryName49": { "message": "Арна оқырмандары" },
+ "categoryName50": { "message": "DMS" },
+ "categoryName51": { "message": "Парақша құрастырушы" },
+ "categoryName52": { "message": "Тікелей чат" },
+ "categoryName53": { "message": "CRM" },
+ "categoryName54": { "message": "SEO" },
+ "categoryName55": { "message": "Бухгалтерлік есеп" },
+ "categoryName56": { "message": "Криптомайнерлер" },
+ "categoryName57": { "message": "Статикалық сайт генераторлары" },
+ "categoryName58": { "message": "Пайдаланушыны қосу" },
+ "categoryName59": { "message": "JavaScript библиотекалары" },
+ "categoryName60": { "message": "Контейнерлер" },
+ "categoryName61": { "message": "SaaS" },
+ "categoryName62": { "message": "PaaS" },
+ "categoryName63": { "message": "IaaS" },
+ "categoryName64": { "message": "Кері прокси" },
+ "categoryName65": { "message": "Жүктеме балансерлері" },
+ "categoryName66": { "message": "UI-фреймворктары" },
+ "categoryName67": { "message": "Cookie сәйкестігі" },
+ "categoryName68": { "message": "Қол жетімділік" },
+ "categoryName69": { "message": "Аутентификация" },
+ "categoryName70": { "message": "SSL/TLS сертификаттау органдары" },
+ "categoryName71": { "message": "Серіктестік бағдарламалар" },
+ "categoryName72": { "message": "Кездесуді жоспарлау" },
+ "categoryName73": { "message": "Сауалнамалар" },
+ "categoryName74": { "message": "A/B тестілеу" },
+ "categoryName75": { "message": "Электрондық пошта" },
+ "categoryName76": { "message": "Жекелендіру" },
+ "categoryName77": { "message": "Қайта бағыттау" },
+ "categoryName78": { "message": "RUM" },
+ "categoryName79": { "message": "Геолокация" },
+ "categoryName80": { "message": "WordPress тақырыптар" },
+ "categoryName81": { "message": "Shopify тақырыптар" },
+ "categoryName82": { "message": "Drupal тақырыптар" },
+ "categoryName83": { "message": "Браузердін іздері" },
+ "categoryName84": { "message": "Адалдық және сыйақылар" },
+ "categoryName85": { "message": "Мүмкіндіктерді басқару" },
+ "categoryName86": { "message": "Сегменттеу" },
+ "categoryName87": { "message": "WordPress плагиндер" },
+ "categoryName88": { "message": "Хостинг" },
+ "categoryName89": { "message": "Аударма" },
+ "categoryName90": { "message": "Пікірлер" },
+ "categoryName91": { "message": "Қазір сатып алыңыз, кейінірек төлеңіз" },
+ "categoryName92": { "message": "Өнімділік" },
+ "categoryName93": { "message": "Брондау және жеткізу" },
+ "categoryName94": { "message": "Рефералдық маркетинг" },
+ "categoryName95": { "message": "Сандық активтерді басқару" },
+ "categoryName96": { "message": "Контентті курациялау" },
+ "categoryName97": { "message": "Тұтынушы деректерінің платформасы" },
+ "categoryName98": { "message": "Арбадан бас тарту" },
+ "categoryName99": { "message": "Жүк тасымалдаушылары" },
+ "categoryName100": { "message": "Shopify қолданбалары" },
+ "categoryName101": { "message": "Жұмысқа қабылдау және кадрлармен қамтамасыз ету" },
+ "categoryName102": { "message": "Тауарды қайтару" },
+ "categoryName103": { "message": "Тікелей эфир" },
+ "categoryName104": { "message": "Билеттерді брондау" },
+ "categoryName105": { "message": "Толықтырылған шындық" },
+ "categoryName106": { "message": "Трансшекаралық электрондық коммерция" },
+ "categoryName107": { "message": "Орындалу" },
+ "categoryName108": { "message": "Электрондық коммерция - фронттары" },
+ "categoryName109": { "message": "Домен тұрағы" }
+}
diff --git a/src/drivers/webextension/_locales/ko/messages.json b/src/drivers/webextension/_locales/ko/messages.json
index 0c4374823..bb9fd5fdd 100644
--- a/src/drivers/webextension/_locales/ko/messages.json
+++ b/src/drivers/webextension/_locales/ko/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "캐시된 식별 정보 지우기" },
"nothingToDo": { "message": "여기에는 할 일이 없네요." },
"noAppsDetected": { "message": "식별된 기술이 없습니다." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "항상 아이콘 보이기" },
"termsAccept": { "message": "동의합니다" },
"termsDecline": { "message": "비활성화" },
@@ -203,5 +204,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/nl/messages.json b/src/drivers/webextension/_locales/nl/messages.json
index 4acdc38ed..3866ef53f 100644
--- a/src/drivers/webextension/_locales/nl/messages.json
+++ b/src/drivers/webextension/_locales/nl/messages.json
@@ -3,6 +3,7 @@
"twitter": { "message": "Volg Wappalyzer op Twitter" },
"website": { "message": "Ga naar wappalyzer.com" },
"noAppsDetected": { "message": "Geen toepassingen gedetecteerd" },
+ "playGame": { "message": "Play a game?" },
"nothingToDo": { "message": "Hier is niets te doen" },
"optionTracking": { "message": "Stuur anoniem geïdentificeerd technologieën naar wappalyzer.com" },
"optionThemeMode": { "message": "Donkere modus compatibiliteit inschakelen" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Kaartje boeken" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json
index 80984521e..43a88250e 100644
--- a/src/drivers/webextension/_locales/pl/messages.json
+++ b/src/drivers/webextension/_locales/pl/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nic tu nie ma." },
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Zawsze pokazuj tą ikonę" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json
index 5a0d0bfaa..17759afdd 100644
--- a/src/drivers/webextension/_locales/pt/messages.json
+++ b/src/drivers/webextension/_locales/pt/messages.json
@@ -3,6 +3,7 @@
"twitter": { "message": "Seguir Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." },
+ "playGame": { "message": "Play a game?" },
"nothingToDo": { "message": "Nada a fazer aqui." },
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" },
"optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json
index cca22883a..38e91dcb8 100644
--- a/src/drivers/webextension/_locales/pt_BR/messages.json
+++ b/src/drivers/webextension/_locales/pt_BR/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nada a fazer aqui." },
"noAppsDetected": { "message": "Nenhuma tecnologia identificada." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Sempre mostrar ícone" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json
index 131ea61e7..d8739d8c9 100644
--- a/src/drivers/webextension/_locales/ro/messages.json
+++ b/src/drivers/webextension/_locales/ro/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
"noAppsDetected": { "message": "Nici o aplicație detectată." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Afișează icon tot timpul" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json
index d55bc2b0f..d3bcdacd8 100644
--- a/src/drivers/webextension/_locales/ru/messages.json
+++ b/src/drivers/webextension/_locales/ru/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Очистить кешированные результаты" },
"nothingToDo": { "message": "Здесь нечего делать" },
"noAppsDetected": { "message": "Не удалось определить ни одну технологию" },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Всегда отображать эту категорию иконкой"},
"termsAccept": { "message": "Я принимаю условия" },
"termsDecline": { "message": "Отключить" },
@@ -203,5 +204,7 @@
"categoryName104": { "message": "Бронирование билетов" },
"categoryName105": { "message": "Дополненная реальность" },
"categoryName106": { "message": "Трансграничная электронная коммерция" },
- "categoryName107": { "message": "Выполнения" }
+ "categoryName107": { "message": "Выполнения" },
+ "categoryName108": { "message": "Фронтенд для ecommerce платформ" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json
index 96397ee2d..9b750e224 100644
--- a/src/drivers/webextension/_locales/sk/messages.json
+++ b/src/drivers/webextension/_locales/sk/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Nie je tu čo robiť." },
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json
index 0a68eac88..26a73bb73 100644
--- a/src/drivers/webextension/_locales/tr/messages.json
+++ b/src/drivers/webextension/_locales/tr/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Burada yapacak birşey yok." },
"noAppsDetected": { "message": "Uygulamalar tespit edilemedi." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Her zaman bu kategorinin ikonunu kullan" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json
index ced33e88a..95ee799be 100644
--- a/src/drivers/webextension/_locales/uk/messages.json
+++ b/src/drivers/webextension/_locales/uk/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Тут нічого робити." },
"noAppsDetected": { "message": "Нічого не знайдено." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Завжди показувати іконку Wappalyzer" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json
index 8f63c56a8..bceecdaa6 100644
--- a/src/drivers/webextension/_locales/uz/messages.json
+++ b/src/drivers/webextension/_locales/uz/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "Bu yerda tekshirib bolmaydi." },
"noAppsDetected": { "message": "Hech qanday dastur aniqlanmadi." },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json
index 1ab5b79ac..69e88e9fd 100644
--- a/src/drivers/webextension/_locales/zh_CN/messages.json
+++ b/src/drivers/webextension/_locales/zh_CN/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "清除检测缓存" },
"nothingToDo": { "message": "这里无事可做。" },
"noAppsDetected": { "message": "未检测到任何技术。" },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "总是显示图标" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -203,5 +204,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json
index 089113795..cda10ea33 100644
--- a/src/drivers/webextension/_locales/zh_TW/messages.json
+++ b/src/drivers/webextension/_locales/zh_TW/messages.json
@@ -17,6 +17,7 @@
"clearCache": { "message": "Clear cached detections" },
"nothingToDo": { "message": "這裡什麼也沒有。" },
"noAppsDetected": { "message": "未識別到技術。" },
+ "playGame": { "message": "Play a game?" },
"categoryPin": { "message": "永遠顯示圖示" },
"termsAccept": { "message": "I'm ok with that" },
"termsDecline": { "message": "Disable" },
@@ -205,5 +206,7 @@
"categoryName104": { "message": "Ticket booking" },
"categoryName105": { "message": "Augmented reality" },
"categoryName106": { "message": "Cross border ecommerce" },
- "categoryName107": { "message": "Fulfilment" }
+ "categoryName107": { "message": "Fulfilment" },
+ "categoryName108": { "message": "Ecommerce frontends" },
+ "categoryName109": { "message": "Domain parking" }
}
diff --git a/src/drivers/webextension/css/styles.css b/src/drivers/webextension/css/styles.css
index 52cdd97f5..a7df2bba8 100644
--- a/src/drivers/webextension/css/styles.css
+++ b/src/drivers/webextension/css/styles.css
@@ -544,10 +544,11 @@ small {
.empty {
height: calc(100% - 4.5rem);
text-align: center;
- margin: 2.5rem 0 3.5rem 0;
+ margin: 2.5rem 0;
}
.empty__text {
+ font-size: 1rem;
margin-bottom: 1.5rem;
}
@@ -555,6 +556,14 @@ small {
display: none;
}
+.empty__play-game {
+ color: var(--color-text-lighten);
+}
+
+.empty__play-game--hidden {
+ display: none;
+}
+
.category {
page-break-inside: avoid;
break-inside: avoid-column;
@@ -794,6 +803,10 @@ body.dynamic-icon .category__heading:hover .category__pin {
width: 13rem;
}
+.ttt-game--hidden {
+ display: none;
+}
+
.ttt-player-icon {
color: var(--color-primary);
width: 1.2rem;
diff --git a/src/drivers/webextension/html/popup.html b/src/drivers/webextension/html/popup.html
index 5571fe4e0..b64fc4738 100644
--- a/src/drivers/webextension/html/popup.html
+++ b/src/drivers/webextension/html/popup.html
@@ -69,7 +69,9 @@
-
+
+
+