Merge branch 'dev' into dependabot/npm_and_yarn/uuid-14.0.0

This commit is contained in:
Mike Cao authored and GitHub committed 2026-05-04 19:39:55 -04:00
commit 75e6b2461b
159 files changed
+10204 -3145

No files matched your search

@@ -0,0 +1,75 @@
CREATE TABLE IF NOT EXISTS umami.event_data_pivot
(
website_id UUID,
session_id UUID,
event_id UUID,
event_name LowCardinality(String),
url_path String,
created_at DateTime('UTC'),
property_keys AggregateFunction(groupArray, String),
property_values AggregateFunction(groupArray, String),
property_types AggregateFunction(groupArray, UInt32)
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (website_id, event_name, created_at, event_id)
SETTINGS index_granularity = 8192;
CREATE MATERIALIZED VIEW IF NOT EXISTS umami.event_data_pivot_mv
TO umami.event_data_pivot
AS SELECT
website_id,
session_id,
event_id,
event_name,
url_path,
created_at,
groupArrayState(data_key) AS property_keys,
groupArrayState(multiIf(
data_type IN (1, 3, 5), ifNull(string_value, ''),
data_type = 2, toString(ifNull(number_value, 0)),
data_type = 4, toString(ifNull(date_value, toDateTime(0))),
''
)) AS property_values,
groupArrayState(data_type) AS property_types
FROM umami.event_data
GROUP BY website_id, session_id, event_id, event_name, url_path, created_at;
-- Backfill existing event data
INSERT INTO umami.event_data_pivot
SELECT
website_id,
session_id,
event_id,
event_name,
url_path,
created_at,
groupArrayState(data_key),
groupArrayState(multiIf(
data_type IN (1, 3, 5), ifNull(string_value, ''),
data_type = 2, toString(ifNull(number_value, 0)),
data_type = 4, toString(ifNull(date_value, toDateTime(0))),
''
)),
groupArrayState(data_type)
FROM umami.event_data
GROUP BY website_id, session_id, event_id, event_name, url_path, created_at;
ALTER TABLE umami.session_data
MODIFY SETTING deduplicate_merge_projection_mode = 'drop';
ALTER TABLE umami.session_data
ADD PROJECTION session_data_property_filter_projection (
SELECT *
ORDER BY (
website_id,
data_key,
data_type,
string_value,
number_value,
date_value,
session_id
)
);
ALTER TABLE umami.session_data MATERIALIZE PROJECTION session_data_property_filter_projection;
+59 -1
View File
@@ -90,6 +90,25 @@ ENGINE = ReplacingMergeTree
ORDER BY (website_id, session_id, data_key)
SETTINGS index_granularity = 8192;
ALTER TABLE umami.session_data
MODIFY SETTING deduplicate_merge_projection_mode = 'drop';
ALTER TABLE umami.session_data
ADD PROJECTION session_data_property_filter_projection (
SELECT *
ORDER BY (
website_id,
data_key,
data_type,
string_value,
number_value,
date_value,
session_id
)
);
ALTER TABLE umami.session_data MATERIALIZE PROJECTION session_data_property_filter_projection;
-- stats hourly
CREATE TABLE umami.website_event_stats_hourly
(
@@ -305,4 +324,43 @@ CREATE TABLE umami.session_replay
ENGINE = MergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (replay_id, website_id, session_id, visit_id, chunk_index)
SETTINGS index_granularity = 8192;
SETTINGS index_granularity = 8192;
-- Create event_data_pivot
CREATE TABLE IF NOT EXISTS umami.event_data_pivot
(
website_id UUID,
session_id UUID,
event_id UUID,
event_name LowCardinality(String),
url_path String,
created_at DateTime('UTC'),
property_keys AggregateFunction(groupArray, String),
property_values AggregateFunction(groupArray, String),
property_types AggregateFunction(groupArray, UInt32)
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (website_id, event_name, created_at, event_id)
SETTINGS index_granularity = 8192;
CREATE MATERIALIZED VIEW IF NOT EXISTS umami.event_data_pivot_mv
TO umami.event_data_pivot
AS SELECT
website_id,
session_id,
event_id,
event_name,
url_path,
created_at,
groupArrayState(data_key) AS property_keys,
groupArrayState(multiIf(
data_type IN (1, 3, 5), ifNull(string_value, ''),
data_type = 2, toString(ifNull(number_value, 0)),
data_type = 4, toString(ifNull(date_value, toDateTime(0))),
''
)) AS property_values,
groupArrayState(data_type) AS property_types
FROM umami.event_data
GROUP BY website_id, session_id, event_id, event_name, url_path, created_at;
+43 -43
View File
@@ -52,16 +52,15 @@
],
"dependencies": {
"@clickhouse/client": "^1.18.2",
"@date-fns/utc": "^1.2.0",
"@date-fns/utc": "^2.1.1",
"@dicebear/collection": "^9.4.2",
"@dicebear/core": "^9.4.2",
"@hello-pangea/dnd": "^17.0.0",
"@prisma/adapter-pg": "^7.6.0",
"@prisma/client": "^7.6.0",
"@hello-pangea/dnd": "^18.0.1",
"@prisma/adapter-pg": "^7.7.0",
"@prisma/client": "^7.7.0",
"@prisma/extension-read-replicas": "^0.5.0",
"@react-spring/web": "^10.0.3",
"@svgr/cli": "^8.1.0",
"@tanstack/react-query": "^5.96.0",
"@tanstack/react-query": "^5.99.0",
"@umami/react-zen": "^0.245.0",
"bcryptjs": "^3.0.2",
"chalk": "^5.6.2",
@@ -71,88 +70,89 @@
"colord": "^2.9.2",
"cors": "^2.8.6",
"cross-spawn": "^7.0.3",
"date-fns": "^2.23.0",
"date-fns-tz": "^1.1.4",
"date-fns": "^4.1.0",
"date-fns-tz": "^3.2.0",
"debug": "^4.4.3",
"del": "^6.0.0",
"del": "^8.0.1",
"detect-browser": "^5.2.0",
"dotenv": "^17.3.1",
"esbuild": "^0.27.4",
"dotenv": "^17.4.2",
"esbuild": "^0.28.0",
"immer": "^11.1.4",
"ipaddr.js": "^2.3.0",
"is-ci": "^3.0.1",
"is-docker": "^3.0.0",
"is-localhost-ip": "^2.0.0",
"isbot": "^5.1.37",
"is-ci": "^4.1.0",
"is-docker": "^4.0.0",
"is-localhost-ip": "^3.0.1",
"isbot": "^5.1.39",
"jsonwebtoken": "^9.0.3",
"jszip": "^3.10.1",
"kafkajs": "^2.1.0",
"lucide-react": "^1.7.0",
"maxmind": "^5.0.5",
"lucide-react": "^1.8.0",
"maxmind": "^5.0.6",
"motion": "^12.38.0",
"next": "16.2.4",
"next-intl": "4.8.3",
"next-intl": "4.9.1",
"node-fetch": "^3.2.8",
"npm-run-all": "^4.1.5",
"papaparse": "^5.5.3",
"pg": "^8.20.0",
"prisma": "^7.6.0",
"pure-rand": "^7.0.1",
"prisma": "^7.7.0",
"pure-rand": "^8.4.0",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"react-error-boundary": "^4.0.4",
"react-resizable-panels": "^4.8.0",
"react-simple-maps": "^2.3.0",
"react-error-boundary": "^6.1.1",
"react-resizable-panels": "^4.10.0",
"react-simple-maps": "^3.0.0",
"react-use-measure": "^2.0.4",
"react-window": "^1.8.6",
"redis": "^4.5.1",
"react-window": "^2.2.7",
"redis": "^5.12.1",
"request-ip": "^3.3.0",
"rrweb": "2.0.0-alpha.4",
"rrweb-player": "1.0.0-alpha.4",
"semver": "^7.7.4",
"serialize-error": "^12.0.0",
"thenby": "^1.3.4",
"serialize-error": "^13.0.1",
"thenby": "^1.4.0",
"ua-parser-js": "^2.0.9",
"uuid": "^14.0.0",
"zod": "^4.3.6",
"zustand": "^5.0.12"
},
"devDependencies": {
"@biomejs/biome": "^2.4.10",
"@biomejs/biome": "^2.4.12",
"@netlify/plugin-nextjs": "^5.15.9",
"@rollup/plugin-alias": "^5.0.0",
"@rollup/plugin-commonjs": "^25.0.4",
"@rollup/plugin-alias": "^6.0.0",
"@rollup/plugin-commonjs": "^29.0.2",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^15.2.0",
"@rollup/plugin-replace": "^5.0.2",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-replace": "^6.0.3",
"@rollup/plugin-terser": "^1.0.0",
"@rollup/plugin-typescript": "^12.3.0",
"@types/jest": "^30.0.0",
"@types/node": "^24.12.0",
"@types/node": "^25.6.0",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.2",
"babel-plugin-react-compiler": "19.1.0-rc.2",
"cross-env": "^10.1.0",
"cypress": "^13.6.6",
"cypress": "^15.14.0",
"dotenv-cli": "^11.0.0",
"jest": "^29.7.0",
"postcss": "^8.5.8",
"jest": "^30.3.0",
"postcss": "^8.5.10",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-import": "^15.1.0",
"postcss-preset-env": "7.8.3",
"postcss-import": "^16.1.1",
"postcss-preset-env": "11.2.1",
"prompts": "2.4.2",
"rollup": "^4.60.1",
"rollup-plugin-copy": "^3.4.0",
"rollup-plugin-delete": "^3.0.2",
"rollup-plugin-dts": "^6.4.1",
"rollup-plugin-node-externals": "^8.1.1",
"rollup-plugin-node-externals": "^9.0.1",
"rollup-plugin-peer-deps-external": "^2.2.4",
"rollup-plugin-postcss": "^4.0.2",
"tar": "^7.5.13",
"ts-jest": "^29.4.6",
"ts-morph": "^27.0.2",
"ts-jest": "^29.4.9",
"ts-morph": "^28.0.0",
"ts-node": "^10.9.1",
"tsup": "^8.5.0",
"tsx": "^4.19.0",
"typescript": "^5.9.3"
"typescript": "^6.0.3"
}
}
+3261 -2128
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -227,7 +227,7 @@
"TO": "Tonga",
"TT": "Trinidad & Tobago",
"TN": "Tunisia",
"TR": "Turkey",
"TR": "T\u00fcrkiye",
"TM": "Turkmenistan",
"TC": "Turks & Caicos Islands",
"TV": "Tuvalu",
+1 -1
View File
@@ -227,7 +227,7 @@
"TO": "Tonga",
"TT": "Trinidad & Tobago",
"TN": "Tunisia",
"TR": "Turkey",
"TR": "T\u00fcrkiye",
"TM": "Turkmenistan",
"TC": "Turks & Caicos Islands",
"TV": "Tuvalu",
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Cijelo vrijeme",
"analysis": "Analiza",
"analytics": "Analitike",
"aov": "AOV",
"application": "Aplikacija",
"apply": "Primijeni",
"arpu": "ARPU",
"attribution": "Atribucija",
"attribution-description": "Pogledajte kako korisnici komuniciraju s vašim marketingom i šta dovodi do konverzija.",
"audience": "Publika",
@@ -33,6 +31,7 @@
"behavior": "Ponašanje",
"block-selector": "Odabir bloka",
"boards": "Ploče",
"board-type": "Vrsta ploče",
"bounce-rate": "Stopa napuštanja",
"breakdown": "Pregled po kategorijama",
"browser": "Preglednik",
@@ -55,6 +54,8 @@
"confirm": "Potvrdi",
"confirm-password": "Potvrdi šifru",
"contains": "Sadrži",
"regex-match": "Odgovara regularnom izrazu",
"regex-not-match": "Ne odgovara regularnom izrazu",
"content": "Sadržaj",
"continue": "Nastavi",
"conversion": "Konverzija",
@@ -131,8 +132,8 @@
"funnels": "Lijevci",
"goal": "Cilj",
"goals": "Ciljevi",
"goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
"good": "Dobro",
"goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
"greater-than": "Veće od",
"greater-than-equals": "Veće od ili jednako",
"grouped": "Grupisano",
@@ -140,10 +141,10 @@
"hostname": "Naziv hosta",
"hour": "Sat",
"includes": "Uključuje",
"inp": "INP",
"insight": "Uvid",
"insights": "Uvidi",
"insights-description": "Zaronite dublje u vaše podatke korištenjem segmenata i filtera",
"inp": "INP",
"invalid-url": "Nevažeći URL",
"is": "Jeste",
"is-false": "Nije tačno",
@@ -177,11 +178,11 @@
"manage": "Upravljaj",
"manager": "Menadžer",
"mask-level": "Nivo maske",
"max": "Maks",
"max-duration": "Maksimalno trajanje",
"match": "Podudaranje",
"match-all": "Sve",
"match-any": "Bilo koje",
"max": "Maks",
"max-duration": "Maksimalno trajanje",
"maximize": "Proširi",
"medium": "Srednje",
"member": "Član",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {zapis} other {zapisa}}",
"ok": "U redu",
"online": "Na mreži",
"open": "Miješano",
"organic-search": "Organska pretraga",
"organic-shopping": "Organska kupovina",
"organic-social": "Organske društvene mreže",
@@ -212,8 +214,8 @@
"page": "Stranica",
"page-of": "Strana {current} od {total}",
"page-views": "Pregleda stranica",
"pages": "Stranice",
"pageTitle": "Naslov stranice",
"pages": "Stranice",
"paid-ads": "Plaćeni oglasi",
"paid-search": "Plaćena pretraga",
"paid-shopping": "Plaćena kupovina",
@@ -225,7 +227,6 @@
"performance": "Performanse",
"pixel": "Piksel",
"pixels": "Pikseli",
"play": "Reprodukuj",
"poor": "Loše",
"powered-by": "Omogućeno s {name}",
"preferences": "Postavke",
@@ -246,16 +247,16 @@
"referrers": "Preporučioci",
"refresh": "Osvježi",
"regenerate": "Regeneriši",
"regex-match": "Odgovara regularnom izrazu",
"regex-not-match": "Ne odgovara regularnom izrazu",
"region": "Regija",
"regions": "Regioni",
"remaining": "Preostalo",
"remove": "Ukloni",
"remove-member": "Ukloni člana",
"play": "Reprodukuj",
"replay": "Ponovna reprodukcija",
"replay-enabled": "Ponovna reprodukcija omogućena",
"replay-id": "Replay ID",
"replay-code": "Kod ponavljanja sesije",
"replay-enabled": "Ponovna reprodukcija omogućena",
"replays": "Ponovne reprodukcije",
"reports": "Izvještaji",
"required": "Obavezno",
@@ -268,21 +269,24 @@
"revenue-description": "Pogledajte svoje prihode tokom vremena.",
"role": "Rola",
"run-query": "Pokreni query",
"sample-rate": "Stopa uzorkovanja",
"sample-size": "Veličina uzorka",
"save": "Sačuvaj",
"save-cohort": "Spremi kohortu",
"save-replay": "Sačuvaj ponavljanje",
"save-segment": "Spremi segment",
"sample-rate": "Stopa uzorkovanja",
"sample-size": "Veličina uzorka",
"screen": "Ekran",
"screens": "Ekrani",
"search": "Traži",
"segment": "Segment",
"segments": "Segmenti",
"select": "Odaberi",
"select-component": "Odaberite komponentu",
"select-link": "Odaberi link",
"select-pixel": "Odaberi piksel",
"select-date": "Odaberi datum",
"select-filter": "Odaberi filter",
"select-role": "Odaberi rolu",
"select-component": "Odaberite komponentu",
"select-website": "Odaberi web stranicu",
"session": "Sesija",
"session-data": "Podaci o sesiji",
@@ -337,9 +341,15 @@
"unique": "Jedinstveno",
"unique-events": "Jedinstveni događaji",
"unique-visitors": "Jedinstvenih posjetitelja",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Jedinstveni kupci",
"customers": "Kupci",
"orders": "Narudžbe",
"saved": "Sačuvano",
"unknown": "Nepoznato",
"untitled": "Bezimeno",
"upgrade": "Nadogradi",
"update": "Ažuriraj",
"url": "URL",
"user": "Korisnik",
@@ -379,8 +389,8 @@
"confirm-reset": "Jeste li sigurni da želite resetovati {target}?",
"delete-team-warning": "Brisanje tima će također obrisati sve web stranice tima.",
"delete-website-warning": "Svi podaci web stranice biće obrisani.",
"empty-dashboard": "Vaša kontrolna tabla je prazna. Kliknite Uredi da dodate prvu komponentu.",
"error": "Nešto je pošlo po zlu.",
"empty-dashboard": "Vaša kontrolna tabla je prazna. Kliknite Uredi da dodate prvu komponentu.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Zabranjeno",
"go-to-settings": "Idi na postavke",
@@ -402,6 +412,7 @@
"reset-website": "Da resetujete ovu web stranicu, upišite {confirmation} dole da potvrdite.",
"reset-website-warning": "Sve statistike o ovoj web stranici će biti obrisane, ali vaše postavke neće biti dirane.",
"saved": "Sačuvano.",
"select-board-entity-first": "Prvo odaberite web-stranicu, piksel ili link.",
"select-component-preview": "Odaberite komponentu za pregled",
"select-website-first": "Prvo odaberite web stranicu",
"sever-error": "Greška servera",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizirano",
"user-deleted": "Korisnik obrisan.",
"viewed-page": "Pogledana stranica",
"upgrade-required": "Ova funkcija zahtijeva pretplatu na plan {plan}.",
"visitor-log": "Posjetitelj iz <b>{country}</b> koristi <b>{browser}</b> na <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Sempre",
"analysis": "Anàlisi",
"analytics": "Analítiques",
"aov": "AOV",
"application": "Aplicació",
"apply": "Aplica",
"arpu": "ARPU",
"attribution": "Atribució",
"attribution-description": "Vegeu com els usuaris interactuen amb el vostre màrqueting i què impulsa les conversions.",
"audience": "Audiència",
@@ -33,6 +31,7 @@
"behavior": "Comportament",
"block-selector": "Selector de bloc",
"boards": "Taulers",
"board-type": "Tipus de tauler",
"bounce-rate": "Percentatge de rebot",
"breakdown": "Desglossament",
"browser": "Navegador",
@@ -55,6 +54,8 @@
"confirm": "Confirmar",
"confirm-password": "Confirma la contrasenya",
"contains": "Conté",
"regex-match": "Coincideix amb l'expressió regular",
"regex-not-match": "No coincideix amb l'expressió regular",
"content": "Contingut",
"continue": "Continuar",
"conversion": "Conversió",
@@ -131,8 +132,8 @@
"funnels": "Embuts",
"goal": "Meta",
"goals": "Metes",
"goals-description": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments.",
"good": "Bo",
"goals-description": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments.",
"greater-than": "Més gran que",
"greater-than-equals": "Més gran que o igual a",
"grouped": "Agrupat",
@@ -140,10 +141,10 @@
"hostname": "Nom de host",
"hour": "Hora",
"includes": "Inclou",
"inp": "INP",
"insight": "Visió",
"insights": "Insights",
"insights-description": "Aprofundeixi en les seves dades mitjançant l'ús de segments i filtres.",
"inp": "INP",
"invalid-url": "URL no vàlida",
"is": "És igual a",
"is-false": "És fals",
@@ -177,11 +178,11 @@
"manage": "Administrar",
"manager": "Responsable",
"mask-level": "Nivell de màscara",
"max": "Màx",
"max-duration": "Durada màxima",
"match": "Coincidència",
"match-all": "Tots",
"match-any": "Qualsevol",
"max": "Màx",
"max-duration": "Durada màxima",
"maximize": "Expandeix",
"medium": "Mitjà",
"member": "Membre",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {registre} other {registres}}",
"ok": "D'acord",
"online": "En línia",
"open": "Mixt",
"organic-search": "Cerca orgànica",
"organic-shopping": "Compra orgànica",
"organic-social": "Social orgànic",
@@ -212,8 +214,8 @@
"page": "Pàgina",
"page-of": "Pàgina {current} de {total}",
"page-views": "Pàgines vistes",
"pages": "Pàgines",
"pageTitle": "Títol de la pàgina",
"pages": "Pàgines",
"paid-ads": "Anuncis de pagament",
"paid-search": "Cerca de pagament",
"paid-shopping": "Compra de pagament",
@@ -225,7 +227,6 @@
"performance": "Rendiment",
"pixel": "Píxel",
"pixels": "Píxels",
"play": "Reprodueix",
"poor": "Deficient",
"powered-by": "Funciona amb {name}",
"preferences": "Preferències",
@@ -246,16 +247,16 @@
"referrers": "Referents",
"refresh": "Refresca",
"regenerate": "Regenerar",
"regex-match": "Coincideix amb l'expressió regular",
"regex-not-match": "No coincideix amb l'expressió regular",
"region": "Regió",
"regions": "Regions",
"remaining": "Restant",
"remove": "Treure",
"remove-member": "Eliminar membre",
"play": "Reprodueix",
"replay": "Repetició",
"replay-enabled": "Repetició activada",
"replay-id": "Replay ID",
"replay-code": "Codi de repetició de sessió",
"replay-enabled": "Repetició activada",
"replays": "Repeticions",
"reports": "Informes",
"required": "Obligatori",
@@ -268,21 +269,24 @@
"revenue-description": "Observi els seus ingressos al llarg del temps.",
"role": "Rol",
"run-query": "Executar consulta",
"sample-rate": "Taxa de mostreig",
"sample-size": "Mida de la mostra",
"save": "Desa",
"save-cohort": "Desar cohort",
"save-replay": "Desa la repetició",
"save-segment": "Desar segment",
"sample-rate": "Taxa de mostreig",
"sample-size": "Mida de la mostra",
"screen": "Pantalla",
"screens": "Pantalles",
"search": "Buscar",
"segment": "Segment",
"segments": "Segments",
"select": "Seleccionar",
"select-component": "Selecciona un component",
"select-link": "Selecciona l'enllaç",
"select-pixel": "Selecciona el píxel",
"select-date": "Seleccionar data",
"select-filter": "Seleccionar filtre",
"select-role": "Seleccionar rol",
"select-component": "Selecciona un component",
"select-website": "Seleccionar lloc web",
"session": "Sessió",
"session-data": "Dades de sessió",
@@ -337,9 +341,15 @@
"unique": "Únic",
"unique-events": "Esdeveniments únics",
"unique-visitors": "Visitants únics",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clients Únics",
"customers": "Clients",
"orders": "Comandes",
"saved": "Desat",
"unknown": "Desconegut",
"untitled": "Sense títol",
"upgrade": "Actualitza",
"update": "Actualitzar",
"url": "URL",
"user": "Usuari",
@@ -379,8 +389,8 @@
"confirm-reset": "Segur que vol restablir les estadístiques de {target}?",
"delete-team-warning": "Al eliminar un equip també s'eliminaran tots els llocs web de l'equip.",
"delete-website-warning": "També s'esborraran totes les dades relacionades.",
"empty-dashboard": "El teu tauler és buit. Fes clic a Edita per afegir el teu primer component.",
"error": "S'ha produït un error.",
"empty-dashboard": "El teu tauler és buit. Fes clic a Edita per afegir el teu primer component.",
"event-log": "<b>{event}</b> a <a>{url}</a>",
"forbidden": "Prohibit",
"go-to-settings": "Vés a la configuració",
@@ -402,6 +412,7 @@
"reset-website": "Per restablir aquest lloc web, escrigui {confirmation} al cuadre inferior per confirmar.",
"reset-website-warning": "S'esborraran totes les estadístiques per aquest lloc web, però el codi de seguiment es mantindrà.",
"saved": "S'ha desat amb èxit.",
"select-board-entity-first": "Selecciona primer un lloc web, píxel o enllaç.",
"select-component-preview": "Selecciona un component per previsualitzar",
"select-website-first": "Primer selecciona un lloc web",
"sever-error": "Error del servidor",
@@ -417,6 +428,7 @@
"unauthorized": "No autoritzat",
"user-deleted": "Usuari eliminat.",
"viewed-page": "Pàgina vista",
"upgrade-required": "Aquesta funció requereix una subscripció al pla {plan}.",
"visitor-log": "Visitant de <b>{country}</b> usant <b>{browser}</b> a <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Celá doba",
"analysis": "Analýza",
"analytics": "Analytika",
"aov": "AOV",
"application": "Aplikace",
"apply": "Použít",
"arpu": "ARPU",
"attribution": "Atribuce",
"attribution-description": "Podívejte se, jak uživatelé interagují s vaším marketingem a co vede ke konverzím.",
"audience": "Publikum",
@@ -33,6 +31,7 @@
"behavior": "Chování",
"block-selector": "Výběr bloku",
"boards": "Nástěnky",
"board-type": "Typ nástěnky",
"bounce-rate": "Okamžité opuštění",
"breakdown": "Rozpis",
"browser": "Prohlížeč",
@@ -55,6 +54,8 @@
"confirm": "Potvrdit",
"confirm-password": "Potvrdit heslo",
"contains": "Obsahuje",
"regex-match": "Odpovídá regulárnímu výrazu",
"regex-not-match": "Neodpovídá regulárnímu výrazu",
"content": "Obsah",
"continue": "Pokračovat",
"conversion": "Konverze",
@@ -131,8 +132,8 @@
"funnels": "Trychtýře",
"goal": "Cíl",
"goals": "Cíle",
"goals-description": "Sledujte své cíle pro zobrazení stránek a události.",
"good": "Dobré",
"goals-description": "Sledujte své cíle pro zobrazení stránek a události.",
"greater-than": "Větší než",
"greater-than-equals": "Větší nebo rovno",
"grouped": "Seskupeno",
@@ -140,10 +141,10 @@
"hostname": "Název hostitele",
"hour": "Hodina",
"includes": "Zahrnuje",
"inp": "INP",
"insight": "Pohled",
"insights": "Pohledy",
"insights-description": "Ponořte se hlouběji do svých dat pomocí segmentů a filtrů.",
"inp": "INP",
"invalid-url": "Neplatná URL",
"is": "Je",
"is-false": "Nepravda",
@@ -177,11 +178,11 @@
"manage": "Spravovat",
"manager": "Správce",
"mask-level": "Úroveň masky",
"max": "Max",
"max-duration": "Maximální trvání",
"match": "Shoda",
"match-all": "Vše",
"match-any": "Jakýkoli",
"max": "Max",
"max-duration": "Maximální trvání",
"maximize": "Rozbalit",
"medium": "Střední",
"member": "Člen",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {záznam} other {záznamů}}",
"ok": "OK",
"online": "Online",
"open": "Smíšený",
"organic-search": "Organické vyhledávání",
"organic-shopping": "Organický nákup",
"organic-social": "Organická sociální síť",
@@ -212,8 +214,8 @@
"page": "Stránka",
"page-of": "Stránka {current} z {total}",
"page-views": "Zobrazení stránek",
"pages": "Stránky",
"pageTitle": "Název stránky",
"pages": "Stránky",
"paid-ads": "Placené reklamy",
"paid-search": "Placené vyhledávání",
"paid-shopping": "Placený nákup",
@@ -225,7 +227,6 @@
"performance": "Výkon",
"pixel": "Pixel",
"pixels": "Pixely",
"play": "Přehrát",
"poor": "Špatné",
"powered-by": "Běží na {name}",
"preferences": "Předvolby",
@@ -246,16 +247,16 @@
"referrers": "Odkazující",
"refresh": "Obnovit",
"regenerate": "Regenerovat",
"regex-match": "Odpovídá regulárnímu výrazu",
"regex-not-match": "Neodpovídá regulárnímu výrazu",
"region": "Region",
"regions": "Regiony",
"remaining": "Zbývá",
"remove": "Odstranit",
"remove-member": "Odstranit člena",
"play": "Přehrát",
"replay": "Přehrávání",
"replay-enabled": "Přehrávání povoleno",
"replay-id": "Replay ID",
"replay-code": "Kód přehrání relace",
"replay-enabled": "Přehrávání povoleno",
"replays": "Přehrávání",
"reports": "Hlášení",
"required": "Povinné",
@@ -268,21 +269,24 @@
"revenue-description": "Podívejte se na své příjmy v průběhu času.",
"role": "Role",
"run-query": "Spustit dotaz",
"sample-rate": "Frekvence vzorkování",
"sample-size": "Velikost vzorku",
"save": "Uložit",
"save-cohort": "Uložit kohortu",
"save-replay": "Uložit přehrání",
"save-segment": "Uložit segment",
"sample-rate": "Frekvence vzorkování",
"sample-size": "Velikost vzorku",
"screen": "Obrazovka",
"screens": "Obrazovky",
"search": "Hledat",
"segment": "Segment",
"segments": "Segmenty",
"select": "Vybrat",
"select-component": "Vyberte komponentu",
"select-link": "Vybrat odkaz",
"select-pixel": "Vybrat pixel",
"select-date": "Vybrat datum",
"select-filter": "Vybrat filtr",
"select-role": "Vybrat roli",
"select-component": "Vyberte komponentu",
"select-website": "Vybrat web",
"session": "Relace",
"session-data": "Data relace",
@@ -337,9 +341,15 @@
"unique": "Unikátní",
"unique-events": "Unikátní události",
"unique-visitors": "Jedinečné návštěvy",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unikátní zákazníci",
"customers": "Zákazníci",
"orders": "Objednávky",
"saved": "Uloženo",
"unknown": "Neznámý",
"untitled": "Bez názvu",
"upgrade": "Upgradovat",
"update": "Aktualizovat",
"url": "URL",
"user": "Uživatel",
@@ -379,8 +389,8 @@
"confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"delete-team-warning": "Smazání týmu smaže také všechny weby týmu.",
"delete-website-warning": "Všechna související data budou také smazána.",
"empty-dashboard": "Váš řídicí panel je prázdný. Klikněte na Upravit a přidejte první komponentu.",
"error": "Něco se pokazilo.",
"empty-dashboard": "Váš řídicí panel je prázdný. Klikněte na Upravit a přidejte první komponentu.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Zakázáno",
"go-to-settings": "Jít do nastavení",
@@ -402,6 +412,7 @@
"reset-website": "Pro resetování tohoto webu zadejte {confirmation} do pole níže.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Úspěšně uloženo.",
"select-board-entity-first": "Nejprve vyberte web, pixel nebo odkaz.",
"select-component-preview": "Vyberte komponentu pro náhled",
"select-website-first": "Nejprve vyberte web",
"sever-error": "Chyba serveru",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizováno",
"user-deleted": "Uživatel smazán.",
"viewed-page": "Zobrazená stránka",
"upgrade-required": "Tato funkce vyžaduje předplatné plánu {plan}.",
"visitor-log": "Návštěvník z <b>{country}</b> s prohlížečem <b>{browser}</b> na <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Altid",
"analysis": "Analyse",
"analytics": "Analyser",
"aov": "AOV",
"application": "Applikation",
"apply": "Anvend",
"arpu": "ARPU",
"attribution": "Attribuering",
"attribution-description": "Se, hvordan brugere interagerer med din markedsføring, og hvad der driver konverteringer.",
"audience": "Målgruppe",
@@ -33,6 +31,7 @@
"behavior": "Adfærd",
"block-selector": "Blokvælger",
"boards": "Tavler",
"board-type": "Tavletype",
"bounce-rate": "Afvisningsprocent",
"breakdown": "Opdeling",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Bekræft",
"confirm-password": "Godkendt adgangskode",
"contains": "Indeholder",
"regex-match": "Matcher regulært udtryk",
"regex-not-match": "Matcher ikke regulært udtryk",
"content": "Indhold",
"continue": "Fortsæt",
"conversion": "Konvertering",
@@ -131,8 +132,8 @@
"funnels": "Tragte",
"goal": "Mål",
"goals": "Mål",
"goals-description": "Følg dine mål for sidevisninger og hændelser.",
"good": "God",
"goals-description": "Følg dine mål for sidevisninger og hændelser.",
"greater-than": "Større end",
"greater-than-equals": "Større end eller lig med",
"grouped": "Gruperet",
@@ -140,10 +141,10 @@
"hostname": "Værtsnavn",
"hour": "Time",
"includes": "Inkluderer",
"inp": "INP",
"insight": "Indsigt",
"insights": "Indsigter",
"insights-description": "Dyk dybere ned i dine data ved at bruge segmenter og filtre.",
"inp": "INP",
"invalid-url": "Ugyldig URL",
"is": "Er",
"is-false": "Er falsk",
@@ -177,11 +178,11 @@
"manage": "Administrer",
"manager": "Leder",
"mask-level": "Maskeniveau",
"max": "Maks",
"max-duration": "Maksimal varighed",
"match": "Match",
"match-all": "Alle",
"match-any": "Enhver",
"max": "Maks",
"max-duration": "Maksimal varighed",
"maximize": "Udvid",
"medium": "Medie",
"member": "Medlem",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {post} other {poster}}",
"ok": "OK",
"online": "Online",
"open": "Blandet",
"organic-search": "Organisk søgning",
"organic-shopping": "Organisk shopping",
"organic-social": "Organisk social",
@@ -212,8 +214,8 @@
"page": "Side",
"page-of": "Side {current} af {total}",
"page-views": "Sidevisninger",
"pages": "Sider",
"pageTitle": "Sidetitel",
"pages": "Sider",
"paid-ads": "Betalte annoncer",
"paid-search": "Betalt søgning",
"paid-shopping": "Betalt shopping",
@@ -225,7 +227,6 @@
"performance": "Ydeevne",
"pixel": "Pixel",
"pixels": "Pixels",
"play": "Afspil",
"poor": "Dårlig",
"powered-by": "Drevet af {name}",
"preferences": "Præferencer",
@@ -246,16 +247,16 @@
"referrers": "Henvisninger",
"refresh": "Opdater",
"regenerate": "Gendan",
"regex-match": "Matcher regulært udtryk",
"regex-not-match": "Matcher ikke regulært udtryk",
"region": "Region",
"regions": "Regioner",
"remaining": "Tilbageværende",
"remove": "Fjern",
"remove-member": "Fjern medlem",
"play": "Afspil",
"replay": "Afspilning",
"replay-enabled": "Afspilning aktiveret",
"replay-id": "Replay ID",
"replay-code": "Kode til sessionsgengivelse",
"replay-enabled": "Afspilning aktiveret",
"replays": "Afspilninger",
"reports": "Rapporter",
"required": "Påkrævet",
@@ -268,21 +269,24 @@
"revenue-description": "Se din indtægt over tid.",
"role": "Rolle",
"run-query": "Kør forespørgsel",
"sample-rate": "Samplingshastighed",
"sample-size": "Stikprøvestørrelse",
"save": "Gem",
"save-cohort": "Gem kohorte",
"save-replay": "Gem gengivelse",
"save-segment": "Gem segment",
"sample-rate": "Samplingshastighed",
"sample-size": "Stikprøvestørrelse",
"screen": "Skærm",
"screens": "Skærme",
"search": "Søg",
"segment": "Segment",
"segments": "Segmenter",
"select": "Vælg",
"select-component": "Vælg komponent",
"select-link": "Vælg link",
"select-pixel": "Vælg pixel",
"select-date": "Vælg dato",
"select-filter": "Vælg filter",
"select-role": "Vælg rolle",
"select-component": "Vælg komponent",
"select-website": "Vælg hjemmeside",
"session": "Session",
"session-data": "Sessionsdata",
@@ -337,9 +341,15 @@
"unique": "Unik",
"unique-events": "Unikke begivenheder",
"unique-visitors": "Unikke besøgende",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unikke kunder",
"customers": "Kunder",
"orders": "Ordrer",
"saved": "Gemt",
"unknown": "Ukendt",
"untitled": "Uden titel",
"upgrade": "Opgrader",
"update": "Opdater",
"url": "URL",
"user": "Bruger",
@@ -379,8 +389,8 @@
"confirm-reset": "Er du sikker på at du ville nulstille {target}'s statistikker?",
"delete-team-warning": "Sletning af et hold sletter også alle holdets websites.",
"delete-website-warning": "Alle tilknyttede data slettes også.",
"empty-dashboard": "Dit dashboard er tomt. Klik på Rediger for at tilføje din første komponent.",
"error": "Noget gik galt.",
"empty-dashboard": "Dit dashboard er tomt. Klik på Rediger for at tilføje din første komponent.",
"event-log": "<b>{event}</b> på <a>{url}</a>",
"forbidden": "Forbudt",
"go-to-settings": "Gå til betjeningspanel",
@@ -402,6 +412,7 @@
"reset-website": "For at nulstille denne website, skriv {confirmation} i feltet herunder for at bekræfte.",
"reset-website-warning": "Alle statistikker for denne hjemmeside ville blive slettet, men sporingskode ville forblive intakt.",
"saved": "Gemt!",
"select-board-entity-first": "Vælg først et website, pixel eller link.",
"select-component-preview": "Vælg en komponent for at se forhåndsvisning",
"select-website-first": "Vælg et websted først",
"sever-error": "Serverfejl",
@@ -417,6 +428,7 @@
"unauthorized": "Ikke autoriseret",
"user-deleted": "Bruger slettet.",
"viewed-page": "Vist side",
"upgrade-required": "Denne funktion kræver et {plan}-abonnement.",
"visitor-log": "Besøgende fra <b>{country}</b> bruger <b>{browser}</b> på <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Gsamte Zitruum",
"analysis": "Analyse",
"analytics": "Analytik",
"aov": "AOV",
"application": "Anwendung",
"apply": "Aawände",
"arpu": "ARPU",
"attribution": "Zuordnig",
"attribution-description": "Lueg wie d'Benutzer mit dim Marketing interagiere und was zu Umwandlige führt.",
"audience": "Zielgruppe",
@@ -33,6 +31,7 @@
"behavior": "Verhalte",
"block-selector": "Blockauswahl",
"boards": "Boards",
"board-type": "Board-Typ",
"bounce-rate": "Absprungsrate",
"breakdown": "Uufschlüsselig",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Bestätige",
"confirm-password": "Passwort widerhole",
"contains": "Enthaltet",
"regex-match": "Entspricht regulärem Ausdruck",
"regex-not-match": "Entspricht nicht regulärem Ausdruck",
"content": "Inhalt",
"continue": "Wiiter",
"conversion": "Umwandlig",
@@ -131,8 +132,8 @@
"funnels": "Trichter",
"goal": "Ziel",
"goals": "Ziele",
"goals-description": "verfolged Sie Ihri Ziel für Siitenufrüef und Ereigniss.",
"good": "Gut",
"goals-description": "verfolged Sie Ihri Ziel für Siitenufrüef und Ereigniss.",
"greater-than": "Grösser als",
"greater-than-equals": "Grösser oder gliich",
"grouped": "Gruppiert",
@@ -140,10 +141,10 @@
"hostname": "Hostnam",
"hour": "Stunde",
"includes": "Isch debii",
"inp": "INP",
"insight": "Iiblick",
"insights": "Iiblick",
"insights-description": "Vertüfed Sie sich i Ihri Date, mit Hilf vo Segment und Filter.",
"inp": "INP",
"invalid-url": "Ungültige URL",
"is": "Isch",
"is-false": "Isch falsch",
@@ -177,11 +178,11 @@
"manage": "Verwalte",
"manager": "Verwalter",
"mask-level": "Maskierungsstufe",
"max": "Max",
"max-duration": "Maximale Dauer",
"match": "Übereinstimmung",
"match-all": "Alle",
"match-any": "Beliebige",
"max": "Max",
"max-duration": "Maximale Dauer",
"maximize": "Uusklappe",
"medium": "Medium",
"member": "Mitglied",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {Datensatz} other {Datensätze}}",
"ok": "OK",
"online": "Online",
"open": "Gemischt",
"organic-search": "Organischi Suechi",
"organic-shopping": "Organischi Iikauf",
"organic-social": "Organischi Social Media",
@@ -212,8 +214,8 @@
"page": "Siite",
"page-of": "Siite {current} vo {total}",
"page-views": "Siitenufrüef",
"pages": "Siite",
"pageTitle": "Siitetitel",
"pages": "Siite",
"paid-ads": "Bezahlti Werbung",
"paid-search": "Bezahlti Suechi",
"paid-shopping": "Bezahlti Iikauf",
@@ -225,7 +227,6 @@
"performance": "Leistung",
"pixel": "Pixel",
"pixels": "Pixel",
"play": "Abspielen",
"poor": "Schlecht",
"powered-by": "Betriibe dur {name}",
"preferences": "Einstellungen",
@@ -246,16 +247,16 @@
"referrers": "Verwiisendi",
"refresh": "Aktualisiere",
"regenerate": "Erneuere",
"regex-match": "Entspricht regulärem Ausdruck",
"regex-not-match": "Entspricht nicht regulärem Ausdruck",
"region": "Region",
"regions": "Regionä",
"remaining": "Verblibe",
"remove": "Entferne",
"remove-member": "Mitglied entferne",
"play": "Abspielen",
"replay": "Wiedergabe",
"replay-enabled": "Wiedergabe aktiviert",
"replay-id": "Replay ID",
"replay-code": "Session-Replay-Code",
"replay-enabled": "Wiedergabe aktiviert",
"replays": "Wiedergaben",
"reports": "Brichte",
"required": "Erforderlich",
@@ -268,21 +269,24 @@
"revenue-description": "Lueged Sie sich Ihre Umsatz im Lauf vor Ziit a.",
"role": "Rollä",
"run-query": "Abfrag starte",
"sample-rate": "Abtastrate",
"sample-size": "Stichprobengrösse",
"save": "Speichere",
"save-cohort": "Kohorte speichern",
"save-replay": "Replay speichern",
"save-segment": "Segment speichern",
"sample-rate": "Abtastrate",
"sample-size": "Stichprobengrösse",
"screen": "Bildschirm",
"screens": "Bildschirmuflösige",
"search": "Sueche",
"segment": "Segment",
"segments": "Segmente",
"select": "Auswähle",
"select-component": "Komponente auswählen",
"select-link": "Link auswählen",
"select-pixel": "Pixel auswählen",
"select-date": "Datä uuswähle",
"select-filter": "Filter uuswähle",
"select-role": "Rollä uuswähle",
"select-component": "Komponente auswählen",
"select-website": "Websiite uuswähle",
"session": "Sitzig",
"session-data": "Sitzigsdate",
@@ -337,9 +341,15 @@
"unique": "Einzigartigi",
"unique-events": "Einzigartige Ereignisse",
"unique-visitors": "Einzigartigi Bsuecher",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Einzigartigi Kunde",
"customers": "Kunden",
"orders": "Bestellungen",
"saved": "Gespeichert",
"unknown": "Unbekannt",
"untitled": "Unbennant",
"upgrade": "Upgrade",
"update": "Aktualisieren",
"url": "URL",
"user": "Benutzer",
@@ -379,8 +389,8 @@
"confirm-reset": "Sind Sie sicher, dass Sie d Statistike vo {target} zruggsetze wänd?",
"delete-team-warning": "Es Team lösche dued ebefalls alli team Websiite lösche.",
"delete-website-warning": "Alli dezueghörige Date werded ebefalls glöscht.",
"empty-dashboard": "Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.",
"error": "Es isch en Fehler ufträte.",
"empty-dashboard": "Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.",
"event-log": "<b>{event}</b> uf <a>{url}</a>",
"forbidden": "Verboten",
"go-to-settings": "Zu de Istellige",
@@ -402,6 +412,7 @@
"reset-website": "Um die Websiite zruggzsetze, typed Sie {confirmation} is Feld unde dran.",
"reset-website-warning": "Alli Date für die Websiite werdet glöscht, nur de Tracking Code blibt bestah.",
"saved": "Erfolgrich gspeichert.",
"select-board-entity-first": "Wählen Sie zuerst eine Website, einen Pixel oder einen Link aus.",
"select-component-preview": "Wählen Sie eine Komponente für die Vorschau",
"select-website-first": "Wählen Sie zuerst eine Website",
"sever-error": "Serverfehler",
@@ -417,6 +428,7 @@
"unauthorized": "Nicht autorisiert",
"user-deleted": "Bnutzer glöscht.",
"viewed-page": "Siite agluegt",
"upgrade-required": "Diese Funktion erfordert ein {plan}-Abonnement.",
"visitor-log": "Bsuecher us <b>{country}</b> nutzt <b>{browser}</b> uf <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Gesamter Zeitraum",
"analysis": "Analyse",
"analytics": "Analysen",
"aov": "AOV",
"application": "Anwendung",
"apply": "Anwenden",
"arpu": "ARPU",
"attribution": "Zuordnung",
"attribution-description": "Sehen Sie, wie Nutzer mit Ihrem Marketing interagieren und was zu Konversionen führt.",
"audience": "Zielgruppe",
@@ -33,6 +31,7 @@
"behavior": "Verhalten",
"block-selector": "Blockauswahl",
"boards": "Boards",
"board-type": "Board-Typ",
"bounce-rate": "Absprungrate",
"breakdown": "Aufschlüsselung",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Bestätigen",
"confirm-password": "Passwort wiederholen",
"contains": "Enthält",
"regex-match": "Entspricht regulärem Ausdruck",
"regex-not-match": "Entspricht nicht regulärem Ausdruck",
"content": "Inhalt",
"continue": "Weiter",
"conversion": "Konversion",
@@ -131,8 +132,8 @@
"funnels": "Trichter",
"goal": "Ziel",
"goals": "Ziele",
"goals-description": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse.",
"good": "Gut",
"goals-description": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse.",
"greater-than": "Größer als",
"greater-than-equals": "Größer oder gleich",
"grouped": "Gruppiert",
@@ -140,10 +141,10 @@
"hostname": "Hostname",
"hour": "Stunde",
"includes": "Enthält",
"inp": "INP",
"insight": "Einblick",
"insights": "Einblicke",
"insights-description": "Vertiefen Sie sich mit Hilfe von Segmenten und Filtern in Ihre Daten.",
"inp": "INP",
"invalid-url": "Ungültige URL",
"is": "Ist",
"is-false": "Ist falsch",
@@ -177,11 +178,11 @@
"manage": "Verwalten",
"manager": "Verwaltung",
"mask-level": "Maskierungsstufe",
"max": "Max",
"max-duration": "Maximale Dauer",
"match": "Übereinstimmung",
"match-all": "Alle",
"match-any": "Beliebige",
"max": "Max",
"max-duration": "Maximale Dauer",
"maximize": "Erweitern",
"medium": "Medium",
"member": "Mitglied",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {Datensatz} other {Datensätze}}",
"ok": "OK",
"online": "Online",
"open": "Gemischt",
"organic-search": "Organische Suche",
"organic-shopping": "Organisches Shopping",
"organic-social": "Organisches Social Media",
@@ -212,8 +214,8 @@
"page": "Seite",
"page-of": "Seite {current} von {total}",
"page-views": "Seitenaufrufe",
"pages": "Seiten",
"pageTitle": "Seitentitel",
"pages": "Seiten",
"paid-ads": "Bezahlte Anzeigen",
"paid-search": "Bezahlte Suche",
"paid-shopping": "Bezahltes Shopping",
@@ -225,7 +227,6 @@
"performance": "Leistung",
"pixel": "Pixel",
"pixels": "Pixel",
"play": "Abspielen",
"poor": "Schlecht",
"powered-by": "Betrieben durch {name}",
"preferences": "Einstellungen",
@@ -246,16 +247,16 @@
"referrers": "Übermittler",
"refresh": "Aktualisieren",
"regenerate": "Erneuern",
"regex-match": "Entspricht regulärem Ausdruck",
"regex-not-match": "Entspricht nicht regulärem Ausdruck",
"region": "Region",
"regions": "Regionen",
"remaining": "Verbleibend",
"remove": "Entfernen",
"remove-member": "Mitglied entfernen",
"play": "Abspielen",
"replay": "Wiedergabe",
"replay-enabled": "Wiedergabe aktiviert",
"replay-id": "Replay ID",
"replay-code": "Session-Replay-Code",
"replay-enabled": "Wiedergabe aktiviert",
"replays": "Wiedergaben",
"reports": "Berichte",
"required": "Erforderlich",
@@ -268,21 +269,24 @@
"revenue-description": "Haben Sie einen Blick auf Ihre Umsätze im Laufe der Zeit.",
"role": "Rolle",
"run-query": "Abfrage starten",
"sample-rate": "Abtastrate",
"sample-size": "Stichprobengröße",
"save": "Speichern",
"save-cohort": "Kohorte speichern",
"save-replay": "Replay speichern",
"save-segment": "Segment speichern",
"sample-rate": "Abtastrate",
"sample-size": "Stichprobengröße",
"screen": "Bildschirm",
"screens": "Bildschirmauflösungen",
"search": "Suche",
"segment": "Segment",
"segments": "Segmente",
"select": "Auswählen",
"select-component": "Komponente auswählen",
"select-link": "Link auswählen",
"select-pixel": "Pixel auswählen",
"select-date": "Datum auswählen",
"select-filter": "Filter auswählen",
"select-role": "Rolle auswählen",
"select-component": "Komponente auswählen",
"select-website": "Website auswählen",
"session": "Sitzung",
"session-data": "Sitzungsdaten",
@@ -337,9 +341,15 @@
"unique": "Einzigartig",
"unique-events": "Einzigartige Ereignisse",
"unique-visitors": "Einzigartige Besucher",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Einzigartige Kunden",
"customers": "Kunden",
"orders": "Bestellungen",
"saved": "Gespeichert",
"unknown": "Unbekannt",
"untitled": "Unbenannt",
"upgrade": "Upgrade",
"update": "Aktualisieren",
"url": "URL",
"user": "Benutzer",
@@ -379,8 +389,8 @@
"confirm-reset": "Sind Sie sicher, dass Sie die Statistiken von {target} zurücksetzen wollen?",
"delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websites löschen.",
"delete-website-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.",
"empty-dashboard": "Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.",
"error": "Es ist ein Fehler aufgetreten.",
"empty-dashboard": "Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.",
"event-log": "<b>{event}</b> auf <a>{url}</a>",
"forbidden": "Verboten",
"go-to-settings": "Zu den Einstellungen",
@@ -402,6 +412,7 @@
"reset-website": "Um diese Website zurückzusetzen, geben Sie zur Bestätigung {confirmation} in das Feld unten ein.",
"reset-website-warning": "Alle Daten für diese Website werden gelöscht, jedoch bleibt der Tracking Code bestehen.",
"saved": "Erfolgreich gespeichert.",
"select-board-entity-first": "Wählen Sie zuerst eine Website, einen Pixel oder einen Link aus.",
"select-component-preview": "Wählen Sie eine Komponente für die Vorschau",
"select-website-first": "Wählen Sie zuerst eine Website",
"sever-error": "Serverfehler",
@@ -417,6 +428,7 @@
"unauthorized": "Nicht autorisiert",
"user-deleted": "Benutzer gelöscht.",
"viewed-page": "Seite besucht",
"upgrade-required": "Diese Funktion erfordert ein {plan}-Abonnement.",
"visitor-log": "Besucher aus <b>{country}</b> benutzt <b>{browser}</b> auf <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "All time",
"analysis": "Analysis",
"analytics": "Analytics",
"aov": "AOV",
"application": "Application",
"apply": "Apply",
"arpu": "ARPU",
"attribution": "Attribution",
"attribution-description": "See how users engage with your marketing and what drives conversions.",
"audience": "Audience",
@@ -33,6 +31,7 @@
"behavior": "Behaviour",
"block-selector": "Block selector",
"boards": "Boards",
"board-type": "Board type",
"bounce-rate": "Bounce rate",
"breakdown": "Breakdown",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Confirm",
"confirm-password": "Confirm password",
"contains": "Contains",
"regex-match": "Matches regex",
"regex-not-match": "Does not match regex",
"content": "Content",
"continue": "Continue",
"conversion": "Conversion",
@@ -131,8 +132,8 @@
"funnels": "Funnels",
"goal": "Goal",
"goals": "Goals",
"goals-description": "Track your goals for pageviews and events.",
"good": "Good",
"goals-description": "Track your goals for pageviews and events.",
"greater-than": "Greater than",
"greater-than-equals": "Greater than or equals",
"grouped": "Grouped",
@@ -140,10 +141,10 @@
"hostname": "Hostname",
"hour": "Hour",
"includes": "Includes",
"inp": "INP",
"insight": "Insight",
"insights": "Insights",
"insights-description": "Dive deeper into your data by using segments and filters.",
"inp": "INP",
"invalid-url": "Invalid URL",
"is": "Is",
"is-false": "Is false",
@@ -177,11 +178,11 @@
"manage": "Manage",
"manager": "Manager",
"mask-level": "Mask level",
"max": "Max",
"max-duration": "Max duration",
"match": "Match",
"match-all": "All",
"match-any": "Any",
"max": "Max",
"max-duration": "Max duration",
"maximize": "Expand",
"medium": "Medium",
"member": "Member",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {record} other {records}}",
"ok": "OK",
"online": "Online",
"open": "Mixed",
"organic-search": "Organic search",
"organic-shopping": "Organic shopping",
"organic-social": "Organic social",
@@ -212,8 +214,8 @@
"page": "Page",
"page-of": "Page {current} of {total}",
"page-views": "Page views",
"pages": "Pages",
"pageTitle": "Page title",
"pages": "Pages",
"paid-ads": "Paid ads",
"paid-search": "Paid search",
"paid-shopping": "Paid shopping",
@@ -225,7 +227,6 @@
"performance": "Performance",
"pixel": "Pixel",
"pixels": "Pixels",
"play": "Play",
"poor": "Poor",
"powered-by": "Powered by {name}",
"preferences": "Preferences",
@@ -246,16 +247,16 @@
"referrers": "Referrers",
"refresh": "Refresh",
"regenerate": "Regenerate",
"regex-match": "Matches regex",
"regex-not-match": "Does not match regex",
"region": "Region",
"regions": "Regions",
"remaining": "Remaining",
"remove": "Remove",
"remove-member": "Remove member",
"play": "Play",
"replay": "Replay",
"replay-enabled": "Replay enabled",
"replay-id": "Replay ID",
"replay-code": "Session replay code",
"replay-enabled": "Replay enabled",
"replays": "Replays",
"reports": "Reports",
"required": "Required",
@@ -268,21 +269,24 @@
"revenue-description": "Look into your revenue across time.",
"role": "Role",
"run-query": "Run query",
"sample-rate": "Sample rate",
"sample-size": "Sample size",
"save": "Save",
"save-cohort": "Save cohort",
"save-replay": "Save replay",
"save-segment": "Save segment",
"sample-rate": "Sample rate",
"sample-size": "Sample size",
"screen": "Screen",
"screens": "Screens",
"search": "Search",
"segment": "Segment",
"segments": "Segments",
"select": "Select",
"select-component": "Select component",
"select-link": "Select link",
"select-pixel": "Select pixel",
"select-date": "Select date",
"select-filter": "Select filter",
"select-role": "Select role",
"select-component": "Select component",
"select-website": "Select website",
"session": "Session",
"session-data": "Session data",
@@ -337,9 +341,15 @@
"unique": "Unique",
"unique-events": "Unique events",
"unique-visitors": "Unique visitors",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unique Customers",
"customers": "Customers",
"orders": "Orders",
"saved": "Saved",
"unknown": "Unknown",
"untitled": "Untitled",
"upgrade": "Upgrade",
"update": "Update",
"url": "URL",
"user": "User",
@@ -379,8 +389,8 @@
"confirm-reset": "Are you sure you want to reset {target}'s statistics?",
"delete-team-warning": "Deleting a team will also delete all team websites.",
"delete-website-warning": "All associated data will be deleted as well.",
"empty-dashboard": "Your dashboard is empty. Click Edit to add your first component.",
"error": "Something went wrong.",
"empty-dashboard": "Your dashboard is empty. Click Edit to add your first component.",
"event-log": "<b>{event}</b> on <a>{url}</a>",
"forbidden": "Forbidden",
"go-to-settings": "Go to settings",
@@ -402,6 +412,7 @@
"reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Saved successfully.",
"select-board-entity-first": "Select a website, pixel, or link first.",
"select-component-preview": "Select a component to preview",
"select-website-first": "Select a website first",
"sever-error": "Server error",
@@ -417,6 +428,7 @@
"unauthorized": "Unauthorized",
"user-deleted": "User deleted.",
"viewed-page": "Viewed page",
"upgrade-required": "This feature requires a {plan} plan subscription.",
"visitor-log": "Visitor from <b>{country}</b> using <b>{browser}</b> on <b>{os}</b> <b>{device}</b>"
}
}
+3
View File
@@ -125,6 +125,8 @@
"filter-combined": "Combined",
"filter-raw": "Raw",
"filters": "Filters",
"property-filter": "Property Filter",
"activity-by-property": "Activity by property",
"first-click": "First click",
"first-seen": "First seen",
"funnel": "Funnel",
@@ -287,6 +289,7 @@
"select-filter": "Select filter",
"select-role": "Select role",
"select-component": "Select component",
"select-event": "Select an event",
"select-website": "Select website",
"session": "Session",
"session-data": "Session data",
+30 -18
View File
@@ -20,10 +20,8 @@
"all-time": "Todos los tiempos",
"analysis": "Análisis",
"analytics": "Analíticas",
"aov": "AOV",
"application": "Aplicación",
"apply": "Aplicar",
"arpu": "ARPU",
"attribution": "Atribución",
"attribution-description": "Vea cómo los usuarios interactúan con su marketing y qué impulsa las conversiones.",
"audience": "Audiencia",
@@ -33,6 +31,7 @@
"behavior": "Comportamiento",
"block-selector": "Selector de bloque",
"boards": "Tableros",
"board-type": "Tipo de tablero",
"bounce-rate": "Porcentaje de rebote",
"breakdown": "Desglose",
"browser": "Navegador",
@@ -55,6 +54,8 @@
"confirm": "Confirmar",
"confirm-password": "Confirmar contraseña",
"contains": "Contiene",
"regex-match": "Coincide con expresión regular",
"regex-not-match": "No coincide con expresión regular",
"content": "Contenido",
"continue": "Continuar",
"conversion": "Conversión",
@@ -131,8 +132,8 @@
"funnels": "Embudos",
"goal": "Objetivo",
"goals": "Objetivos",
"goals-description": "Realice un seguimiento de sus objetivos de páginas vistas y eventos.",
"good": "Bueno",
"goals-description": "Realice un seguimiento de sus objetivos de páginas vistas y eventos.",
"greater-than": "Mayor que",
"greater-than-equals": "Mayor que o igual a",
"grouped": "Agrupado",
@@ -140,10 +141,10 @@
"hostname": "Nombre de host",
"hour": "Hora",
"includes": "Incluye",
"inp": "INP",
"insight": "Perspectiva",
"insights": "Perspectivas",
"insights-description": "Profundice en sus datos mediante el uso de segmentos y filtros.",
"inp": "INP",
"invalid-url": "URL no válida",
"is": "Es igual a",
"is-false": "Es falso",
@@ -177,11 +178,11 @@
"manage": "Administrar",
"manager": "Gerente",
"mask-level": "Nivel de máscara",
"max": "Máximo",
"max-duration": "Duración máxima",
"match": "Coincidencia",
"match-all": "Todo",
"match-any": "Cualquiera",
"max": "Máximo",
"max-duration": "Duración máxima",
"maximize": "Expandir",
"medium": "Medio",
"member": "Miembro",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {registro} other {registros}}",
"ok": "Aceptar",
"online": "En línea",
"open": "Mixto",
"organic-search": "Búsqueda orgánica",
"organic-shopping": "Compras orgánicas",
"organic-social": "Social orgánico",
@@ -212,8 +214,8 @@
"page": "Página",
"page-of": "Página {current} de {total}",
"page-views": "Vistas",
"pages": "Páginas",
"pageTitle": "Título de página",
"pages": "Páginas",
"paid-ads": "Anuncios pagados",
"paid-search": "Búsqueda pagada",
"paid-shopping": "Compras pagadas",
@@ -225,7 +227,6 @@
"performance": "Rendimiento",
"pixel": "Píxel",
"pixels": "Píxeles",
"play": "Reproducir",
"poor": "Deficiente",
"powered-by": "Analíticas de {name}",
"preferences": "Preferencias",
@@ -246,16 +247,16 @@
"referrers": "Referido desde",
"refresh": "Actualizar",
"regenerate": "Regenerar",
"regex-match": "Coincide con expresión regular",
"regex-not-match": "No coincide con expresión regular",
"region": "Región",
"regions": "Regiones",
"remaining": "Restante",
"remove": "Quitar",
"remove-member": "Eliminar miembro",
"play": "Reproducir",
"replay": "Repetición",
"replay-enabled": "Repetición activada",
"replay-id": "Replay ID",
"replay-code": "Código de repetición de sesión",
"replay-enabled": "Repetición activada",
"replays": "Repeticiones",
"reports": "Informes",
"required": "Obligatorio",
@@ -266,24 +267,26 @@
"retention-description": "Medir la frecuencia con la que los usuarios vuelven a tu sitio web.",
"revenue": "Ganancias",
"revenue-description": "Analice sus ganancias a lo largo del tiempo.",
"revenue-property": "Propiedad de ganancias",
"role": "Rol",
"run-query": "Ejecutar consulta",
"sample-rate": "Tasa de muestreo",
"sample-size": "Tamaño de muestra",
"save": "Guardar",
"save-cohort": "Guardar cohorte",
"save-replay": "Guardar repetición",
"save-segment": "Guardar segmento",
"sample-rate": "Tasa de muestreo",
"sample-size": "Tamaño de muestra",
"screen": "Pantalla",
"screens": "Pantallas",
"search": "Buscar",
"segment": "Segmento",
"segments": "Segmentos",
"select": "Seleccionar",
"select-component": "Seleccionar componente",
"select-link": "Seleccionar enlace",
"select-pixel": "Seleccionar píxel",
"select-date": "Seleccionar fecha",
"select-filter": "Seleccionar filtro",
"select-role": "Seleccionar rol",
"select-component": "Seleccionar componente",
"select-website": "Seleccionar sitio web",
"session": "Sesión",
"session-data": "Datos de sesión",
@@ -338,13 +341,18 @@
"unique": "Único",
"unique-events": "Eventos únicos",
"unique-visitors": "Visitantes únicos",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clientes únicos",
"customers": "Clientes",
"orders": "Pedidos",
"saved": "Guardado",
"unknown": "Desconocida",
"untitled": "Sin título",
"upgrade": "Actualizar",
"update": "Actualizar",
"url": "URL",
"user": "Usuario",
"user-property": "Propiedad de usuario",
"username": "Nombre de usuario",
"users": "Usuarios",
"utm": "UTM",
@@ -368,7 +376,9 @@
"website-id": "ID del sitio web",
"websites": "Sitios web",
"window": "Ventana",
"yesterday": "Ayer"
"yesterday": "Ayer",
"revenue-property": "Propiedad de ganancias",
"user-property": "Propiedad de usuario"
},
"message": {
"action-confirmation": "Escriba {confirmation} en el cuadro a continuación para confirmar.",
@@ -381,8 +391,8 @@
"confirm-reset": "¿Seguro que quieres BORRAR las analíticas de {target}?",
"delete-team-warning": "Al eliminar un equipo, también se eliminarán todos los sitios web del equipo.",
"delete-website-warning": "Toda la información relacionada será eliminada.",
"empty-dashboard": "Tu panel está vacío. Haz clic en Editar para añadir tu primer componente.",
"error": "Algo falló.",
"empty-dashboard": "Tu panel está vacío. Haz clic en Editar para añadir tu primer componente.",
"event-log": "<b>{event}</b> en <a>{url}</a>",
"forbidden": "Prohibido",
"go-to-settings": "Ir a la configuración",
@@ -404,6 +414,7 @@
"reset-website": "Para reiniciar este sitio web, escribe {confirmation} a continuación para confirmar.",
"reset-website-warning": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto.",
"saved": "Guardado",
"select-board-entity-first": "Selecciona primero un sitio web, píxel o enlace.",
"select-component-preview": "Selecciona un componente para previsualizar",
"select-website-first": "Selecciona un sitio web primero",
"sever-error": "Error del servidor",
@@ -419,6 +430,7 @@
"unauthorized": "No autorizado",
"user-deleted": "Usuario eliminado.",
"viewed-page": "Página vista",
"upgrade-required": "Esta función requiere una suscripción al plan {plan}.",
"visitor-log": "Visitante desde <b>{country}</b> usando <b>{browser}</b> en <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Alusta lähtien",
"analysis": "Analyysi",
"analytics": "Analytiikka",
"aov": "AOV",
"application": "Sovellus",
"apply": "Käytä",
"arpu": "ARPU",
"attribution": "Attribuutio",
"attribution-description": "Katso, miten käyttäjät ovat vuorovaikutuksessa markkinointisi kanssa ja mikä johtaa konversioihin.",
"audience": "Yleisö",
@@ -33,6 +31,7 @@
"behavior": "Käyttäytyminen",
"block-selector": "Lohkovalitsin",
"boards": "Taulut",
"board-type": "Taulun tyyppi",
"bounce-rate": "Välitön poistuminen",
"breakdown": "Erittele",
"browser": "Selain",
@@ -55,6 +54,8 @@
"confirm": "Vahvista",
"confirm-password": "Vahvista salasana",
"contains": "Sisältää",
"regex-match": "Vastaa säännöllistä lauseketta",
"regex-not-match": "Ei vastaa säännöllistä lauseketta",
"content": "Sisältö",
"continue": "Jatka",
"conversion": "Konversio",
@@ -131,8 +132,8 @@
"funnels": "Suppilot",
"goal": "Tavoite",
"goals": "Tavoitteet",
"goals-description": "Seuraa sivun katselujen ja tapahtumien tavoitteitasi.",
"good": "Hyvä",
"goals-description": "Seuraa sivun katselujen ja tapahtumien tavoitteitasi.",
"greater-than": "Suurempi kuin",
"greater-than-equals": "Suurempi tai yhtä suuri kuin",
"grouped": "Ryhmitelty",
@@ -140,10 +141,10 @@
"hostname": "Isäntänimi",
"hour": "Tunti",
"includes": "Sisältää",
"inp": "INP",
"insight": "Oivallus",
"insights": "Oivallukset",
"insights-description": "Sukella syvemmälle tietoihisi käyttämällä segmenttejä ja suodattimia.",
"inp": "INP",
"invalid-url": "Virheellinen URL",
"is": "On",
"is-false": "On epätosi",
@@ -177,11 +178,11 @@
"manage": "Hallinnoi",
"manager": "Päällikkö",
"mask-level": "Maskitaso",
"max": "Maksimi",
"max-duration": "Enimmäiskesto",
"match": "Vastaavuus",
"match-all": "Kaikki",
"match-any": "Mikä tahansa",
"max": "Maksimi",
"max-duration": "Enimmäiskesto",
"maximize": "Laajenna",
"medium": "Keskitaso",
"member": "Jäsen",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {tietue} other {tietuetta}}",
"ok": "OK",
"online": "Verkossa",
"open": "Sekalainen",
"organic-search": "Orgaaninen haku",
"organic-shopping": "Orgaaninen ostaminen",
"organic-social": "Orgaaninen sosiaalinen",
@@ -212,8 +214,8 @@
"page": "Sivu",
"page-of": "Sivu {current} / {total}",
"page-views": "Sivun näyttökerrat",
"pages": "Sivut",
"pageTitle": "Sivun otsikko",
"pages": "Sivut",
"paid-ads": "Maksetut mainokset",
"paid-search": "Maksettu haku",
"paid-shopping": "Maksettu ostaminen",
@@ -225,7 +227,6 @@
"performance": "Suorituskyky",
"pixel": "Pikseli",
"pixels": "Pikselit",
"play": "Toista",
"poor": "Huono",
"powered-by": "Voimanlähteenä {name}",
"preferences": "Asetukset",
@@ -246,16 +247,16 @@
"referrers": "Viittaajat",
"refresh": "Päivitä",
"regenerate": "Luo uudelleen",
"regex-match": "Vastaa säännöllistä lauseketta",
"regex-not-match": "Ei vastaa säännöllistä lauseketta",
"region": "Alue",
"regions": "Alueet",
"remaining": "Jäljellä",
"remove": "Poista",
"remove-member": "Poista jäsen",
"play": "Toista",
"replay": "Toisto",
"replay-enabled": "Toisto käytössä",
"replay-id": "Replay ID",
"replay-code": "Istunnon toistokoodi",
"replay-enabled": "Toisto käytössä",
"replays": "Toistot",
"reports": "Raportit",
"required": "Vaaditaan",
@@ -268,21 +269,24 @@
"revenue-description": "Katso tulosi ajan mittaan.",
"role": "Rooli",
"run-query": "Suorita kysely",
"sample-rate": "Näytteenottotaajuus",
"sample-size": "Otoskoko",
"save": "Tallenna",
"save-cohort": "Tallenna kohortti",
"save-replay": "Tallenna toisto",
"save-segment": "Tallenna segmentti",
"sample-rate": "Näytteenottotaajuus",
"sample-size": "Otoskoko",
"screen": "Näyttö",
"screens": "Näytöt",
"search": "Haku",
"segment": "Segmentti",
"segments": "Segmentit",
"select": "Valitse",
"select-component": "Valitse komponentti",
"select-link": "Valitse linkki",
"select-pixel": "Valitse pikseli",
"select-date": "Valitse päivämäärä",
"select-filter": "Valitse suodatin",
"select-role": "Valitse rooli",
"select-component": "Valitse komponentti",
"select-website": "Valitse verkkosivu",
"session": "Istunto",
"session-data": "Istuntotiedot",
@@ -337,9 +341,15 @@
"unique": "Uniikki",
"unique-events": "Uniikit tapahtumat",
"unique-visitors": "Yksittäiset kävijät",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Uniikit asiakkaat",
"customers": "Asiakkaat",
"orders": "Tilaukset",
"saved": "Tallennettu",
"unknown": "Tuntematon",
"untitled": "Nimetön",
"upgrade": "Päivitä",
"update": "Päivitä",
"url": "URL",
"user": "Käyttäjä",
@@ -379,8 +389,8 @@
"confirm-reset": "Haluatko varmasti poistaa sivuston {target} tilastot?",
"delete-team-warning": "Tiimin poistaminen poistaa myös kaikki tiimin sivustot.",
"delete-website-warning": "Kaikki siihen liittyvät tiedot poistetaan.",
"empty-dashboard": "Koontinäyttösi on tyhjä. Napsauta Muokkaa lisätäksesi ensimmäisen komponentin.",
"error": "Jotain meni pieleen.",
"empty-dashboard": "Koontinäyttösi on tyhjä. Napsauta Muokkaa lisätäksesi ensimmäisen komponentin.",
"event-log": "<b>{event}</b> sivulla <a>{url}</a>",
"forbidden": "Kielletty",
"go-to-settings": "Mene asetuksiin",
@@ -402,6 +412,7 @@
"reset-website": "Nollaa verkkosivusto kirjoittamalla {confirmation} alla olevaan kenttään vahvistaaksesi.",
"reset-website-warning": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana.",
"saved": "Tallennettu onnistuneesti.",
"select-board-entity-first": "Valitse ensin verkkosivusto, pikseli tai linkki.",
"select-component-preview": "Valitse komponentti esikatselua varten",
"select-website-first": "Valitse ensin verkkosivusto",
"sever-error": "Palvelinvirhe",
@@ -417,6 +428,7 @@
"unauthorized": "Ei oikeuksia",
"user-deleted": "Käyttäjä poistettu.",
"viewed-page": "Katsottu sivu",
"upgrade-required": "Tämä ominaisuus vaatii {plan}-tilauksen.",
"visitor-log": "Vierailija maasta <b>{country}</b> selaimella <b>{browser}</b> laitteella <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Allur tíðin",
"analysis": "Greining",
"analytics": "Greining",
"aov": "AOV",
"application": "Forrit",
"apply": "Nýt",
"arpu": "ARPU",
"attribution": "Áseting",
"attribution-description": "Síggj hvussu brúkarar samskifta við marknaðarføringina og hvat førir til umvendingar.",
"audience": "Áhoyrarar",
@@ -33,6 +31,7 @@
"behavior": "Atferð",
"block-selector": "Blokkveljari",
"boards": "Borð",
"board-type": "Slag av brætti",
"bounce-rate": "Bounce prosenttal",
"breakdown": "Sundurgreining",
"browser": "Kagi",
@@ -55,6 +54,8 @@
"confirm": "Staðfest",
"confirm-password": "Vátta loyniorð",
"contains": "Inniheldur",
"regex-match": "Samsvarar við regluligan úttrykk",
"regex-not-match": "Samsvarar ikki við regluligan úttrykk",
"content": "Innihald",
"continue": "Halt fram",
"conversion": "Umvending",
@@ -131,8 +132,8 @@
"funnels": "Traktarar",
"goal": "Mál",
"goals": "Mál",
"goals-description": "Fylg við málum fyri síðuvísingar og tiltøk.",
"good": "Gott",
"goals-description": "Fylg við málum fyri síðuvísingar og tiltøk.",
"greater-than": "Størri enn",
"greater-than-equals": "Størri ella javnt",
"grouped": "Bólkað",
@@ -140,10 +141,10 @@
"hostname": "Vertnavn",
"hour": "Tími",
"includes": "Inniheldur",
"inp": "INP",
"insight": "Innlit",
"insights": "Innlit",
"insights-description": "Fá meira innlit í tínar dátur við at brúka bólkar og síur.",
"inp": "INP",
"invalid-url": "Ógild URL",
"is": "Er",
"is-false": "Er falskt",
@@ -177,11 +178,11 @@
"manage": "Stýra",
"manager": "Stjóri",
"mask-level": "Maskustig",
"max": "Mest",
"max-duration": "Mesta tíðarlongd",
"match": "Samsvørun",
"match-all": "Allt",
"match-any": "Nakað",
"max": "Mest",
"max-duration": "Mesta tíðarlongd",
"maximize": "Víðka",
"medium": "Miðal",
"member": "Limur",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {skrá} other {skrár}}",
"ok": "OK",
"online": "Online",
"open": "Blandað",
"organic-search": "Organisk leiting",
"organic-shopping": "Organisk keyp",
"organic-social": "Organisk sosial miðla",
@@ -212,8 +214,8 @@
"page": "Síða",
"page-of": "Síða {current} av {total}",
"page-views": "Opnaðar síðir",
"pages": "Síðir",
"pageTitle": "Síðuheiti",
"pages": "Síðir",
"paid-ads": "Goldnar lýsingar",
"paid-search": "Goldin leiting",
"paid-shopping": "Goldið keyp",
@@ -225,7 +227,6 @@
"performance": "Effektivni",
"pixel": "Piksel",
"pixels": "Pikslur",
"play": "Spæla",
"poor": "Dårligt",
"powered-by": "Rikið av {name}",
"preferences": "Stillingar",
@@ -246,16 +247,16 @@
"referrers": "Framsendingar",
"refresh": "Dagfør",
"regenerate": "Endurskapa",
"regex-match": "Samsvarar við regluligan úttrykk",
"regex-not-match": "Samsvarar ikki við regluligan úttrykk",
"region": "Øki",
"regions": "Øki",
"remaining": "Eftir",
"remove": "Fjern",
"remove-member": "Fjern lim",
"play": "Spæla",
"replay": "Uppspæling",
"replay-enabled": "Uppspæling virkjað",
"replay-id": "Replay ID",
"replay-code": "Kodi fyri endurspæling av setuni",
"replay-enabled": "Uppspæling virkjað",
"replays": "Uppspælingar",
"reports": "Frágreiðingar",
"required": "Kravið",
@@ -268,21 +269,24 @@
"revenue-description": "Fá yvirlit yvir inntøku yvir tíð.",
"role": "Leiklutur",
"run-query": "Koyr fyrispurning",
"sample-rate": "Samplingartiðindi",
"sample-size": "Samplingarstødd",
"save": "Goym",
"save-cohort": "Goym kohortu",
"save-replay": "Goym endurspælingina",
"save-segment": "Goym segment",
"sample-rate": "Samplingartiðindi",
"sample-size": "Samplingarstødd",
"screen": "Skíggi",
"screens": "Skíggjar",
"search": "Leita",
"segment": "Segment",
"segments": "Segment",
"select": "Vel",
"select-component": "Vel eina íhlut",
"select-link": "Vel leinkju",
"select-pixel": "Vel pixil",
"select-date": "Vel dato",
"select-filter": "Vel síu",
"select-role": "Vel leiklut",
"select-component": "Vel eina íhlut",
"select-website": "Vel heimasíðu",
"session": "Seta",
"session-data": "Setudáta",
@@ -337,9 +341,15 @@
"unique": "Einstaklingar",
"unique-events": "Einstakar hendingar",
"unique-visitors": "Einsýna vitjanir",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Einstakar kundar",
"customers": "Kundar",
"orders": "Bílegging",
"saved": "Goymt",
"unknown": "Ókent",
"untitled": "Einki heiti",
"upgrade": "Dagfør",
"update": "Dagfør",
"url": "URL",
"user": "Brúkari",
@@ -379,8 +389,8 @@
"confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"delete-team-warning": "At strika eitt lið strikar eisini allar heimasíður hjá liðnum.",
"delete-website-warning": "Øll data ið er knýtt at verður eisini strika.",
"empty-dashboard": "Stjórnarborðið títt er tómt. Trýst á Rætta fyri at leggja afturat fyrstu íhlut.",
"error": "Okkurt bleiv gali.",
"empty-dashboard": "Stjórnarborðið títt er tómt. Trýst á Rætta fyri at leggja afturat fyrstu íhlut.",
"event-log": "<b>{event}</b> á <a>{url}</a>",
"forbidden": "Forboðið",
"go-to-settings": "Far til stillingar",
@@ -402,6 +412,7 @@
"reset-website": "Fyri at nullstilla hesa heimasíðu, skriva {confirmation} í teigin niðanfyri at vátta.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Goymt.",
"select-board-entity-first": "Vel fyrst heimasíðu, pixil ella leinkju.",
"select-component-preview": "Vel eina íhlut at forskoða",
"select-website-first": "Vel fyrst eina heimasíðu",
"sever-error": "Ambætaravilla",
@@ -417,6 +428,7 @@
"unauthorized": "Ikki góðkent",
"user-deleted": "Brúkari strikaður.",
"viewed-page": "Síð vís",
"upgrade-required": "Hesin virknisháttur krevur eitt {plan}-lyftirtak.",
"visitor-log": "Vitjandi frá <b>{country}</b> brúkar <b>{browser}</b> á <b>{os}</b> <b>{device}</b>"
}
}
+12
View File
@@ -33,6 +33,7 @@
"behavior": "Comportement",
"block-selector": "Sélecteur de bloc",
"boards": "Tableaux",
"board-type": "Type de tableau",
"bounce-rate": "Taux de rebond",
"breakdown": "Répartition",
"browser": "Navigateur",
@@ -74,6 +75,7 @@
"current": "Actuel",
"current-password": "Mot de passe actuel",
"custom-range": "Période personnalisée",
"customers": "Clients",
"dashboard": "Tableau de bord",
"data": "Données",
"date": "Date",
@@ -201,6 +203,8 @@
"number-of-records": "{x} {x, plural, one {enregistrement} other {enregistrements}}",
"ok": "OK",
"online": "En ligne",
"open": "Mixte",
"orders": "Commandes",
"organic-search": "Recherche organique",
"organic-shopping": "Achat organique",
"organic-social": "Réseau social organique",
@@ -254,6 +258,7 @@
"remove": "Retirer",
"remove-member": "Retirer le membre",
"replay": "Relecture",
"replay-code": "Code de relecture de session",
"replay-enabled": "Relecture activée",
"replay-id": "Replay ID",
"replays": "Relectures",
@@ -272,7 +277,9 @@
"sample-size": "Taille de l'échantillon",
"save": "Enregistrer",
"save-cohort": "Enregistrer la cohorte",
"save-replay": "Enregistrer la relecture",
"save-segment": "Enregistrer le segment",
"saved": "Enregistré",
"screen": "Écran",
"screens": "Écrans",
"search": "Rechercher",
@@ -282,6 +289,8 @@
"select-component": "Sélectionner un composant",
"select-date": "Choisir une période",
"select-filter": "Sélectionner un filtre",
"select-link": "Sélectionner un lien",
"select-pixel": "Sélectionner un pixel",
"select-role": "Choisir un rôle",
"select-website": "Choisir un site",
"session": "Session",
@@ -341,6 +350,7 @@
"unknown": "Inconnu",
"untitled": "Sans titre",
"update": "Modifier",
"upgrade": "Mettre à niveau",
"url": "URL",
"user": "Utilisateur",
"username": "Nom d'utilisateur",
@@ -402,6 +412,7 @@
"reset-website": "Pour réinitialiser ce site, taper {confirmation} ci-dessous pour confirmer.",
"reset-website-warning": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact.",
"saved": "Enregistré.",
"select-board-entity-first": "Sélectionnez d'abord un site, un pixel ou un lien.",
"select-component-preview": "Sélectionnez un composant pour le prévisualiser",
"select-website-first": "Sélectionnez d'abord un site web",
"sever-error": "Erreur serveur",
@@ -415,6 +426,7 @@
"transfer-website": "Transférer la propriété du site sur votre compte ou à une autre équipe.",
"triggered-event": "Évènement déclenché",
"unauthorized": "Non authorisé!",
"upgrade-required": "Cette fonctionnalité nécessite un abonnement {plan}.",
"user-deleted": "Utilisateur supprimé.",
"viewed-page": "Page vue",
"visitor-log": "Visiteur de <b>{country}</b> utilisant <b>{browser}</b> sur <b>{os}</b> <b>{device}</b>"
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Sempre",
"analysis": "Análise",
"analytics": "Analíticas",
"aov": "AOV",
"application": "Aplicación",
"apply": "Aplicar",
"arpu": "ARPU",
"attribution": "Atribución",
"attribution-description": "Vexa como os usuarios interactúan co seu márketing e que impulsa as conversións.",
"audience": "Audiencia",
@@ -33,6 +31,7 @@
"behavior": "Comportamento",
"block-selector": "Selector de bloque",
"boards": "Taboleiros",
"board-type": "Tipo de taboleiro",
"bounce-rate": "Proporción de rebote",
"breakdown": "Desglose",
"browser": "Navegador",
@@ -55,6 +54,8 @@
"confirm": "Confirmar",
"confirm-password": "Confirmar contrasinal",
"contains": "Contén",
"regex-match": "Meaitseálann sé le slonn rialta",
"regex-not-match": "Ní mheaitseálann sé le slonn rialta",
"content": "Contido",
"continue": "Continuar",
"conversion": "Conversión",
@@ -131,8 +132,8 @@
"funnels": "Funís",
"goal": "Obxectivo",
"goals": "Obxectivos",
"goals-description": "Segue os teus obxectivos de visualizacións de páxinas e eventos.",
"good": "Bo",
"goals-description": "Segue os teus obxectivos de visualizacións de páxinas e eventos.",
"greater-than": "Maior que",
"greater-than-equals": "Maior ou igual que",
"grouped": "Agrupado",
@@ -140,10 +141,10 @@
"hostname": "Nome do host",
"hour": "Hora",
"includes": "Inclúe",
"inp": "INP",
"insight": "Información",
"insights": "Informacións",
"insights-description": "Afonda nos teus datos usando segmentos e filtros.",
"inp": "INP",
"invalid-url": "URL non válida",
"is": "É",
"is-false": "É falso",
@@ -177,11 +178,11 @@
"manage": "Xestionar",
"manager": "Xestor",
"mask-level": "Nivel de máscara",
"max": "Máx",
"max-duration": "Duración máxima",
"match": "Coincidencia",
"match-all": "Todo",
"match-any": "Calquera",
"max": "Máx",
"max-duration": "Duración máxima",
"maximize": "Expandir",
"medium": "Medio",
"member": "Membro",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {rexistro} other {rexistros}}",
"ok": "Aceptar",
"online": "En liña",
"open": "Mixto",
"organic-search": "Busca orgánica",
"organic-shopping": "Compra orgánica",
"organic-social": "Social orgánico",
@@ -212,8 +214,8 @@
"page": "Páxina",
"page-of": "Páxina {current} de {total}",
"page-views": "Vistas de páxinas",
"pages": "Páxinas",
"pageTitle": "Título da páxina",
"pages": "Páxinas",
"paid-ads": "Anuncios de pago",
"paid-search": "Busca de pago",
"paid-shopping": "Compra de pago",
@@ -225,7 +227,6 @@
"performance": "Rendemento",
"pixel": "Píxel",
"pixels": "Píxeles",
"play": "Reproducir",
"poor": "Deficiente",
"powered-by": "Funciona grazas a {name}",
"preferences": "Preferencias",
@@ -246,16 +247,16 @@
"referrers": "Orixes",
"refresh": "Actualizar",
"regenerate": "Rexenerar",
"regex-match": "Meaitseálann sé le slonn rialta",
"regex-not-match": "Ní mheaitseálann sé le slonn rialta",
"region": "Rexión",
"regions": "Rexións",
"remaining": "Restante",
"remove": "Eliminar",
"remove-member": "Eliminar membro",
"play": "Reproducir",
"replay": "Reprodución",
"replay-enabled": "Reprodución activada",
"replay-id": "Replay ID",
"replay-code": "Código de repetición da sesión",
"replay-enabled": "Reprodución activada",
"replays": "Reproducións",
"reports": "Reportes",
"required": "Requerido",
@@ -268,21 +269,24 @@
"revenue-description": "Consulta os teus ingresos ao longo do tempo.",
"role": "Rol",
"run-query": "Executar petición",
"sample-rate": "Taxa de mostraxe",
"sample-size": "Tamaño da mostra",
"save": "Gardar",
"save-cohort": "Gardar cohorte",
"save-replay": "Gardar repetición",
"save-segment": "Gardar segmento",
"sample-rate": "Taxa de mostraxe",
"sample-size": "Tamaño da mostra",
"screen": "Pantalla",
"screens": "Pantallas",
"search": "Buscar",
"segment": "Segmento",
"segments": "Segmentos",
"select": "Seleccionar",
"select-component": "Seleccionar compoñente",
"select-link": "Seleccionar ligazón",
"select-pixel": "Seleccionar píxel",
"select-date": "Seleccionar data",
"select-filter": "Seleccionar filtro",
"select-role": "Seleccionar rol",
"select-component": "Seleccionar compoñente",
"select-website": "Seleccionar sitio web",
"session": "Sesión",
"session-data": "Datos da sesión",
@@ -337,9 +341,15 @@
"unique": "Único",
"unique-events": "Eventos únicos",
"unique-visitors": "Visitas únicas",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clientes únicos",
"customers": "Clientes",
"orders": "Pedidos",
"saved": "Gardado",
"unknown": "Descoñecido",
"untitled": "Sen título",
"upgrade": "Actualizar",
"update": "Actualizar",
"url": "URL",
"user": "Usuario",
@@ -379,8 +389,8 @@
"confirm-reset": "Estás seguro/a de querer restablecer as estatísticas de {target}?",
"delete-team-warning": "Eliminar un equipo tamén eliminará tódolos sitios web do equipo.",
"delete-website-warning": "Tamén serán borrados tódolos datos asociados.",
"empty-dashboard": "O teu panel está baleiro. Fai clic en Editar para engadir o teu primeiro compoñente.",
"error": "Houbo un fallo.",
"empty-dashboard": "O teu panel está baleiro. Fai clic en Editar para engadir o teu primeiro compoñente.",
"event-log": "<b>{event}</b> en <a>{url}</a>",
"forbidden": "Prohibido",
"go-to-settings": "Ir aos axustes",
@@ -402,6 +412,7 @@
"reset-website": "Para restablecer este sitio web, escriba {confirmation} na caixa de embaixo para confirmar.",
"reset-website-warning": "Vanse eliminar tódalas estatísticas deste sitio web, pero o código de seguimento permanecerá sen cambios.",
"saved": "Gardouse correctamente.",
"select-board-entity-first": "Seleccione primeiro un sitio web, píxel ou ligazón.",
"select-component-preview": "Selecciona un compoñente para previsualizar",
"select-website-first": "Selecciona primeiro un sitio web",
"sever-error": "Erro do servidor",
@@ -417,6 +428,7 @@
"unauthorized": "Non autorizado",
"user-deleted": "Usuario eliminado.",
"viewed-page": "Páxina vista",
"upgrade-required": "Esta función require unha subscrición ao plan {plan}.",
"visitor-log": "Visitante desde <b>{country}</b> usando <b>{browser}</b> en <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Svo vrijeme",
"analysis": "Analiza",
"analytics": "Analitika",
"aov": "AOV",
"application": "Aplikacija",
"apply": "Primijeni",
"arpu": "ARPU",
"attribution": "Atribucija",
"attribution-description": "Pogledajte kako korisnici komuniciraju s vašim marketingom i što dovodi do konverzija.",
"audience": "Publika",
@@ -33,6 +31,7 @@
"behavior": "Ponašanje",
"block-selector": "Odabir bloka",
"boards": "Ploče",
"board-type": "Vrsta ploče",
"bounce-rate": "Stopa napuštanja",
"breakdown": "Raspad",
"browser": "Preglednik",
@@ -55,6 +54,8 @@
"confirm": "Potvrdi",
"confirm-password": "Potvrdi lozinku",
"contains": "Sadrži",
"regex-match": "Odgovara regularnom izrazu",
"regex-not-match": "Ne odgovara regularnom izrazu",
"content": "Sadržaj",
"continue": "Nastavi",
"conversion": "Konverzija",
@@ -131,8 +132,8 @@
"funnels": "Ljevci",
"goal": "Cilj",
"goals": "Ciljevi",
"goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
"good": "Dobro",
"goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
"greater-than": "Veće od",
"greater-than-equals": "Veće ili jednako",
"grouped": "Grupirano",
@@ -140,10 +141,10 @@
"hostname": "Naziv hosta",
"hour": "Sat",
"includes": "Uključuje",
"inp": "INP",
"insight": "Uvid",
"insights": "Uvidi",
"insights-description": "Dublje analizirajte svoje podatke pomoću segmenata i filtera.",
"inp": "INP",
"invalid-url": "Nevaljani URL",
"is": "Je",
"is-false": "Je netočno",
@@ -177,11 +178,11 @@
"manage": "Upravljaj",
"manager": "Upravitelj",
"mask-level": "Razina maske",
"max": "Maksimum",
"max-duration": "Maksimalno trajanje",
"match": "Podudaranje",
"match-all": "Sve",
"match-any": "Bilo koje",
"max": "Maksimum",
"max-duration": "Maksimalno trajanje",
"maximize": "Proširi",
"medium": "Srednje",
"member": "Član",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {zapis} other {zapisa}}",
"ok": "U redu",
"online": "Na mreži",
"open": "Miješano",
"organic-search": "Organsko pretraživanje",
"organic-shopping": "Organska kupovina",
"organic-social": "Organska društvena mreža",
@@ -212,8 +214,8 @@
"page": "Stranica",
"page-of": "Stranica {current} od {total}",
"page-views": "Pregledi stranica",
"pages": "Stranice",
"pageTitle": "Naslov stranice",
"pages": "Stranice",
"paid-ads": "Plaćeni oglasi",
"paid-search": "Plaćeno pretraživanje",
"paid-shopping": "Plaćena kupovina",
@@ -225,7 +227,6 @@
"performance": "Performanse",
"pixel": "Piksel",
"pixels": "Pikseli",
"play": "Reproduciraj",
"poor": "Loše",
"powered-by": "Pokreće {name}",
"preferences": "Postavke",
@@ -246,16 +247,16 @@
"referrers": "Izvori preporuke",
"refresh": "Osvježi",
"regenerate": "Regeneriraj",
"regex-match": "Odgovara regularnom izrazu",
"regex-not-match": "Ne odgovara regularnom izrazu",
"region": "Regija",
"regions": "Regije",
"remaining": "Preostalo",
"remove": "Ukloni",
"remove-member": "Ukloni člana",
"play": "Reproduciraj",
"replay": "Ponovna reprodukcija",
"replay-enabled": "Ponovna reprodukcija omogućena",
"replay-id": "Replay ID",
"replay-code": "Kôd ponavljanja sesije",
"replay-enabled": "Ponovna reprodukcija omogućena",
"replays": "Ponovne reprodukcije",
"reports": "Izvješća",
"required": "Potrebna",
@@ -268,21 +269,24 @@
"revenue-description": "Pogledajte svoj prihod tijekom vremena.",
"role": "Uloga",
"run-query": "Pokreni upit",
"sample-rate": "Stopa uzorkovanja",
"sample-size": "Veličina uzorka",
"save": "Spremi",
"save-cohort": "Spremi kohortu",
"save-replay": "Spremi ponavljanje",
"save-segment": "Spremi segment",
"sample-rate": "Stopa uzorkovanja",
"sample-size": "Veličina uzorka",
"screen": "Zaslon",
"screens": "Ekrani",
"search": "Pretraži",
"segment": "Segment",
"segments": "Segmenti",
"select": "Odaberi",
"select-component": "Odaberite komponentu",
"select-link": "Odaberi poveznicu",
"select-pixel": "Odaberi piksel",
"select-date": "Odaberi datum",
"select-filter": "Odaberi filter",
"select-role": "Odaberi ulogu",
"select-component": "Odaberite komponentu",
"select-website": "Odaberi web stranicu",
"session": "Sesija",
"session-data": "Podaci sesije",
@@ -337,9 +341,15 @@
"unique": "Jedinstveni",
"unique-events": "Jedinstveni događaji",
"unique-visitors": "Jedinstveni posjetitelji",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Jedinstveni kupci",
"customers": "Kupci",
"orders": "Narudžbe",
"saved": "Spremljeno",
"unknown": "Nepoznato",
"untitled": "Bez naslova",
"upgrade": "Nadogradi",
"update": "Ažuriraj",
"url": "URL",
"user": "Korisnik",
@@ -379,8 +389,8 @@
"confirm-reset": "Jeste li sigurni da želite resetirati {target}'s statistiku?",
"delete-team-warning": "Brisanje tima će izbrisati i sve web stranice tima.",
"delete-website-warning": "Svi podaci web stranice bit će izbrisani.",
"empty-dashboard": "Vaša nadzorna ploča je prazna. Kliknite Uredi da dodate prvu komponentu.",
"error": "Nešto je pošlo po krivu.",
"empty-dashboard": "Vaša nadzorna ploča je prazna. Kliknite Uredi da dodate prvu komponentu.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Zabranjeno",
"go-to-settings": "Idi u postavke",
@@ -402,6 +412,7 @@
"reset-website": "Za resetiranje ove web stranice upišite {confirmation} u polje ispod.",
"reset-website-warning": "Svi statistički podaci za ovu web stranicu bit će izbrisani, ali vaše postavke ostaju netaknute.",
"saved": "Spremljeno.",
"select-board-entity-first": "Prvo odaberite web-mjesto, piksel ili poveznicu.",
"select-component-preview": "Odaberite komponentu za pregled",
"select-website-first": "Prvo odaberite web stranicu",
"sever-error": "Greška poslužitelja",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizirano",
"user-deleted": "Korisnik izbrisan.",
"viewed-page": "Pregledana stranica",
"upgrade-required": "Ova značajka zahtijeva pretplatu na plan {plan}.",
"visitor-log": "Posjetitelj iz <b>{country}</b> koristi <b>{browser}</b> na <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Minden időszak",
"analysis": "Elemzés",
"analytics": "Analitika",
"aov": "AOV",
"application": "Alkalmazás",
"apply": "Alkalmaz",
"arpu": "ARPU",
"attribution": "Attribúció",
"attribution-description": "Nézze meg, hogyan lépnek kapcsolatba a felhasználók a marketingjével, és mi vezet konverzióhoz.",
"audience": "Közönség",
@@ -33,6 +31,7 @@
"behavior": "Viselkedés",
"block-selector": "Blokk kiválasztó",
"boards": "Táblák",
"board-type": "Tábla típusa",
"bounce-rate": "Visszafordulási arány",
"breakdown": "Bontás",
"browser": "Böngésző",
@@ -55,6 +54,8 @@
"confirm": "Megerősít",
"confirm-password": "Jelszó megerősítése",
"contains": "Tartalmazza",
"regex-match": "Illeszkedik a reguláris kifejezésre",
"regex-not-match": "Nem illeszkedik a reguláris kifejezésre",
"content": "Tartalom",
"continue": "Folytatás",
"conversion": "Konverzió",
@@ -131,8 +132,8 @@
"funnels": "Tölcsérek",
"goal": "Cél",
"goals": "Célok",
"goals-description": "Kövesse nyomon a céljait oldalmegtekintések és események alapján.",
"good": "Jó",
"goals-description": "Kövesse nyomon a céljait oldalmegtekintések és események alapján.",
"greater-than": "Nagyobb mint",
"greater-than-equals": "Nagyobb vagy egyenlő",
"grouped": "Csoportosítva",
@@ -140,10 +141,10 @@
"hostname": "Hosztnév",
"hour": "Óra",
"includes": "Tartalmazza",
"inp": "INP",
"insight": "Betekintés",
"insights": "Betekintések",
"insights-description": "Merüljön el mélyebben az adataiban szegmensek és szűrők használatával.",
"inp": "INP",
"invalid-url": "Érvénytelen URL",
"is": "Az",
"is-false": "Hamis",
@@ -177,11 +178,11 @@
"manage": "Kezelés",
"manager": "Menedzser",
"mask-level": "Maszkolási szint",
"max": "Maximum",
"max-duration": "Maximális időtartam",
"match": "Egyezés",
"match-all": "Összes",
"match-any": "Bármelyik",
"max": "Maximum",
"max-duration": "Maximális időtartam",
"maximize": "Kibontás",
"medium": "Közepes",
"member": "Tag",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {rekord} other {rekord}}",
"ok": "OK",
"online": "Online",
"open": "Vegyes",
"organic-search": "Organikus keresés",
"organic-shopping": "Organikus vásárlás",
"organic-social": "Organikus közösségi",
@@ -212,8 +214,8 @@
"page": "Oldal",
"page-of": "Oldal {current} / {total}",
"page-views": "Oldalmegtekintések",
"pages": "Oldalak",
"pageTitle": "Oldal címe",
"pages": "Oldalak",
"paid-ads": "Fizetett hirdetések",
"paid-search": "Fizetett keresés",
"paid-shopping": "Fizetett vásárlás",
@@ -225,7 +227,6 @@
"performance": "Teljesítmény",
"pixel": "Pixel",
"pixels": "Pixelek",
"play": "Lejátszás",
"poor": "Gyenge",
"powered-by": "Működteti az {name}",
"preferences": "Beállítások",
@@ -246,16 +247,16 @@
"referrers": "Hivatkozók",
"refresh": "Frissítés",
"regenerate": "Újragenerálás",
"regex-match": "Illeszkedik a reguláris kifejezésre",
"regex-not-match": "Nem illeszkedik a reguláris kifejezésre",
"region": "Régió",
"regions": "Régiók",
"remaining": "Hátralévő",
"remove": "Eltávolítás",
"remove-member": "Tag eltávolítása",
"play": "Lejátszás",
"replay": "Visszajátszás",
"replay-enabled": "Visszajátszás engedélyezve",
"replay-id": "Replay ID",
"replay-code": "Munkamenet-újrajátszási kód",
"replay-enabled": "Visszajátszás engedélyezve",
"replays": "Visszajátszások",
"reports": "Jelentések",
"required": "Kötelező",
@@ -268,21 +269,24 @@
"revenue-description": "Tekintse meg bevételeit az idő múlásával.",
"role": "Szerep",
"run-query": "Lekérdezés futtatása",
"sample-rate": "Mintavételi arány",
"sample-size": "Mintaméret",
"save": "Mentés",
"save-cohort": "Kohorsz mentése",
"save-replay": "Újrajátszás mentése",
"save-segment": "Szegmens mentése",
"sample-rate": "Mintavételi arány",
"sample-size": "Mintaméret",
"screen": "Képernyő",
"screens": "Képernyők",
"search": "Keresés",
"segment": "Szegmens",
"segments": "Szegmensek",
"select": "Kiválasztás",
"select-component": "Válasszon komponenst",
"select-link": "Hivatkozás kiválasztása",
"select-pixel": "Pixel kiválasztása",
"select-date": "Dátum kiválasztása",
"select-filter": "Szűrő kiválasztása",
"select-role": "Szerep kiválasztása",
"select-component": "Válasszon komponenst",
"select-website": "Weboldal kiválasztása",
"session": "Munkamenet",
"session-data": "Munkamenet adatai",
@@ -337,9 +341,15 @@
"unique": "Egyedi",
"unique-events": "Egyedi események",
"unique-visitors": "Egyedi látogatók",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Egyedi ügyfelek",
"customers": "Ügyfelek",
"orders": "Rendelések",
"saved": "Mentve",
"unknown": "Ismeretlen",
"untitled": "Névtelen",
"upgrade": "Frissítés",
"update": "Frissítés",
"url": "URL",
"user": "Felhasználó",
@@ -379,8 +389,8 @@
"confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"delete-team-warning": "A csapat törlése az összes csapat weboldalt is törli.",
"delete-website-warning": "Minden társított adat törlésre kerül.",
"empty-dashboard": "Az irányítópult üres. Kattintson a Szerkesztés gombra az első komponens hozzáadásához.",
"error": "Valami baj történt.",
"empty-dashboard": "Az irányítópult üres. Kattintson a Szerkesztés gombra az első komponens hozzáadásához.",
"event-log": "<b>{event}</b> itt: <a>{url}</a>",
"forbidden": "Tiltott",
"go-to-settings": "Tovább a beállításokhoz",
@@ -402,6 +412,7 @@
"reset-website": "A weboldal visszaállításához írja be a(z) {confirmation} szót az alábbi mezőbe.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Sikeres mentés.",
"select-board-entity-first": "Először válasszon webhelyet, pixelt vagy hivatkozást.",
"select-component-preview": "Válasszon egy komponenst az előnézethez",
"select-website-first": "Először válasszon egy webhelyet",
"sever-error": "Szerverhiba",
@@ -417,6 +428,7 @@
"unauthorized": "Nincs jogosultság",
"user-deleted": "Felhasználó törölve.",
"viewed-page": "Megtekintett oldal",
"upgrade-required": "Ez a funkció {plan} előfizetést igényel.",
"visitor-log": "Látógató <b>{country}</b> területéről, <b>{os}</b> <b>{device}</b> eszközön, <b>{browser}</b> böngészőből."
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Semua waktu",
"analysis": "Analisis",
"analytics": "Analitik",
"aov": "AOV",
"application": "Aplikasi",
"apply": "Terapkan",
"arpu": "ARPU",
"attribution": "Atribusi",
"attribution-description": "Lihat bagaimana pengguna berinteraksi dengan pemasaran Anda dan apa yang mendorong konversi.",
"audience": "Audiens",
@@ -33,6 +31,7 @@
"behavior": "Perilaku",
"block-selector": "Pemilih blok",
"boards": "Papan",
"board-type": "Jenis papan",
"bounce-rate": "Rasio pentalan",
"breakdown": "Rincian",
"browser": "Peramban",
@@ -55,6 +54,8 @@
"confirm": "Konfirmasi",
"confirm-password": "Konfirmasi kata sandi",
"contains": "Mengandung",
"regex-match": "Cocok dengan ekspresi reguler",
"regex-not-match": "Tidak cocok dengan ekspresi reguler",
"content": "Konten",
"continue": "Lanjutkan",
"conversion": "Konversi",
@@ -131,8 +132,8 @@
"funnels": "Corong",
"goal": "Tujuan",
"goals": "Tujuan",
"goals-description": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa.",
"good": "Baik",
"goals-description": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa.",
"greater-than": "Lebih dari",
"greater-than-equals": "Lebih dari atau sama dengan",
"grouped": "Dikelompokkan",
@@ -140,10 +141,10 @@
"hostname": "Nama host",
"hour": "Jam",
"includes": "Termasuk",
"inp": "INP",
"insight": "Wawasan",
"insights": "Wawasan",
"insights-description": "Jelajahi data Anda lebih dalam dengan menggunakan segmen dan filter.",
"inp": "INP",
"invalid-url": "URL tidak valid",
"is": "Adalah",
"is-false": "Salah",
@@ -177,11 +178,11 @@
"manage": "Kelola",
"manager": "Manajer",
"mask-level": "Tingkat masker",
"max": "Maksimum",
"max-duration": "Durasi maksimal",
"match": "Cocok",
"match-all": "Semua",
"match-any": "Salah satu",
"max": "Maksimum",
"max-duration": "Durasi maksimal",
"maximize": "Perluas",
"medium": "Sedang",
"member": "Anggota",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {catatan} other {catatan}}",
"ok": "OK",
"online": "Daring",
"open": "Campuran",
"organic-search": "Pencarian organik",
"organic-shopping": "Belanja organik",
"organic-social": "Sosial organik",
@@ -212,8 +214,8 @@
"page": "Halaman",
"page-of": "Halaman {current} dari {total}",
"page-views": "Tampilan halaman",
"pages": "Halaman",
"pageTitle": "Judul halaman",
"pages": "Halaman",
"paid-ads": "Iklan berbayar",
"paid-search": "Pencarian berbayar",
"paid-shopping": "Belanja berbayar",
@@ -225,7 +227,6 @@
"performance": "Kinerja",
"pixel": "Piksel",
"pixels": "Piksel",
"play": "Putar",
"poor": "Buruk",
"powered-by": "Didukung oleh {name}",
"preferences": "Preferensi",
@@ -246,16 +247,16 @@
"referrers": "Perujuk",
"refresh": "Segarkan",
"regenerate": "Buat ulang",
"regex-match": "Cocok dengan ekspresi reguler",
"regex-not-match": "Tidak cocok dengan ekspresi reguler",
"region": "Wilayah",
"regions": "Wilayah",
"remaining": "Tersisa",
"remove": "Hapus",
"remove-member": "Hapus anggota",
"play": "Putar",
"replay": "Pemutaran ulang",
"replay-enabled": "Pemutaran ulang diaktifkan",
"replay-id": "Replay ID",
"replay-code": "Kode putar ulang sesi",
"replay-enabled": "Pemutaran ulang diaktifkan",
"replays": "Pemutaran ulang",
"reports": "Laporan",
"required": "Wajib",
@@ -268,21 +269,24 @@
"revenue-description": "Lihat pendapatan Anda seiring waktu.",
"role": "Peran",
"run-query": "Jalankan kueri",
"sample-rate": "Laju sampel",
"sample-size": "Ukuran sampel",
"save": "Simpan",
"save-cohort": "Simpan kohort",
"save-replay": "Simpan putar ulang",
"save-segment": "Simpan segmen",
"sample-rate": "Laju sampel",
"sample-size": "Ukuran sampel",
"screen": "Layar",
"screens": "Layar",
"search": "Cari",
"segment": "Segmen",
"segments": "Segmen",
"select": "Pilih",
"select-component": "Pilih komponen",
"select-link": "Pilih tautan",
"select-pixel": "Pilih piksel",
"select-date": "Pilih tanggal",
"select-filter": "Pilih filter",
"select-role": "Pilih role",
"select-component": "Pilih komponen",
"select-website": "Pilih situs web",
"session": "Sesi",
"session-data": "Data sesi",
@@ -337,9 +341,15 @@
"unique": "Unik",
"unique-events": "Event unik",
"unique-visitors": "Pengunjung unik",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Kustomer unik",
"customers": "Pelanggan",
"orders": "Pesanan",
"saved": "Tersimpan",
"unknown": "Tidak diketahui",
"untitled": "Tanpa judul",
"upgrade": "Tingkatkan",
"update": "Perbarui",
"url": "URL",
"user": "Pengguna",
@@ -379,8 +389,8 @@
"confirm-reset": "Anda yakin ingin mengatur ulang statistik {target}?",
"delete-team-warning": "Menghapus tim juga akan menghapus semua situs web yang terkait.",
"delete-website-warning": "Semua data terkait juga akan dihapus.",
"empty-dashboard": "Dasbor Anda kosong. Klik Edit untuk menambahkan komponen pertama Anda.",
"error": "Ada yang salah.",
"empty-dashboard": "Dasbor Anda kosong. Klik Edit untuk menambahkan komponen pertama Anda.",
"event-log": "<b>{event}</b> di <a>{url}</a>",
"forbidden": "Dilarang",
"go-to-settings": "Pergi ke pengaturan",
@@ -402,6 +412,7 @@
"reset-website": "Untuk mengatur ulang situs web ini, ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
"reset-website-warning": "Semua statistik pada situs web ini akan dihapus, tetapi kode lacak akan tetap terpasang",
"saved": "Berhasil disimpan.",
"select-board-entity-first": "Pilih situs web, piksel, atau tautan terlebih dahulu.",
"select-component-preview": "Pilih komponen untuk pratinjau",
"select-website-first": "Pilih situs web terlebih dahulu",
"sever-error": "Kesalahan server",
@@ -417,6 +428,7 @@
"unauthorized": "Tidak diotorisasi",
"user-deleted": "Pengguna telah dihapus.",
"viewed-page": "Halaman dilihat",
"upgrade-required": "Fitur ini memerlukan langganan paket {plan}.",
"visitor-log": "Pengunjung dari <b>{country}</b> dengan <b>{browser}</b> di <b>{device}</b> <b>{os}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Sempre",
"analysis": "Analisi",
"analytics": "Analitica",
"aov": "AOV",
"application": "Applicazione",
"apply": "Applica",
"arpu": "ARPU",
"attribution": "Attribuzione",
"attribution-description": "Scopri come gli utenti interagiscono con il tuo marketing e cosa genera conversioni.",
"audience": "Pubblico",
@@ -33,6 +31,7 @@
"behavior": "Comportamento",
"block-selector": "Selettore di blocco",
"boards": "Bacheche",
"board-type": "Tipo di bacheca",
"bounce-rate": "Frequenza di rimbalzo",
"breakdown": "Dettaglio",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Conferma",
"confirm-password": "Conferma password",
"contains": "Contiene",
"regex-match": "Corrisponde all'espressione regolare",
"regex-not-match": "Non corrisponde all'espressione regolare",
"content": "Contenuto",
"continue": "Continua",
"conversion": "Conversione",
@@ -131,8 +132,8 @@
"funnels": "Funnel",
"goal": "Obiettivo",
"goals": "Obiettivi",
"goals-description": "Tieni traccia dei tuoi obiettivi per visualizzazioni di pagina ed eventi.",
"good": "Buono",
"goals-description": "Tieni traccia dei tuoi obiettivi per visualizzazioni di pagina ed eventi.",
"greater-than": "Maggiore di",
"greater-than-equals": "Maggiore o uguale a",
"grouped": "Raggruppato",
@@ -140,10 +141,10 @@
"hostname": "Nome host",
"hour": "Ora",
"includes": "Include",
"inp": "INP",
"insight": "Approfondimento",
"insights": "Approfondimenti",
"insights-description": "Analizza più a fondo i tuoi dati utilizzando segmenti e filtri.",
"inp": "INP",
"invalid-url": "URL non valido",
"is": "È",
"is-false": "È falso",
@@ -177,11 +178,11 @@
"manage": "Gestisci",
"manager": "Gestore",
"mask-level": "Livello di maschera",
"max": "Massimo",
"max-duration": "Durata massima",
"match": "Corrispondenza",
"match-all": "Tutti",
"match-any": "Qualsiasi",
"max": "Massimo",
"max-duration": "Durata massima",
"maximize": "Espandi",
"medium": "Medio",
"member": "Membro",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {record} other {record}}",
"ok": "OK",
"online": "Online",
"open": "Misto",
"organic-search": "Ricerca organica",
"organic-shopping": "Acquisto organico",
"organic-social": "Social organico",
@@ -212,8 +214,8 @@
"page": "Pagina",
"page-of": "Pagina {current} di {total}",
"page-views": "Visualizzazioni di pagina",
"pages": "Pagine",
"pageTitle": "Titolo pagina",
"pages": "Pagine",
"paid-ads": "Annunci a pagamento",
"paid-search": "Ricerca a pagamento",
"paid-shopping": "Acquisto a pagamento",
@@ -225,7 +227,6 @@
"performance": "Prestazioni",
"pixel": "Pixel",
"pixels": "Pixel",
"play": "Riproduci",
"poor": "Scarso",
"powered-by": "Fornito da {name}",
"preferences": "Preferenze",
@@ -246,16 +247,16 @@
"referrers": "Referenti",
"refresh": "Ricarica",
"regenerate": "Rigenera",
"regex-match": "Corrisponde all'espressione regolare",
"regex-not-match": "Non corrisponde all'espressione regolare",
"region": "Regione",
"regions": "Regioni",
"remaining": "Rimanente",
"remove": "Rimuovi",
"remove-member": "Rimuovi membro",
"play": "Riproduci",
"replay": "Replay",
"replay-enabled": "Replay abilitato",
"replay-id": "Replay ID",
"replay-code": "Codice replay sessione",
"replay-enabled": "Replay abilitato",
"replays": "Replay",
"reports": "Report",
"required": "Obbligatorio",
@@ -268,21 +269,24 @@
"revenue-description": "Consulta i tuoi ricavi nel tempo.",
"role": "Ruolo",
"run-query": "Esegui query",
"sample-rate": "Frequenza di campionamento",
"sample-size": "Dimensione del campione",
"save": "Salva",
"save-cohort": "Salva coorte",
"save-replay": "Salva replay",
"save-segment": "Salva segmento",
"sample-rate": "Frequenza di campionamento",
"sample-size": "Dimensione del campione",
"screen": "Schermo",
"screens": "Schermi",
"search": "Cerca",
"segment": "Segmento",
"segments": "Segmenti",
"select": "Seleziona",
"select-component": "Seleziona componente",
"select-link": "Seleziona link",
"select-pixel": "Seleziona pixel",
"select-date": "Seleziona data",
"select-filter": "Seleziona filtro",
"select-role": "Seleziona ruolo",
"select-component": "Seleziona componente",
"select-website": "Seleziona sito web",
"session": "Sessione",
"session-data": "Dati sessione",
@@ -337,9 +341,15 @@
"unique": "Unico",
"unique-events": "Eventi unici",
"unique-visitors": "Visitatori unici",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clienti unici",
"customers": "Clienti",
"orders": "Ordini",
"saved": "Salvato",
"unknown": "Sconosciuto",
"untitled": "Senza titolo",
"upgrade": "Aggiorna",
"update": "Aggiorna",
"url": "URL",
"user": "Utente",
@@ -379,8 +389,8 @@
"confirm-reset": "Sei sicuro di voler azzerare le statistiche di {target}?",
"delete-team-warning": "L'eliminazione di un team eliminerà anche tutti i siti web del team.",
"delete-website-warning": "Saranno eliminati anche tutti i dati associati.",
"empty-dashboard": "La tua dashboard è vuota. Fai clic su Modifica per aggiungere il tuo primo componente.",
"error": "Si è verificato un errore.",
"empty-dashboard": "La tua dashboard è vuota. Fai clic su Modifica per aggiungere il tuo primo componente.",
"event-log": "<b>{event}</b> su <a>{url}</a>",
"forbidden": "Vietato",
"go-to-settings": "Vai alle impostazioni",
@@ -402,6 +412,7 @@
"reset-website": "Per reimpostare questo sito web, digita {confirmation} nella casella sottostante per confermare.",
"reset-website-warning": "Tutte le statistiche verranno cancellate per questo sito, ma il tuo codice di tracciamento rimarrà invariato.",
"saved": "Salvato!",
"select-board-entity-first": "Seleziona prima un sito web, pixel o link.",
"select-component-preview": "Seleziona un componente per l'anteprima",
"select-website-first": "Seleziona prima un sito web",
"sever-error": "Errore del server",
@@ -417,6 +428,7 @@
"unauthorized": "Non autorizzato",
"user-deleted": "Utente eliminato.",
"viewed-page": "Pagina visualizzata",
"upgrade-required": "Questa funzionalità richiede un abbonamento al piano {plan}.",
"visitor-log": "Utenti da <b>{country}</b> tramite <b>{browser}</b> su <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Visas laikotarpis",
"analysis": "Analizė",
"analytics": "Analitika",
"aov": "AOV",
"application": "Programėlė",
"apply": "Taikyti",
"arpu": "ARPU",
"attribution": "Priskyrimas",
"attribution-description": "Žiūrėkite, kaip naudotojai įsitraukia į jūsų rinkodarą ir kas lemia konversijas.",
"audience": "Auditorija",
@@ -33,6 +31,7 @@
"behavior": "Elgsena",
"block-selector": "Bloko pasirinkiklis",
"boards": "Lentos",
"board-type": "Skydelio tipas",
"bounce-rate": "Atmetimo rodiklis",
"breakdown": "Išskaidymas",
"browser": "Naršyklė",
@@ -55,6 +54,8 @@
"confirm": "Patvirtinti",
"confirm-password": "Patvirtinti slaptažodį",
"contains": "Turi",
"regex-match": "Atitinka reguliariąją išraišką",
"regex-not-match": "Neatitinka reguliariosios išraiškos",
"content": "Turinys",
"continue": "Tęsti",
"conversion": "Konversija",
@@ -131,8 +132,8 @@
"funnels": "Piltuvai",
"goal": "Tikslas",
"goals": "Tikslai",
"goals-description": "Sekite savo tikslus puslapių peržiūroms ir įvykiams.",
"good": "Gerai",
"goals-description": "Sekite savo tikslus puslapių peržiūroms ir įvykiams.",
"greater-than": "Daugiau nei",
"greater-than-equals": "Daugiau arba lygu",
"grouped": "Grupuota",
@@ -140,10 +141,10 @@
"hostname": "Pagrindinis kompiuteris",
"hour": "Valanda",
"includes": "Įtraukia",
"inp": "INP",
"insight": "Įžvalga",
"insights": "Įžvalgos",
"insights-description": "Pasinerkite giliau į savo duomenis naudodami segmentus ir filtrus.",
"inp": "INP",
"invalid-url": "Netinkamas URL",
"is": "Yra",
"is-false": "Yra netiesa",
@@ -177,11 +178,11 @@
"manage": "Tvarkyti",
"manager": "Vadovas",
"mask-level": "Maskavimo lygis",
"max": "Maksimumas",
"max-duration": "Maksimali trukmė",
"match": "Atitikimas",
"match-all": "Visi",
"match-any": "Bet kuris",
"max": "Maksimumas",
"max-duration": "Maksimali trukmė",
"maximize": "Išplėsti",
"medium": "Vidutinis",
"member": "Narys",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {įrašas} few {įrašai} other {įrašų}}",
"ok": "Gerai",
"online": "Prisijungęs",
"open": "Mišrus",
"organic-search": "Organinė paieška",
"organic-shopping": "Organinis apsipirkimas",
"organic-social": "Organinis socialinis",
@@ -212,8 +214,8 @@
"page": "Puslapis",
"page-of": "Puslapis {current} iš {total}",
"page-views": "Puslapių peržiūros",
"pages": "Puslapiai",
"pageTitle": "Puslapio pavadinimas",
"pages": "Puslapiai",
"paid-ads": "Mokama reklama",
"paid-search": "Mokama paieška",
"paid-shopping": "Mokamas apsipirkimas",
@@ -225,7 +227,6 @@
"performance": "Veikimas",
"pixel": "Pikselis",
"pixels": "Pikseliai",
"play": "Leisti",
"poor": "Blogai",
"powered-by": "Teikia {name}",
"preferences": "Nuostatos",
@@ -246,16 +247,16 @@
"referrers": "Persiuntėjai",
"refresh": "Atnaujinti",
"regenerate": "Sugeneruoti iš naujo",
"regex-match": "Atitinka reguliariąją išraišką",
"regex-not-match": "Neatitinka reguliariosios išraiškos",
"region": "Regionas",
"regions": "Regionai",
"remaining": "Likę",
"remove": "Pašalinti",
"remove-member": "Pašalinti narį",
"play": "Leisti",
"replay": "Pakartojimas",
"replay-enabled": "Pakartojimas įjungtas",
"replay-id": "Replay ID",
"replay-code": "Sesijos pakartojimo kodas",
"replay-enabled": "Pakartojimas įjungtas",
"replays": "Pakartojimai",
"reports": "Ataskaitos",
"required": "Reikalinga",
@@ -268,21 +269,24 @@
"revenue-description": "Peržiūrėkite savo pajamas laikui bėgant.",
"role": "Vaidmuo",
"run-query": "Vykdyti užklausą",
"sample-rate": "Imties dažnis",
"sample-size": "Imties dydis",
"save": "Išsaugoti",
"save-cohort": "Išsaugoti kohortą",
"save-replay": "Išsaugoti pakartojimą",
"save-segment": "Išsaugoti segmentą",
"sample-rate": "Imties dažnis",
"sample-size": "Imties dydis",
"screen": "Ekranas",
"screens": "Ekranai",
"search": "Ieškoti",
"segment": "Segmentas",
"segments": "Segmentai",
"select": "Pasirinkti",
"select-component": "Pasirinkite komponentą",
"select-link": "Pasirinkti nuorodą",
"select-pixel": "Pasirinkti pikselį",
"select-date": "Pasirinkti laikotarpį",
"select-filter": "Pasirinkti filtrą",
"select-role": "Pasirinkti rolę",
"select-component": "Pasirinkite komponentą",
"select-website": "Pasirinkti svetainę",
"session": "Sesija",
"session-data": "Sesijos duomenys",
@@ -337,9 +341,15 @@
"unique": "Unikalūs",
"unique-events": "Unikalūs įvykiai",
"unique-visitors": "Unikalūs lankytojai",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unikalūs klientai",
"customers": "Klientai",
"orders": "Užsakymai",
"saved": "Išsaugota",
"unknown": "Nežinoma",
"untitled": "Be pavadinimo",
"upgrade": "Atnaujinti",
"update": "Atnaujinti",
"url": "URL",
"user": "Vartotojas",
@@ -379,8 +389,8 @@
"confirm-reset": "Are esate tikri, jog norite atstatyti svetainės {target} statistikos duomenis?",
"delete-team-warning": "Ištrinant komandą bus ištrintos ir visos komandos svetainės.",
"delete-website-warning": "Visi susiję duomenys taip pat bus ištrinti.",
"empty-dashboard": "Jūsų prietaisų skydelis tuščias. Spustelėkite Redaguoti, kad pridėtumėte pirmąjį komponentą.",
"error": "Kažkas įvyko ne taip.",
"empty-dashboard": "Jūsų prietaisų skydelis tuščias. Spustelėkite Redaguoti, kad pridėtumėte pirmąjį komponentą.",
"event-log": "<b>{event}</b> puslapyje <a>{url}</a>",
"forbidden": "Draudžiama",
"go-to-settings": "Eiti į nustatymus",
@@ -402,6 +412,7 @@
"reset-website": "Kad atstatyti šią svetainę, įrašykite {confirmation} žemiau, kad patvirtintumėte.",
"reset-website-warning": "Visi šios svetainės statistikos duomenys bus ištrinti, bet sekimo kodas išliks nepaliestas.",
"saved": "Sėkmingai išsaugota.",
"select-board-entity-first": "Pirmiausia pasirinkite svetainę, pikselį arba nuorodą.",
"select-component-preview": "Pasirinkite komponentą peržiūrai",
"select-website-first": "Pirmiausia pasirinkite svetainę",
"sever-error": "Serverio klaida",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizuota",
"user-deleted": "Vartotojas ištrintas.",
"viewed-page": "Peržiūrėtas puslapis",
"upgrade-required": "Šiai funkcijai reikalinga {plan} plano prenumerata.",
"visitor-log": "Lankytojas iš <b>{country}</b>, naudojantis <b>{browser}</b> sistemoje <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Sepanjang masa",
"analysis": "Analisis",
"analytics": "Analitik",
"aov": "AOV",
"application": "Aplikasi",
"apply": "Terapkan",
"arpu": "ARPU",
"attribution": "Atribusi",
"attribution-description": "Lihat bagaimana pengguna berinteraksi dengan pemasaran anda dan apa yang mendorong penukaran.",
"audience": "Khalayak",
@@ -33,6 +31,7 @@
"behavior": "Tingkah laku",
"block-selector": "Pemilih blok",
"boards": "Papan",
"board-type": "Jenis papan",
"bounce-rate": "Kadar lantunan",
"breakdown": "Pecahan",
"browser": "Pelayar",
@@ -55,6 +54,8 @@
"confirm": "Sahkan",
"confirm-password": "Sahkan kata laluan",
"contains": "Mengandungi",
"regex-match": "Sepadan dengan ungkapan biasa",
"regex-not-match": "Tidak sepadan dengan ungkapan biasa",
"content": "Kandungan",
"continue": "Teruskan",
"conversion": "Penukaran",
@@ -131,8 +132,8 @@
"funnels": "Corong",
"goal": "Matlamat",
"goals": "Matlamat",
"goals-description": "Jejaki matlamat anda untuk paparan halaman dan peristiwa.",
"good": "Baik",
"goals-description": "Jejaki matlamat anda untuk paparan halaman dan peristiwa.",
"greater-than": "Lebih besar dari",
"greater-than-equals": "Lebih besar atau sama",
"grouped": "Dikumpulkan",
@@ -140,10 +141,10 @@
"hostname": "Nama hos",
"hour": "Jam",
"includes": "Termasuk",
"inp": "INP",
"insight": "Wawasan",
"insights": "Wawasan",
"insights-description": "Terokai data anda dengan lebih mendalam menggunakan segmen dan tapis.",
"inp": "INP",
"invalid-url": "URL tidak sah",
"is": "Adalah",
"is-false": "Adalah palsu",
@@ -177,11 +178,11 @@
"manage": "Urus",
"manager": "Pengurus",
"mask-level": "Tahap pelindung",
"max": "Maks",
"max-duration": "Tempoh maksimum",
"match": "Padanan",
"match-all": "Semua",
"match-any": "Mana-mana",
"max": "Maks",
"max-duration": "Tempoh maksimum",
"maximize": "Expand",
"medium": "Medium",
"member": "Ahli",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {rekod} other {rekod}}",
"ok": "OK",
"online": "Dalam talian",
"open": "Campuran",
"organic-search": "Carian organik",
"organic-shopping": "Beli-belah organik",
"organic-social": "Sosial organik",
@@ -212,8 +214,8 @@
"page": "Halaman",
"page-of": "Halaman {current} daripada {total}",
"page-views": "Paparan halaman",
"pages": "Halaman",
"pageTitle": "Tajuk halaman",
"pages": "Halaman",
"paid-ads": "Iklan berbayar",
"paid-search": "Carian berbayar",
"paid-shopping": "Beli-belah berbayar",
@@ -225,7 +227,6 @@
"performance": "Prestasi",
"pixel": "Piksel",
"pixels": "Piksel",
"play": "Main",
"poor": "Lemah",
"powered-by": "Disediakan oleh {name}",
"preferences": "Keutamaan",
@@ -246,16 +247,16 @@
"referrers": "Perujuk",
"refresh": "Muat semula",
"regenerate": "Jana semula",
"regex-match": "Sepadan dengan ungkapan biasa",
"regex-not-match": "Tidak sepadan dengan ungkapan biasa",
"region": "Wilayah",
"regions": "Wilayah",
"remaining": "Baki",
"remove": "Buang",
"remove-member": "Buang ahli",
"play": "Main",
"replay": "Main semula",
"replay-enabled": "Main semula diaktifkan",
"replay-id": "Replay ID",
"replay-code": "Kod main semula sesi",
"replay-enabled": "Main semula diaktifkan",
"replays": "Main semula",
"reports": "Laporan",
"required": "Diperlukan",
@@ -268,21 +269,24 @@
"revenue-description": "Look into your revenue across time.",
"role": "Peranan",
"run-query": "Jalankan pertanyaan",
"sample-rate": "Kadar pensampelan",
"sample-size": "Saiz sampel",
"save": "Simpan",
"save-cohort": "Simpan kohort",
"save-replay": "Simpan main semula",
"save-segment": "Simpan segmen",
"sample-rate": "Kadar pensampelan",
"sample-size": "Saiz sampel",
"screen": "Skrin",
"screens": "Skrin",
"search": "Cari",
"segment": "Segmen",
"segments": "Segmen",
"select": "Pilih",
"select-component": "Pilih komponen",
"select-link": "Pilih pautan",
"select-pixel": "Pilih piksel",
"select-date": "Pilih tarikh",
"select-filter": "Pilih tapis",
"select-role": "Pilih peranan",
"select-component": "Pilih komponen",
"select-website": "Pilih laman web",
"session": "Sesi",
"session-data": "Data sesi",
@@ -337,9 +341,15 @@
"unique": "Unik",
"unique-events": "Peristiwa unik",
"unique-visitors": "Pelawat unik",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Pelanggan unik",
"customers": "Pelanggan",
"orders": "Pesanan",
"saved": "Disimpan",
"unknown": "Tidak diketahui",
"untitled": "Tanpa tajuk",
"upgrade": "Naik taraf",
"update": "Kemas kini",
"url": "URL",
"user": "Pengguna",
@@ -379,8 +389,8 @@
"confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"delete-team-warning": "Memadamkan pasukan juga akan memadamkan semua laman web pasukan.",
"delete-website-warning": "Semua data yang berkaitan juga akan dihapuskan.",
"empty-dashboard": "Papan pemuka anda kosong. Klik Edit untuk menambah komponen pertama anda.",
"error": "Ada yang tidak kena.",
"empty-dashboard": "Papan pemuka anda kosong. Klik Edit untuk menambah komponen pertama anda.",
"event-log": "<b>{event}</b> di <a>{url}</a>",
"forbidden": "Dilarang",
"go-to-settings": "Pergi ke tetapan",
@@ -402,6 +412,7 @@
"reset-website": "Untuk menetapkan semula laman web ini, taip {confirmation} dalam kotak di bawah.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Berjaya disimpan.",
"select-board-entity-first": "Pilih laman web, piksel, atau pautan terlebih dahulu.",
"select-component-preview": "Pilih komponen untuk pratonton",
"select-website-first": "Pilih laman web dahulu",
"sever-error": "Ralat pelayan",
@@ -417,6 +428,7 @@
"unauthorized": "Tidak dibenarkan",
"user-deleted": "Pengguna dipadamkan.",
"viewed-page": "Halaman dilihat",
"upgrade-required": "Ciri ini memerlukan langganan pelan {plan}.",
"visitor-log": "Pelawat dari <b>{country}</b> mengguna <b>{browser}</b> pada <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Noensinne",
"analysis": "Analyse",
"analytics": "Analyse",
"aov": "AOV",
"application": "Applikasjon",
"apply": "Bruk",
"arpu": "ARPU",
"attribution": "Attribusjon",
"attribution-description": "Se hvordan brukere engasjerer seg i markedsføringen din og hva som driver konverteringer.",
"audience": "Målgruppe",
@@ -33,6 +31,7 @@
"behavior": "Atferd",
"block-selector": "Blokkvelger",
"boards": "Tavler",
"board-type": "Tavletype",
"bounce-rate": "Avvisningsfrekvens",
"breakdown": "Nedbrytning",
"browser": "Nettleser",
@@ -55,6 +54,8 @@
"confirm": "Bekreft",
"confirm-password": "Godkjenn passord",
"contains": "Inneholder",
"regex-match": "Samsvarer med regulært uttrykk",
"regex-not-match": "Samsvarer ikke med regulært uttrykk",
"content": "Innhold",
"continue": "Fortsett",
"conversion": "Konvertering",
@@ -131,8 +132,8 @@
"funnels": "Trakter",
"goal": "Mål",
"goals": "Mål",
"goals-description": "Spor dine mål for sidevisninger og hendelser.",
"good": "God",
"goals-description": "Spor dine mål for sidevisninger og hendelser.",
"greater-than": "Mer enn",
"greater-than-equals": "Mer enn eller lik",
"grouped": "Gruppert",
@@ -140,10 +141,10 @@
"hostname": "Vertsnavn",
"hour": "Time",
"includes": "Inkluderer",
"inp": "INP",
"insight": "Innsikt",
"insights": "Innsikt",
"insights-description": "Dykk dypere i din data ved bruk av segmentering og filtre.",
"inp": "INP",
"invalid-url": "Ugyldig URL",
"is": "Er",
"is-false": "Er usant",
@@ -177,11 +178,11 @@
"manage": "Administrer",
"manager": "Administrator",
"mask-level": "Maskenivå",
"max": "Maks",
"max-duration": "Maksimal varighet",
"match": "Samsvar",
"match-all": "Alle",
"match-any": "Enhver",
"max": "Maks",
"max-duration": "Maksimal varighet",
"maximize": "Utvid",
"medium": "Medium",
"member": "Bruker",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {post} other {poster}}",
"ok": "OK",
"online": "Tilkoblet",
"open": "Blandet",
"organic-search": "Organisk søk",
"organic-shopping": "Organisk handel",
"organic-social": "Organisk sosial",
@@ -212,8 +214,8 @@
"page": "Side",
"page-of": "Side {current} av {total}",
"page-views": "Sidevisninger",
"pages": "Sider",
"pageTitle": "Sidetittel",
"pages": "Sider",
"paid-ads": "Betalte annonser",
"paid-search": "Betalt søk",
"paid-shopping": "Betalt handel",
@@ -225,7 +227,6 @@
"performance": "Ytelse",
"pixel": "Piksel",
"pixels": "Piksler",
"play": "Spill av",
"poor": "Dårlig",
"powered-by": "Drevet av {name}",
"preferences": "Innstillinger",
@@ -246,16 +247,16 @@
"referrers": "Henvisere",
"refresh": "Oppdater",
"regenerate": "Regenerer",
"regex-match": "Samsvarer med regulært uttrykk",
"regex-not-match": "Samsvarer ikke med regulært uttrykk",
"region": "Region",
"regions": "Regioner",
"remaining": "Gjenstår",
"remove": "Fjern",
"remove-member": "Fjern bruker",
"play": "Spill av",
"replay": "Avspilling",
"replay-enabled": "Avspilling aktivert",
"replay-id": "Replay ID",
"replay-code": "Kode for øktavspilling",
"replay-enabled": "Avspilling aktivert",
"replays": "Avspillinger",
"reports": "Rapporter",
"required": "Påkrevd",
@@ -268,21 +269,24 @@
"revenue-description": "Se på inntektene dine over tid.",
"role": "Rolle",
"run-query": "Kjør spørring",
"sample-rate": "Samplingsfrekvens",
"sample-size": "Utvalgsstørrelse",
"save": "Lagre",
"save-cohort": "Lagre kohort",
"save-replay": "Lagre avspilling",
"save-segment": "Lagre segment",
"sample-rate": "Samplingsfrekvens",
"sample-size": "Utvalgsstørrelse",
"screen": "Skjerm",
"screens": "Skjermer",
"search": "Søk",
"segment": "Segment",
"segments": "Segmenter",
"select": "Velg",
"select-component": "Velg komponent",
"select-link": "Velg lenke",
"select-pixel": "Velg piksel",
"select-date": "Velg dato",
"select-filter": "Velg filter",
"select-role": "Velg rolle",
"select-component": "Velg komponent",
"select-website": "Velg nettsted",
"session": "Økt",
"session-data": "Øktdata",
@@ -337,9 +341,15 @@
"unique": "Unike",
"unique-events": "Unike hendelser",
"unique-visitors": "Unike besøkende",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unike kunder",
"customers": "Kunder",
"orders": "Bestillinger",
"saved": "Lagret",
"unknown": "Ukjent",
"untitled": "Uten tittel",
"upgrade": "Oppgrader",
"update": "Oppdater",
"url": "URL",
"user": "Bruker",
@@ -379,8 +389,8 @@
"confirm-reset": "Er du sikker på at du vil nullstille statistikken til {target}?",
"delete-team-warning": "Å slette et team vil også slette alle teamets nettsteder.",
"delete-website-warning": "Alle tilknyttede data vil også bli slettet.",
"empty-dashboard": "Dashbordet ditt er tomt. Klikk Rediger for å legge til din første komponent.",
"error": "Noe gikk galt.",
"empty-dashboard": "Dashbordet ditt er tomt. Klikk Rediger for å legge til din første komponent.",
"event-log": "<b>{event}</b> på <a>{url}</a>",
"forbidden": "Forbudt",
"go-to-settings": "Gå til innstillinger",
@@ -402,6 +412,7 @@
"reset-website": "For å nullstille dette nettstedet, skriv {confirmation} i feltet nedenfor for å bekrefte.",
"reset-website-warning": "All statistikk for dette nettstedet vil bli slettet, men sporingskoden forblir uberørt.",
"saved": "Lagret!",
"select-board-entity-first": "Velg først et nettsted, piksel eller lenke.",
"select-component-preview": "Velg en komponent for forhåndsvisning",
"select-website-first": "Velg et nettsted først",
"sever-error": "Serverfeil",
@@ -417,6 +428,7 @@
"unauthorized": "Ikke autorisert",
"user-deleted": "Bruker slettet.",
"viewed-page": "Vist side",
"upgrade-required": "Denne funksjonen krever et {plan}-abonnement.",
"visitor-log": "Besøkende fra <b>{country}</b> med <b>{browser}</b> på <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Onbeperkt",
"analysis": "Analyse",
"analytics": "Analyse",
"aov": "AOV",
"application": "Applicatie",
"apply": "Toepassen",
"arpu": "ARPU",
"attribution": "Toewijzing",
"attribution-description": "Bekijk hoe gebruikers omgaan met je marketing en wat conversies stimuleert.",
"audience": "Publiek",
@@ -33,6 +31,7 @@
"behavior": "Gedrag",
"block-selector": "Blokselectie",
"boards": "Borden",
"board-type": "Bordtype",
"bounce-rate": "Bouncepercentage",
"breakdown": "Opsplitsen",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Bevestigen",
"confirm-password": "Wachtwoord bevestigen",
"contains": "Bevat",
"regex-match": "Komt overeen met reguliere expressie",
"regex-not-match": "Komt niet overeen met reguliere expressie",
"content": "Inhoud",
"continue": "Doorgaan",
"conversion": "Conversie",
@@ -131,8 +132,8 @@
"funnels": "Trechters",
"goal": "Doel",
"goals": "Doelen",
"goals-description": "Volg je doelen voor paginaweergaven en gebeurtenissen.",
"good": "Goed",
"goals-description": "Volg je doelen voor paginaweergaven en gebeurtenissen.",
"greater-than": "Groter dan",
"greater-than-equals": "Groter of gelijk aan",
"grouped": "Gegroepeerd",
@@ -140,10 +141,10 @@
"hostname": "Hostnaam",
"hour": "Uur",
"includes": "Bevat",
"inp": "INP",
"insight": "Inzicht",
"insights": "Inzichten",
"insights-description": "Verken je gegevens verder door segmenten en filters te gebruiken.",
"inp": "INP",
"invalid-url": "Ongeldige URL",
"is": "Is",
"is-false": "Is onwaar",
@@ -177,11 +178,11 @@
"manage": "Beheren",
"manager": "Beheerder",
"mask-level": "Maskeerniveau",
"max": "Max",
"max-duration": "Maximale duur",
"match": "Overeenkomst",
"match-all": "Alle",
"match-any": "Elk",
"max": "Max",
"max-duration": "Maximale duur",
"maximize": "Uitvouwen",
"medium": "Medium",
"member": "Gebruiker",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {record} other {records}}",
"ok": "OK",
"online": "Online",
"open": "Gemengd",
"organic-search": "Organisch zoeken",
"organic-shopping": "Organisch winkelen",
"organic-social": "Organisch sociaal",
@@ -212,8 +214,8 @@
"page": "Pagina",
"page-of": "Pagina {current} van {total}",
"page-views": "Paginaweergaven",
"pages": "Pagina's",
"pageTitle": "Pagina titel",
"pages": "Pagina's",
"paid-ads": "Betaalde advertenties",
"paid-search": "Betaald zoeken",
"paid-shopping": "Betaald winkelen",
@@ -225,7 +227,6 @@
"performance": "Prestaties",
"pixel": "Pixel",
"pixels": "Pixels",
"play": "Afspelen",
"poor": "Slecht",
"powered-by": "mogelijk gemaakt door {name}",
"preferences": "Voorkeuren",
@@ -246,16 +247,16 @@
"referrers": "Verwijzers",
"refresh": "Vernieuwen",
"regenerate": "Opnieuw genereren",
"regex-match": "Komt overeen met reguliere expressie",
"regex-not-match": "Komt niet overeen met reguliere expressie",
"region": "Regio",
"regions": "Regio's",
"remaining": "Resterend",
"remove": "Verwijderen",
"remove-member": "Gebruiker verwijderen",
"play": "Afspelen",
"replay": "Herhaling",
"replay-enabled": "Herhaling ingeschakeld",
"replay-id": "Replay ID",
"replay-code": "Sessieherhalingscode",
"replay-enabled": "Herhaling ingeschakeld",
"replays": "Herhalingen",
"reports": "Rapporten",
"required": "Verplicht",
@@ -268,21 +269,24 @@
"revenue-description": "Bekijk je omzet in de loop van de tijd.",
"role": "Gebruikersrol",
"run-query": "Query uitvoeren",
"sample-rate": "Bemonsteringsfrequentie",
"sample-size": "Steekproefgrootte",
"save": "Opslaan",
"save-cohort": "Cohort opslaan",
"save-replay": "Herhaling opslaan",
"save-segment": "Segment opslaan",
"sample-rate": "Bemonsteringsfrequentie",
"sample-size": "Steekproefgrootte",
"screen": "Scherm",
"screens": "Schermen",
"search": "Zoeken",
"segment": "Segment",
"segments": "Segmenten",
"select": "Selecteer",
"select-component": "Component selecteren",
"select-link": "Link selecteren",
"select-pixel": "Pixel selecteren",
"select-date": "Datum selecteren",
"select-filter": "Filter selecteren",
"select-role": "Rol selecteren",
"select-component": "Component selecteren",
"select-website": "Website selecteren",
"session": "Sessie",
"session-data": "Sessiegegevens",
@@ -337,9 +341,15 @@
"unique": "Uniek",
"unique-events": "Unieke gebeurtenissen",
"unique-visitors": "Unieke bezoekers",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unieke klanten",
"customers": "Klanten",
"orders": "Bestellingen",
"saved": "Opgeslagen",
"unknown": "Onbekend",
"untitled": "Ongetiteld",
"upgrade": "Upgraden",
"update": "Bijwerken",
"url": "URL",
"user": "Gebruiker",
@@ -379,8 +389,8 @@
"confirm-reset": "Weet je zeker dat je de statistieken van {target} opnieuw wilt instellen?",
"delete-team-warning": "Als een team wordt verwijderd, worden ook alle websites van dat team verwijderd.",
"delete-website-warning": "Alle verwante gegevens zullen ook verwijderd worden.",
"empty-dashboard": "Uw dashboard is leeg. Klik op Bewerken om uw eerste component toe te voegen.",
"error": "Er is iets misgegaan.",
"empty-dashboard": "Uw dashboard is leeg. Klik op Bewerken om uw eerste component toe te voegen.",
"event-log": "<b>{event}</b> op <a>{url}</a>",
"forbidden": "Verboden",
"go-to-settings": "Naar instellingen",
@@ -402,6 +412,7 @@
"reset-website": "Typ {confirmation} in het veld hieronder om te bevestigen dat je de website wilt resetten.",
"reset-website-warning": "Alle bijhorende statistieken van deze website worden verwijderd, maar jouw volgcode blijft gelden.",
"saved": "Opslaan succesvol.",
"select-board-entity-first": "Selecteer eerst een website, pixel of link.",
"select-component-preview": "Selecteer een component voor een voorvertoning",
"select-website-first": "Selecteer eerst een website",
"sever-error": "Serverfout",
@@ -417,6 +428,7 @@
"unauthorized": "Niet geautoriseerd",
"user-deleted": "Gebruiker verwijderd",
"viewed-page": "Bekeken pagina",
"upgrade-required": "Deze functie vereist een {plan}-abonnement.",
"visitor-log": "Bezoeker uit <b>{country}</b> met <b>{browser}</b> op een <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Cały czas",
"analysis": "Analiza",
"analytics": "Analityka",
"aov": "AOV",
"application": "Aplikacja",
"apply": "Zastosuj",
"arpu": "ARPU",
"attribution": "Atrybucja",
"attribution-description": "Zobacz, jak użytkownicy angażują się w Twoją reklamę i co napędza konwersje.",
"audience": "Odbiorcy",
@@ -33,6 +31,7 @@
"behavior": "Zachowanie",
"block-selector": "Selektor bloków",
"boards": "Tablice",
"board-type": "Typ tablicy",
"bounce-rate": "Współczynnik odrzuceń",
"breakdown": "Rozbicie",
"browser": "Przeglądarka",
@@ -55,6 +54,8 @@
"confirm": "Potwierdź",
"confirm-password": "Potwierdź hasło",
"contains": "Zawiera",
"regex-match": "Pasuje do wyrażenia regularnego",
"regex-not-match": "Nie pasuje do wyrażenia regularnego",
"content": "Treść",
"continue": "Kontynuuj",
"conversion": "Konwersja",
@@ -131,8 +132,8 @@
"funnels": "Lejki",
"goal": "Cel",
"goals": "Cele",
"goals-description": "Śledź cele dla odsłon stron i zdarzeń.",
"good": "Dobrze",
"goals-description": "Śledź cele dla odsłon stron i zdarzeń.",
"greater-than": "Większe niż",
"greater-than-equals": "Większe niż lub równe",
"grouped": "Grupowane",
@@ -140,10 +141,10 @@
"hostname": "Nazwa hosta",
"hour": "Godzina",
"includes": "Zawiera",
"inp": "INP",
"insight": "Wgląd",
"insights": "Analiza",
"insights-description": "Poznaj lepiej swoje dane, korzystając z segmentów i filtrów.",
"inp": "INP",
"invalid-url": "Nieprawidłowy URL",
"is": "Równe",
"is-false": "Jest fałszem",
@@ -177,11 +178,11 @@
"manage": "Zarządzaj",
"manager": "Menedżer",
"mask-level": "Poziom maski",
"max": "Maks",
"max-duration": "Maksymalny czas trwania",
"match": "Dopasowanie",
"match-all": "Wszystkie",
"match-any": "Dowolny",
"max": "Maks",
"max-duration": "Maksymalny czas trwania",
"maximize": "Rozwiń",
"medium": "Medium",
"member": "Członek",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {rekord} other {rekordy}}",
"ok": "OK",
"online": "Online",
"open": "Mieszany",
"organic-search": "Wyszukiwanie organiczne",
"organic-shopping": "Zakupy organiczne",
"organic-social": "Organiczne social media",
@@ -212,8 +214,8 @@
"page": "Strona",
"page-of": "Strona {current} z {total}",
"page-views": "Wyświetlenia strony",
"pages": "Strony",
"pageTitle": "Tytuł strony",
"pages": "Strony",
"paid-ads": "Reklamy płatne",
"paid-search": "Płatne wyszukiwanie",
"paid-shopping": "Płatne zakupy",
@@ -225,7 +227,6 @@
"performance": "Wydajność",
"pixel": "Piksel",
"pixels": "Piksele",
"play": "Odtwórz",
"poor": "Słabo",
"powered-by": "Obsługiwane przez {name}",
"preferences": "Preferencje",
@@ -246,16 +247,16 @@
"referrers": "Źródła odsyłające",
"refresh": "Odśwież",
"regenerate": "Wygeneruj ponownie",
"regex-match": "Pasuje do wyrażenia regularnego",
"regex-not-match": "Nie pasuje do wyrażenia regularnego",
"region": "Region",
"regions": "Regiony",
"remaining": "Pozostało",
"remove": "Usuń",
"remove-member": "Usuń członka",
"play": "Odtwórz",
"replay": "Odtwarzanie",
"replay-enabled": "Odtwarzanie włączone",
"replay-id": "Replay ID",
"replay-code": "Kod odtworzenia sesji",
"replay-enabled": "Odtwarzanie włączone",
"replays": "Odtwarzania",
"reports": "Raporty",
"required": "Wymagany",
@@ -268,21 +269,24 @@
"revenue-description": "Sprawdź swoje przychody w czasie.",
"role": "Rola",
"run-query": "Uruchom zapytanie",
"sample-rate": "Częstotliwość próbkowania",
"sample-size": "Rozmiar próbki",
"save": "Zapisz",
"save-cohort": "Zapisz kohortę",
"save-replay": "Zapisz odtworzenie",
"save-segment": "Zapisz segment",
"sample-rate": "Częstotliwość próbkowania",
"sample-size": "Rozmiar próbki",
"screen": "Ekran",
"screens": "Ekrany",
"search": "Szukaj",
"segment": "Segment",
"segments": "Segmenty",
"select": "Wybierz",
"select-component": "Wybierz komponent",
"select-link": "Wybierz link",
"select-pixel": "Wybierz piksel",
"select-date": "Wybierz datę",
"select-filter": "Wybierz filtr",
"select-role": "Wybierz rolę",
"select-component": "Wybierz komponent",
"select-website": "Wybierz witrynę",
"session": "Sesja",
"session-data": "Dane sesji",
@@ -337,9 +341,15 @@
"unique": "Unikalne",
"unique-events": "Unikalne zdarzenia",
"unique-visitors": "Unikalni odwiedzający",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unikalni klienci",
"customers": "Klienci",
"orders": "Zamówienia",
"saved": "Zapisano",
"unknown": "Nieznany",
"untitled": "Bez tytułu",
"upgrade": "Ulepsz",
"update": "Aktualizuj",
"url": "URL",
"user": "Użytkownik",
@@ -379,8 +389,8 @@
"confirm-reset": "Czy na pewno chcesz zresetować statystyki {target}?",
"delete-team-warning": "Usunięcie zespołu usunie wszystkie jego witryny.",
"delete-website-warning": "Wszystkie powiązane dane również zostaną usunięte.",
"empty-dashboard": "Twój pulpit jest pusty. Kliknij Edytuj, aby dodać pierwszy komponent.",
"error": "Coś poszło nie tak.",
"empty-dashboard": "Twój pulpit jest pusty. Kliknij Edytuj, aby dodać pierwszy komponent.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Zabronione",
"go-to-settings": "Przejdź do ustawień",
@@ -402,6 +412,7 @@
"reset-website": "Aby zresetować tę witrynę, wpisz {confirmation} w polu poniżej, aby potwierdzić.",
"reset-website-warning": "Wszystkie statystyki tej witryny zostaną usunięte, ale kod śledzenia pozostanie nienaruszony.",
"saved": "Zapisano pomyślnie.",
"select-board-entity-first": "Najpierw wybierz stronę, piksel lub link.",
"select-component-preview": "Wybierz komponent do podglądu",
"select-website-first": "Najpierw wybierz stronę internetową",
"sever-error": "Błąd serwera",
@@ -417,6 +428,7 @@
"unauthorized": "Brak autoryzacji",
"user-deleted": "Użytkownik usunięty.",
"viewed-page": "Obejrzana strona",
"upgrade-required": "Ta funkcja wymaga subskrypcji planu {plan}.",
"visitor-log": "Odwiedzający z <b>{country}</b> używa <b>{browser}</b> na <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Todos os períodos",
"analysis": "Análise",
"analytics": "Análise",
"aov": "AOV",
"application": "Aplicação",
"apply": "Aplicar",
"arpu": "ARPU",
"attribution": "Atribuição",
"attribution-description": "Veja como os usuários interagem com seu marketing e o que impulsiona conversões.",
"audience": "Audiência",
@@ -33,6 +31,7 @@
"behavior": "Comportamento",
"block-selector": "Seletor de bloco",
"boards": "Quadros",
"board-type": "Tipo de painel",
"bounce-rate": "Taxa de rejeição",
"breakdown": "Detalhamento",
"browser": "Navegador",
@@ -55,6 +54,8 @@
"confirm": "Confirmar",
"confirm-password": "Confirmar senha",
"contains": "Contém",
"regex-match": "Corresponde à expressão regular",
"regex-not-match": "Não corresponde à expressão regular",
"content": "Conteúdo",
"continue": "Continuar",
"conversion": "Conversão",
@@ -131,8 +132,8 @@
"funnels": "Funis",
"goal": "Meta",
"goals": "Metas",
"goals-description": "Acompanhe suas metas para visualizações de página e eventos.",
"good": "Bom",
"goals-description": "Acompanhe suas metas para visualizações de página e eventos.",
"greater-than": "Maior que",
"greater-than-equals": "Maior ou igual a",
"grouped": "Agrupado",
@@ -140,10 +141,10 @@
"hostname": "Nome do host",
"hour": "Hora",
"includes": "Inclui",
"inp": "INP",
"insight": "Insight",
"insights": "Insights",
"insights-description": "Explore seus dados em mais detalhes usando filtros",
"inp": "INP",
"invalid-url": "URL inválida",
"is": "É igual a",
"is-false": "É falso",
@@ -177,11 +178,11 @@
"manage": "Gerenciar",
"manager": "Gerente",
"mask-level": "Nível de máscara",
"max": "Máximo",
"max-duration": "Duração máxima",
"match": "Correspondência",
"match-all": "Todos",
"match-any": "Qualquer",
"max": "Máximo",
"max-duration": "Duração máxima",
"maximize": "Expandir",
"medium": "Médio",
"member": "Membro",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {registro} other {registros}}",
"ok": "OK",
"online": "Online",
"open": "Misto",
"organic-search": "Busca orgânica",
"organic-shopping": "Compras orgânicas",
"organic-social": "Social orgânico",
@@ -212,8 +214,8 @@
"page": "Página",
"page-of": "Página {current} de {total}",
"page-views": "Visualizações de página",
"pages": "Páginas",
"pageTitle": "Título",
"pages": "Páginas",
"paid-ads": "Anúncios pagos",
"paid-search": "Busca paga",
"paid-shopping": "Compras pagas",
@@ -225,7 +227,6 @@
"performance": "Desempenho",
"pixel": "Pixel",
"pixels": "Pixels",
"play": "Reproduzir",
"poor": "Ruim",
"powered-by": "Desenvolvido por {name}",
"preferences": "Preferências",
@@ -246,16 +247,16 @@
"referrers": "Referências",
"refresh": "Atualizar",
"regenerate": "Gerar novamente",
"regex-match": "Corresponde à expressão regular",
"regex-not-match": "Não corresponde à expressão regular",
"region": "Estado",
"regions": "Estados",
"remaining": "Restante",
"remove": "Remover",
"remove-member": "Remover membro",
"play": "Reproduzir",
"replay": "Reprodução",
"replay-enabled": "Reprodução habilitada",
"replay-id": "Replay ID",
"replay-code": "Código de replay da sessão",
"replay-enabled": "Reprodução habilitada",
"replays": "Reproduções",
"reports": "Relatórios",
"required": "Obrigatório",
@@ -268,21 +269,24 @@
"revenue-description": "Veja sua receita ao longo do tempo.",
"role": "Função",
"run-query": "Executar consulta",
"sample-rate": "Taxa de amostragem",
"sample-size": "Tamanho da amostra",
"save": "Salvar",
"save-cohort": "Salvar coorte",
"save-replay": "Salvar replay",
"save-segment": "Salvar segmento",
"sample-rate": "Taxa de amostragem",
"sample-size": "Tamanho da amostra",
"screen": "Tela",
"screens": "Tamanhos de tela",
"search": "Pesquisar",
"segment": "Segmento",
"segments": "Segmentos",
"select": "Selecionar",
"select-component": "Selecionar componente",
"select-link": "Selecionar link",
"select-pixel": "Selecionar pixel",
"select-date": "Selecionar data",
"select-filter": "Selecionar filtro",
"select-role": "Selecionar função",
"select-component": "Selecionar componente",
"select-website": "Selecionar site",
"session": "Sessão",
"session-data": "Dados da sessão",
@@ -337,9 +341,15 @@
"unique": "Únicos",
"unique-events": "Eventos únicos",
"unique-visitors": "Visitantes únicos",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clientes únicos",
"customers": "Clientes",
"orders": "Pedidos",
"saved": "Salvo",
"unknown": "Desconhecido",
"untitled": "Sem título",
"upgrade": "Atualizar",
"update": "Atualizar",
"url": "URL",
"user": "Usuário",
@@ -379,8 +389,8 @@
"confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?",
"delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.",
"delete-website-warning": "Todos os dados relacionados serão excluídos.",
"empty-dashboard": "Seu painel está vazio. Clique em Editar para adicionar seu primeiro componente.",
"error": "Ocorreu um erro.",
"empty-dashboard": "Seu painel está vazio. Clique em Editar para adicionar seu primeiro componente.",
"event-log": "<b>{event}</b> em <a>{url}</a>",
"forbidden": "Proibido",
"go-to-settings": "Ir para as configurações",
@@ -402,6 +412,7 @@
"reset-website": "Se você tiver certeza de que deseja redefinir este site, digite {confirmation} na caixa de entrada abaixo para confirmar.",
"reset-website-warning": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo.",
"saved": "Salvo com sucesso.",
"select-board-entity-first": "Selecione primeiro um site, pixel ou link.",
"select-component-preview": "Selecione um componente para visualizar",
"select-website-first": "Selecione um site primeiro",
"sever-error": "Erro do servidor",
@@ -417,6 +428,7 @@
"unauthorized": "Não autorizado",
"user-deleted": "Usuário excluído.",
"viewed-page": "Página visualizada",
"upgrade-required": "Este recurso requer uma assinatura do plano {plan}.",
"visitor-log": "Visitante de <b>{country}</b> usando o navegador <b>{browser}</b> em um <b>{device}</b> com sistema operacional <b>{os}</b>."
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Todo o tempo",
"analysis": "Análise",
"analytics": "Análise",
"aov": "AOV",
"application": "Aplicação",
"apply": "Aplicar",
"arpu": "ARPU",
"attribution": "Atribuição",
"attribution-description": "Veja como os utilizadores interagem com o seu marketing e o que impulsiona conversões.",
"audience": "Audiência",
@@ -33,6 +31,7 @@
"behavior": "Comportamento",
"block-selector": "Seletor de bloco",
"boards": "Quadros",
"board-type": "Tipo de painel",
"bounce-rate": "Taxa de rejeição",
"breakdown": "Detalhamento",
"browser": "Navegador",
@@ -55,6 +54,8 @@
"confirm": "Confirmar",
"confirm-password": "Confirmar senha",
"contains": "Contém",
"regex-match": "Corresponde à expressão regular",
"regex-not-match": "Não corresponde à expressão regular",
"content": "Conteúdo",
"continue": "Continuar",
"conversion": "Conversão",
@@ -131,8 +132,8 @@
"funnels": "Funis",
"goal": "Objetivo",
"goals": "Objetivos",
"goals-description": "Acompanhe os seus objetivos para visualizações de página e eventos.",
"good": "Bom",
"goals-description": "Acompanhe os seus objetivos para visualizações de página e eventos.",
"greater-than": "Maior que",
"greater-than-equals": "Maior ou igual a",
"grouped": "Agrupado",
@@ -140,10 +141,10 @@
"hostname": "Nome do host",
"hour": "Hora",
"includes": "Inclui",
"inp": "INP",
"insight": "Insight",
"insights": "Insights",
"insights-description": "Aprofunde os seus dados utilizando segmentos e filtros.",
"inp": "INP",
"invalid-url": "URL inválido",
"is": "É",
"is-false": "É falso",
@@ -177,11 +178,11 @@
"manage": "Gerir",
"manager": "Gestor",
"mask-level": "Nível de máscara",
"max": "Máximo",
"max-duration": "Duração máxima",
"match": "Correspondência",
"match-all": "Todos",
"match-any": "Qualquer",
"max": "Máximo",
"max-duration": "Duração máxima",
"maximize": "Expandir",
"medium": "Médio",
"member": "Membro",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {registo} other {registos}}",
"ok": "OK",
"online": "Online",
"open": "Misto",
"organic-search": "Pesquisa orgânica",
"organic-shopping": "Compras orgânicas",
"organic-social": "Social orgânico",
@@ -212,8 +214,8 @@
"page": "Página",
"page-of": "Página {current} de {total}",
"page-views": "Visualizações da página",
"pages": "Páginas",
"pageTitle": "Título da página",
"pages": "Páginas",
"paid-ads": "Anúncios pagos",
"paid-search": "Pesquisa paga",
"paid-shopping": "Compras pagas",
@@ -225,7 +227,6 @@
"performance": "Desempenho",
"pixel": "Pixel",
"pixels": "Píxeis",
"play": "Reproduzir",
"poor": "Mau",
"powered-by": "Distribuído por {name}",
"preferences": "Preferências",
@@ -246,16 +247,16 @@
"referrers": "Referenciadores",
"refresh": "Atualizar",
"regenerate": "Regenerar",
"regex-match": "Corresponde à expressão regular",
"regex-not-match": "Não corresponde à expressão regular",
"region": "Região",
"regions": "Regiões",
"remaining": "Restante",
"remove": "Remover",
"remove-member": "Remover membro",
"play": "Reproduzir",
"replay": "Reprodução",
"replay-enabled": "Reprodução ativada",
"replay-id": "Replay ID",
"replay-code": "Código de repetição de sessão",
"replay-enabled": "Reprodução ativada",
"replays": "Reproduções",
"reports": "Relatórios",
"required": "Obrigatório",
@@ -268,21 +269,24 @@
"revenue-description": "Veja a sua receita ao longo do tempo.",
"role": "Função",
"run-query": "Executar consulta",
"sample-rate": "Taxa de amostragem",
"sample-size": "Tamanho da amostra",
"save": "Guardar",
"save-cohort": "Guardar coorte",
"save-replay": "Guardar repetição",
"save-segment": "Guardar segmento",
"sample-rate": "Taxa de amostragem",
"sample-size": "Tamanho da amostra",
"screen": "Ecrã",
"screens": "Ecrãs",
"search": "Pesquisar",
"segment": "Segmento",
"segments": "Segmentos",
"select": "Selecionar",
"select-component": "Selecionar componente",
"select-link": "Selecionar ligação",
"select-pixel": "Selecionar pixel",
"select-date": "Selecionar data",
"select-filter": "Selecionar filtro",
"select-role": "Selecionar função",
"select-component": "Selecionar componente",
"select-website": "Selecionar website",
"session": "Sessão",
"session-data": "Dados da sessão",
@@ -337,9 +341,15 @@
"unique": "Único",
"unique-events": "Eventos únicos",
"unique-visitors": "Visitantes únicos",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clientes únicos",
"customers": "Clientes",
"orders": "Encomendas",
"saved": "Guardado",
"unknown": "Desconhecido",
"untitled": "Sem título",
"upgrade": "Atualizar",
"update": "Atualizar",
"url": "URL",
"user": "Utilizador",
@@ -379,8 +389,8 @@
"confirm-reset": "Tem a certeza que pretende restaurar as estatísticas de {target}?",
"delete-team-warning": "Eliminar uma equipa também elimina todos os websites da equipa.",
"delete-website-warning": "Todos os dados associados também serão eliminados.",
"empty-dashboard": "O seu painel está vazio. Clique em Editar para adicionar o seu primeiro componente.",
"error": "Ocorreu um erro.",
"empty-dashboard": "O seu painel está vazio. Clique em Editar para adicionar o seu primeiro componente.",
"event-log": "<b>{event}</b> em <a>{url}</a>",
"forbidden": "Proibido",
"go-to-settings": "Ir para as definições",
@@ -402,6 +412,7 @@
"reset-website": "Para repor este website, escreva {confirmation} na caixa abaixo para confirmar.",
"reset-website-warning": "Todas as estatísticas deste site serão eliminadas, mas o seu código de rastreamento permanecerá intacto.",
"saved": "Guardado com sucesso.",
"select-board-entity-first": "Selecione primeiro um website, pixel ou ligação.",
"select-component-preview": "Selecione um componente para pré-visualizar",
"select-website-first": "Selecione primeiro um site",
"sever-error": "Erro do servidor",
@@ -417,6 +428,7 @@
"unauthorized": "Não autorizado",
"user-deleted": "Utilizador eliminado.",
"viewed-page": "Página visualizada",
"upgrade-required": "Esta funcionalidade requer uma subscrição do plano {plan}.",
"visitor-log": "Visitante de <b>{country}</b> a usar <b>{browser}</b> no <b>{device}</b> <b>{os}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Pentru tot timpul",
"analysis": "Analiză",
"analytics": "Analiză",
"aov": "AOV",
"application": "Aplicație",
"apply": "Aplică",
"arpu": "ARPU",
"attribution": "Atribuire",
"attribution-description": "Vezi cum utilizatorii interacționează cu marketingul tău și ce determină conversiile.",
"audience": "Audiență",
@@ -33,6 +31,7 @@
"behavior": "Comportament",
"block-selector": "Selector de bloc",
"boards": "Panouri",
"board-type": "Tip de tablou",
"bounce-rate": "Rata de respingere",
"breakdown": "Detaliat",
"browser": "Browser",
@@ -55,6 +54,8 @@
"confirm": "Confirmă",
"confirm-password": "Confirmare parolă",
"contains": "Conține",
"regex-match": "Se potrivește cu expresia regulată",
"regex-not-match": "Nu se potrivește cu expresia regulată",
"content": "Conținut",
"continue": "Continuă",
"conversion": "Conversie",
@@ -131,8 +132,8 @@
"funnels": "Parcursuri",
"goal": "Obiectiv",
"goals": "Obiective",
"goals-description": "Urmărește obiectivele de vizualizări și evenimente.",
"good": "Bun",
"goals-description": "Urmărește obiectivele de vizualizări și evenimente.",
"greater-than": "Mai mare decât",
"greater-than-equals": "Mai mare sau egal cu",
"grouped": "Grupat",
@@ -140,10 +141,10 @@
"hostname": "Nume gazdă",
"hour": "Oră",
"includes": "Include",
"inp": "INP",
"insight": "Perspectivă",
"insights": "Perspective",
"insights-description": "Aprofundează datele utilizând segmente și filtre.",
"inp": "INP",
"invalid-url": "URL invalid",
"is": "Este",
"is-false": "Este fals",
@@ -177,11 +178,11 @@
"manage": "Administrează",
"manager": "Manager",
"mask-level": "Nivel mască",
"max": "Max",
"max-duration": "Durată maximă",
"match": "Potrivire",
"match-all": "Toate",
"match-any": "Oricare",
"max": "Max",
"max-duration": "Durată maximă",
"maximize": "Extinde",
"medium": "Mediu",
"member": "Membru",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {înregistrare} other {înregistrări}}",
"ok": "OK",
"online": "Online",
"open": "Mixt",
"organic-search": "Căutare organică",
"organic-shopping": "Cumpărături organice",
"organic-social": "Social organic",
@@ -212,8 +214,8 @@
"page": "Pagină",
"page-of": "Pagina {current} din {total}",
"page-views": "Vizualizări de pagină",
"pages": "Pagini",
"pageTitle": "Titlul paginii",
"pages": "Pagini",
"paid-ads": "Reclame plătite",
"paid-search": "Căutare plătită",
"paid-shopping": "Cumpărături plătite",
@@ -225,7 +227,6 @@
"performance": "Performanță",
"pixel": "Pixel",
"pixels": "Pixeli",
"play": "Redă",
"poor": "Slab",
"powered-by": "Cu sprijinul {name}",
"preferences": "Preferințe",
@@ -246,16 +247,16 @@
"referrers": "Site-uri de proveniență",
"refresh": "Reîmprospătare",
"regenerate": "Regenerează",
"regex-match": "Se potrivește cu expresia regulată",
"regex-not-match": "Nu se potrivește cu expresia regulată",
"region": "Regiune",
"regions": "Regiuni",
"remaining": "Rămas",
"remove": "Îndepărtează",
"remove-member": "Îndepărtează membru",
"play": "Redă",
"replay": "Reluare",
"replay-enabled": "Reluare activată",
"replay-id": "Replay ID",
"replay-code": "Cod de reluare sesiune",
"replay-enabled": "Reluare activată",
"replays": "Reluări",
"reports": "Rapoarte",
"required": "Obligatoriu",
@@ -268,21 +269,24 @@
"revenue-description": "Urmărește venitul în timp.",
"role": "Rol",
"run-query": "Execută interogarea",
"sample-rate": "Rată de eșantionare",
"sample-size": "Dimensiunea eșantionului",
"save": "Salvează",
"save-cohort": "Salvează cohorta",
"save-replay": "Salvează reluarea",
"save-segment": "Salvează segmentul",
"sample-rate": "Rată de eșantionare",
"sample-size": "Dimensiunea eșantionului",
"screen": "Ecran",
"screens": "Ecrane",
"search": "Căutare",
"segment": "Segment",
"segments": "Segmente",
"select": "Selectează",
"select-component": "Selectați componenta",
"select-link": "Selectează link",
"select-pixel": "Selectează pixel",
"select-date": "Selectează data",
"select-filter": "Selectează filtru",
"select-role": "Selectează rolul",
"select-component": "Selectați componenta",
"select-website": "Selectează website",
"session": "Sesiune",
"session-data": "Date sesiune",
@@ -337,9 +341,15 @@
"unique": "Unici",
"unique-events": "Evenimente unice",
"unique-visitors": "Vizitatori unici",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Clienți unici",
"customers": "Clienți",
"orders": "Comenzi",
"saved": "Salvat",
"unknown": "Necunoscut",
"untitled": "Fără titlu",
"upgrade": "Actualizează",
"update": "Actualizează",
"url": "URL",
"user": "Utilizator",
@@ -379,8 +389,8 @@
"confirm-reset": "Ești sigur că vrei să resetezi statisticile pentru {target}?",
"delete-team-warning": "Ștergerea unei echipe va șterge și toate website-urile echipei.",
"delete-website-warning": "Toate datele asociate vor fi șterse, de asemenea.",
"empty-dashboard": "Tabloul de bord este gol. Faceți clic pe Editare pentru a adăuga primul component.",
"error": "Ceva n-a mers bine.",
"empty-dashboard": "Tabloul de bord este gol. Faceți clic pe Editare pentru a adăuga primul component.",
"event-log": "<b>{event}</b> la <a>{url}</a>",
"forbidden": "Interzis",
"go-to-settings": "Mergi la Setări",
@@ -402,6 +412,7 @@
"reset-website": "Pentru a reseta acest website, scrie {confirmation} În câmpul de mai jos pentru a confirma.",
"reset-website-warning": "Toate statisticile pentru acest site web vor fi șterse, dar codul de urmărire va rămâne intact.",
"saved": "Salvat cu succes.",
"select-board-entity-first": "Selectați mai întâi un site web, pixel sau link.",
"select-component-preview": "Selectați o componentă pentru previzualizare",
"select-website-first": "Selectați mai întâi un site web",
"sever-error": "Eroare de server",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizat",
"user-deleted": "Utilizator șters.",
"viewed-page": "Pagină vizualizată",
"upgrade-required": "Această funcție necesită un abonament {plan}.",
"visitor-log": "Vizitator din <b>{country}</b> folosind <b>{browser}</b> pe <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Celý čas",
"analysis": "Analýza",
"analytics": "Analytika",
"aov": "AOV",
"application": "Aplikácia",
"apply": "Použiť",
"arpu": "ARPU",
"attribution": "Priradenie",
"attribution-description": "Pozrite sa, ako používatelia interagujú s vaším marketingom a čo vedie ku konverziám.",
"audience": "Publikum",
@@ -33,6 +31,7 @@
"behavior": "Správanie",
"block-selector": "Výber bloku",
"boards": "Tabule",
"board-type": "Typ nástenky",
"bounce-rate": "Okamžité opustenie",
"breakdown": "Rozpis",
"browser": "Prehliadač",
@@ -55,6 +54,8 @@
"confirm": "Potvrdiť",
"confirm-password": "Potvrdiť heslo",
"contains": "Obsahuje",
"regex-match": "Zodpovedá regulárnemu výrazu",
"regex-not-match": "Nezodpovedá regulárnemu výrazu",
"content": "Obsah",
"continue": "Pokračovať",
"conversion": "Konverzia",
@@ -131,8 +132,8 @@
"funnels": "Lieviky",
"goal": "Cieľ",
"goals": "Ciele",
"goals-description": "Sledujte svoje ciele pre zobrazenia stránok a udalosti.",
"good": "Dobré",
"goals-description": "Sledujte svoje ciele pre zobrazenia stránok a udalosti.",
"greater-than": "Väčšie ako",
"greater-than-equals": "Väčšie alebo rovné",
"grouped": "Zoskupené",
@@ -140,10 +141,10 @@
"hostname": "Názov hostiteľa",
"hour": "Hodina",
"includes": "Zahŕňa",
"inp": "INP",
"insight": "Prehľad",
"insights": "Prehľady",
"insights-description": "Ponorte sa hlbšie do vašich dát pomocou segmentov a filtrov.",
"inp": "INP",
"invalid-url": "Neplatná URL",
"is": "Je",
"is-false": "Je nepravda",
@@ -177,11 +178,11 @@
"manage": "Spravovať",
"manager": "Manažér",
"mask-level": "Úroveň masky",
"max": "Maximum",
"max-duration": "Maximálne trvanie",
"match": "Zhoda",
"match-all": "Všetky",
"match-any": "Akýkoľvek",
"max": "Maximum",
"max-duration": "Maximálne trvanie",
"maximize": "Rozbaliť",
"medium": "Stredný",
"member": "Člen",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {záznam} few {záznamy} other {záznamov}}",
"ok": "OK",
"online": "Online",
"open": "Zmiešaný",
"organic-search": "Organické vyhľadávanie",
"organic-shopping": "Organické nakupovanie",
"organic-social": "Organické sociálne siete",
@@ -212,8 +214,8 @@
"page": "Stránka",
"page-of": "Strana {current} z {total}",
"page-views": "Zobrazenie stánok",
"pages": "Stránky",
"pageTitle": "Názov stránky",
"pages": "Stránky",
"paid-ads": "Platené reklamy",
"paid-search": "Platené vyhľadávanie",
"paid-shopping": "Platené nakupovanie",
@@ -225,7 +227,6 @@
"performance": "Výkon",
"pixel": "Pixel",
"pixels": "Pixely",
"play": "Prehrať",
"poor": "Zlé",
"powered-by": "Poskytuje {name}",
"preferences": "Predvoľby",
@@ -246,16 +247,16 @@
"referrers": "Odkazy",
"refresh": "Obnoviť",
"regenerate": "Regenerovať",
"regex-match": "Zodpovedá regulárnemu výrazu",
"regex-not-match": "Nezodpovedá regulárnemu výrazu",
"region": "Región",
"regions": "Regióny",
"remaining": "Zostáva",
"remove": "Odstrániť",
"remove-member": "Odstrániť člena",
"play": "Prehrať",
"replay": "Prehrávanie",
"replay-enabled": "Prehrávanie povolené",
"replay-id": "Replay ID",
"replay-code": "Kód prehrania relácie",
"replay-enabled": "Prehrávanie povolené",
"replays": "Prehrávanie",
"reports": "Správy",
"required": "Povinné",
@@ -268,21 +269,24 @@
"revenue-description": "Pozrite si svoj príjem v priebehu času.",
"role": "Rola",
"run-query": "Spustiť dotaz",
"sample-rate": "Frekvencia vzorkovania",
"sample-size": "Veľkosť vzorky",
"save": "Uložiť",
"save-cohort": "Uložiť kohortu",
"save-replay": "Uložiť prehranie",
"save-segment": "Uložiť segment",
"sample-rate": "Frekvencia vzorkovania",
"sample-size": "Veľkosť vzorky",
"screen": "Obrazovka",
"screens": "Obrazovky",
"search": "Hľadať",
"segment": "Segment",
"segments": "Segmenty",
"select": "Vybrať",
"select-component": "Vyberte komponent",
"select-link": "Vybrať odkaz",
"select-pixel": "Vybrať pixel",
"select-date": "Vybrať dátum",
"select-filter": "Vybrať filter",
"select-role": "Vybrať rolu",
"select-component": "Vyberte komponent",
"select-website": "Vybrať web",
"session": "Sedenie",
"session-data": "Dáta sedenia",
@@ -337,9 +341,15 @@
"unique": "Unikátny",
"unique-events": "Unikátne udalosti",
"unique-visitors": "Jedinečné návštevy",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unikátni zákazníci",
"customers": "Zákazníci",
"orders": "Objednávky",
"saved": "Uložené",
"unknown": "Neznámý",
"untitled": "Bez názvu",
"upgrade": "Inovovať",
"update": "Aktualizovať",
"url": "URL",
"user": "Používateľ",
@@ -379,8 +389,8 @@
"confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"delete-team-warning": "Vymazanie tímu vymaže aj všetky weby tímu.",
"delete-website-warning": "Všetky príbuzné data budu tiež zmazané.",
"empty-dashboard": "Váš dashboard je prázdny. Kliknite na Upraviť a pridajte prvý komponent.",
"error": "Niečo sa pokazilo.",
"empty-dashboard": "Váš dashboard je prázdny. Kliknite na Upraviť a pridajte prvý komponent.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Zakázané",
"go-to-settings": "Ísť do nastavení",
@@ -402,6 +412,7 @@
"reset-website": "Na resetovanie tohto webu zadajte {confirmation} do poľa nižšie.",
"reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
"saved": "Úspešne uložené.",
"select-board-entity-first": "Najprv vyberte webovú stránku, pixel alebo odkaz.",
"select-component-preview": "Vyberte komponent na náhľad",
"select-website-first": "Najprv vyberte webovú stránku",
"sever-error": "Chyba servera",
@@ -417,6 +428,7 @@
"unauthorized": "Neautorizované",
"user-deleted": "Používateľ vymazaný.",
"viewed-page": "Zobrazená stránka",
"upgrade-required": "Táto funkcia vyžaduje predplatné plánu {plan}.",
"visitor-log": "Návštevník z <b>{country}</b> s prehliadačom <b>{browser}</b> na <b>{os}</b> <b>{device}</b>"
}
}
+31 -19
View File
@@ -20,10 +20,8 @@
"all-time": "Ves čas",
"analysis": "Analiza",
"analytics": "Analitika",
"aov": "AOV",
"application": "Aplikacija",
"apply": "Uporabi",
"arpu": "ARPU",
"attribution": "Pripis",
"attribution-description": "Oglejte si, kako uporabniki sodelujejo z vašim marketingom in kaj spodbuja konverzije.",
"audience": "Občinstvo",
@@ -33,6 +31,7 @@
"behavior": "Obnašanje",
"block-selector": "Izbirnik blokov",
"boards": "Table",
"board-type": "Vrsta plošče",
"bounce-rate": "Odbojna stopnja",
"breakdown": "Razčlenitev",
"browser": "Brskalnik",
@@ -55,6 +54,8 @@
"confirm": "Potrdi",
"confirm-password": "Potrdi geslo",
"contains": "Vsebuje",
"regex-match": "Ustreza regularnemu izrazu",
"regex-not-match": "Ne ustreza regularnemu izrazu",
"content": "Vsebina",
"continue": "Nadaljuj",
"conversion": "Konverzija",
@@ -131,21 +132,19 @@
"funnels": "Prodajni lijaki",
"goal": "Cilj",
"goals": "Cilji",
"goals-description": "Spremljajte svoje cilje za oglede strani in dogodke.",
"good": "Dobro",
"goals-description": "Spremljajte svoje cilje za oglede strani in dogodke.",
"greater-than": "Večje od",
"greater-than-equals": "Večje ali enako kot",
"grouped": "Združeno",
"growth": "Rast",
"host": "Gostitelj",
"hostname": "Ime gostitelja",
"hosts": "Gostitelji",
"hour": "Ura",
"includes": "Vključuje",
"inp": "INP",
"insight": "Vpogled",
"insights": "Vpogled",
"insights-description": "Poglobite se v podatke z uporabo segmentov in filtrov.",
"inp": "INP",
"invalid-url": "Neveljaven URL",
"is": "Je",
"is-false": "Je napačno",
@@ -179,11 +178,11 @@
"manage": "Upravljaj",
"manager": "Upravitelj",
"mask-level": "Raven maske",
"max": "Največ",
"max-duration": "Največje trajanje",
"match": "Ujemanje",
"match-all": "Vse",
"match-any": "Katero koli",
"max": "Največ",
"max-duration": "Največje trajanje",
"maximize": "Povečaj",
"medium": "Medij",
"member": "Član",
@@ -203,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {zapis} two {zapisa} few {zapisi} other {zapisov}}",
"ok": "V redu",
"online": "Na spletu",
"open": "Mešano",
"organic-search": "Organsko iskanje",
"organic-shopping": "Organski nakupi",
"organic-social": "Organska družbena omrežja",
@@ -214,8 +214,8 @@
"page": "Stran",
"page-of": "Stran {current} od {total}",
"page-views": "Obiski strani",
"pages": "Strani",
"pageTitle": "Naslov strani",
"pages": "Strani",
"paid-ads": "Plačani oglasi",
"paid-search": "Plačano iskanje",
"paid-shopping": "Plačani nakupi",
@@ -227,7 +227,6 @@
"performance": "Zmogljivost",
"pixel": "Piksel",
"pixels": "Piksli",
"play": "Predvajaj",
"poor": "Slabo",
"powered-by": "Poganja {name}",
"preferences": "Nastavitve",
@@ -248,16 +247,16 @@
"referrers": "Viri",
"refresh": "Osveži",
"regenerate": "Ponovno generiraj",
"regex-match": "Ustreza regularnemu izrazu",
"regex-not-match": "Ne ustreza regularnemu izrazu",
"region": "Regija",
"regions": "Regije",
"remaining": "Preostalo",
"remove": "Odstrani",
"remove-member": "Odstrani člana",
"play": "Predvajaj",
"replay": "Predvajanje",
"replay-enabled": "Predvajanje omogočeno",
"replay-id": "Replay ID",
"replay-code": "Koda ponovitve seje",
"replay-enabled": "Predvajanje omogočeno",
"replays": "Predvajanja",
"reports": "Poročila",
"required": "Zahtevano",
@@ -268,24 +267,26 @@
"retention-description": "Merite uporabnikovo zadržanost s sledenjem, kako pogosto se vračajo.",
"revenue": "Prihodki",
"revenue-description": "Preglejte svoje prihodke skozi čas.",
"revenue-property": "Lastnost prihodkov",
"role": "Vloga",
"run-query": "Izvedi poizvedbo",
"sample-rate": "Hitrost vzorčenja",
"sample-size": "Velikost vzorca",
"save": "Shrani",
"save-cohort": "Shrani kohorto",
"save-replay": "Shrani ponovitev",
"save-segment": "Shrani segment",
"sample-rate": "Hitrost vzorčenja",
"sample-size": "Velikost vzorca",
"screen": "Zaslon",
"screens": "Zasloni",
"search": "Išči",
"segment": "Segment",
"segments": "Segmenti",
"select": "Izberi",
"select-component": "Izberite komponento",
"select-link": "Izberi povezavo",
"select-pixel": "Izberi piksel",
"select-date": "Izberi datum",
"select-filter": "Izberi filter",
"select-role": "Izberi vlogo",
"select-component": "Izberite komponento",
"select-website": "Izberi spletno mesto",
"session": "Seja",
"session-data": "Podatki seje",
@@ -340,9 +341,15 @@
"unique": "Unikatni",
"unique-events": "Edinstveni dogodki",
"unique-visitors": "Unikatni obiskovalci",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Edinstvene stranke",
"customers": "Stranke",
"orders": "Naročila",
"saved": "Shranjeno",
"unknown": "Neznano",
"untitled": "Brez naslova",
"upgrade": "Nadgradi",
"update": "Posodobi",
"url": "URL",
"user": "Uporabnik",
@@ -369,7 +376,10 @@
"website-id": "ID spletnega mesta",
"websites": "Spletna mesta",
"window": "Okno",
"yesterday": "Včeraj"
"yesterday": "Včeraj",
"host": "Gostitelj",
"hosts": "Gostitelji",
"revenue-property": "Lastnost prihodkov"
},
"message": {
"action-confirmation": "Za potrditev v spodnje polje vnesite {confirmation}.",
@@ -382,8 +392,8 @@
"confirm-reset": "Ste prepričani, da želite ponastaviti statistiko {target}?",
"delete-team-warning": "Brisanje ekipe bo izbrisalo tudi vsa spletna mesta ekipe.",
"delete-website-warning": "Izbrisani bodo tudi vsi pripadajoči podatki.",
"empty-dashboard": "Vaša nadzorna plošča je prazna. Kliknite Uredi, da dodate svojo prvo komponento.",
"error": "Nekaj je šlo narobe.",
"empty-dashboard": "Vaša nadzorna plošča je prazna. Kliknite Uredi, da dodate svojo prvo komponento.",
"event-log": "<b>{event}</b> na <a>{url}</a>",
"forbidden": "Prepovedano",
"go-to-settings": "Pojdi v nastavitve",
@@ -405,6 +415,7 @@
"reset-website": "Za ponastavitev izbrisa tega spletnega mesta vnesite {confirmation} v spodnje polje.",
"reset-website-warning": "Vse statistike za to spletno mesto bodo izbrisane, koda za sledenje pa bo ostala nespremenjena.",
"saved": "Uspešno shranjeno.",
"select-board-entity-first": "Najprej izberite spletno mesto, piksel ali povezavo.",
"select-component-preview": "Izberite komponento za predogled",
"select-website-first": "Najprej izberite spletno mesto",
"sever-error": "Napaka strežnika",
@@ -420,6 +431,7 @@
"unauthorized": "Nepooblaščen dostop",
"user-deleted": "Uporabnik je izbrisan.",
"viewed-page": "Ogledana stran",
"upgrade-required": "Ta funkcija zahteva naročnino na paket {plan}.",
"visitor-log": "Obiskovalec iz <b>{country}</b> uporablja <b>{browser}</b> na <b>{os}</b> <b>{device}</b>",
"visitors-dropped-off": "Osip obiskovalcev"
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Sedan början",
"analysis": "Analys",
"analytics": "Webbplats Analys",
"aov": "AOV",
"application": "Applikation",
"apply": "Tillämpa",
"arpu": "ARPU",
"attribution": "Attribuering",
"attribution-description": "Se hur användare interagerar med din marknadsföring och vad som driver konverteringar.",
"audience": "Publik",
@@ -33,6 +31,7 @@
"behavior": "Beteende",
"block-selector": "Blockväljare",
"boards": "Anslagstavlor",
"board-type": "Typ av tavla",
"bounce-rate": "Avvisningsfrekvens",
"breakdown": "Analys",
"browser": "Webbläsare",
@@ -55,6 +54,8 @@
"confirm": "Bekräfta",
"confirm-password": "Bekräfta lösenord",
"contains": "Innehåller",
"regex-match": "Matchar reguljärt uttryck",
"regex-not-match": "Matchar inte reguljärt uttryck",
"content": "Innehåll",
"continue": "Fortsätt",
"conversion": "Konvertering",
@@ -131,8 +132,8 @@
"funnels": "Trattar",
"goal": "Mål",
"goals": "Mål",
"goals-description": "Följ dina mål för sidvisningar och händelser.",
"good": "Bra",
"goals-description": "Följ dina mål för sidvisningar och händelser.",
"greater-than": "Större än",
"greater-than-equals": "Större än eller lika med",
"grouped": "Grupperad",
@@ -140,10 +141,10 @@
"hostname": "Värdnamn",
"hour": "Timme",
"includes": "Inkluderar",
"inp": "INP",
"insight": "Insikt",
"insights": "Insikter",
"insights-description": "Dyk djupare in i din data genom att använda olika segment och filter.",
"inp": "INP",
"invalid-url": "Ogiltig URL",
"is": "Är",
"is-false": "Är falskt",
@@ -177,11 +178,11 @@
"manage": "Hantera",
"manager": "Ansvarig",
"mask-level": "Masknivå",
"max": "Max",
"max-duration": "Maximal varaktighet",
"match": "Matchning",
"match-all": "Alla",
"match-any": "Vilken som helst",
"max": "Max",
"max-duration": "Maximal varaktighet",
"maximize": "Expandera",
"medium": "Medium",
"member": "Medlem",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {post} other {poster}}",
"ok": "OK",
"online": "Online",
"open": "Blandad",
"organic-search": "Organisk sökning",
"organic-shopping": "Organisk shopping",
"organic-social": "Organisk social",
@@ -212,8 +214,8 @@
"page": "Sida",
"page-of": "Sida {current} av {total}",
"page-views": "Sidvisningar",
"pages": "Sidor",
"pageTitle": "Sidtitel",
"pages": "Sidor",
"paid-ads": "Betalda annonser",
"paid-search": "Betald sökning",
"paid-shopping": "Betald shopping",
@@ -225,7 +227,6 @@
"performance": "Prestanda",
"pixel": "Pixel",
"pixels": "Pixlar",
"play": "Spela upp",
"poor": "Dålig",
"powered-by": "Drivs av {name}",
"preferences": "Inställningar",
@@ -246,16 +247,16 @@
"referrers": "Hänvisare",
"refresh": "Uppdatera",
"regenerate": "Förnya",
"regex-match": "Matchar reguljärt uttryck",
"regex-not-match": "Matchar inte reguljärt uttryck",
"region": "Region",
"regions": "Regioner",
"remaining": "Återstår",
"remove": "Ta bort",
"remove-member": "Ta bort medlem",
"play": "Spela upp",
"replay": "Uppspelning",
"replay-enabled": "Uppspelning aktiverad",
"replay-id": "Replay ID",
"replay-code": "Kod för sessionsuppspelning",
"replay-enabled": "Uppspelning aktiverad",
"replays": "Uppspelningar",
"reports": "Rapporter",
"required": "Krävs",
@@ -268,21 +269,24 @@
"revenue-description": "Se dina intäkter över tid.",
"role": "Roll",
"run-query": "Kör sökning",
"sample-rate": "Samplingshastighet",
"sample-size": "Urvalsstorlek",
"save": "Spara",
"save-cohort": "Spara kohort",
"save-replay": "Spara uppspelning",
"save-segment": "Spara segment",
"sample-rate": "Samplingshastighet",
"sample-size": "Urvalsstorlek",
"screen": "Skärm",
"screens": "Upplösning",
"search": "Sök",
"segment": "Segment",
"segments": "Segment",
"select": "Välj",
"select-component": "Välj komponent",
"select-link": "Välj länk",
"select-pixel": "Välj pixel",
"select-date": "Välj datum",
"select-filter": "Välj filter",
"select-role": "Välj roll",
"select-component": "Välj komponent",
"select-website": "Välj webbplats",
"session": "Session",
"session-data": "Sessionsdata",
@@ -337,9 +341,15 @@
"unique": "Unikt",
"unique-events": "Unika händelser",
"unique-visitors": "Unika besökare",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Unika kunder",
"customers": "Kunder",
"orders": "Beställningar",
"saved": "Sparad",
"unknown": "Okänt",
"untitled": "Namnlös",
"upgrade": "Uppgradera",
"update": "Uppdatera",
"url": "URL",
"user": "Användare",
@@ -379,8 +389,8 @@
"confirm-reset": "Är du säker på att du vill återställa statistiken för {target}?",
"delete-team-warning": "Att radera ett team raderar även alla teamets webbplatser.",
"delete-website-warning": "All tillhörande data kommer också att raderas.",
"empty-dashboard": "Din instrumentpanel är tom. Klicka på Redigera för att lägga till din första komponent.",
"error": "Något gick fel.",
"empty-dashboard": "Din instrumentpanel är tom. Klicka på Redigera för att lägga till din första komponent.",
"event-log": "<b>{event}</b> på <a>{url}</a>",
"forbidden": "Förbjudet",
"go-to-settings": "Gå till inställningar",
@@ -402,6 +412,7 @@
"reset-website": "För att återställa webbplatsen, skriv {confirmation} i rutan nedan.",
"reset-website-warning": "All statistik för webbplatsen tas bort, men spårningskoden förblir oförändrad.",
"saved": "Sparat!",
"select-board-entity-first": "Välj först en webbplats, pixel eller länk.",
"select-component-preview": "Välj en komponent för att förhandsgranska",
"select-website-first": "Välj en webbplats först",
"sever-error": "Serverfel",
@@ -417,6 +428,7 @@
"unauthorized": "Inte auktoriserad",
"user-deleted": "Användaren har raderats.",
"viewed-page": "Visad sida",
"upgrade-required": "Den här funktionen kräver en {plan}-prenumeration.",
"visitor-log": "Besökare från <b>{country}</b> med <b>{browser}</b> på <b>{os}</b> <b>{device}</b>"
}
}
+27 -15
View File
@@ -20,10 +20,8 @@
"all-time": "Tüm zamanlar",
"analysis": "Analiz",
"analytics": "Analitik",
"aov": "AOV",
"application": "Uygulama",
"apply": "Uygula",
"arpu": "ARPU",
"attribution": "Atıf",
"attribution-description": "Kullanıcıların pazarlamanızla nasıl etkileşime girdiğini ve dönüşümleri neyin tetiklediğini görün.",
"audience": "Kitle",
@@ -33,6 +31,7 @@
"behavior": "Davranış",
"block-selector": "Blok seçici",
"boards": "Panolar",
"board-type": "Pano türü",
"bounce-rate": "Tek sayfa ziyaret oranı",
"breakdown": "Dağılım",
"browser": "Tarayıcı",
@@ -55,6 +54,8 @@
"confirm": "Onayla",
"confirm-password": "Parolayı onayla",
"contains": "İçeriği",
"regex-match": "Düzenli ifadeyle eşleşir",
"regex-not-match": "Düzenli ifadeyle eşleşmez",
"content": "İçerik",
"continue": "Devam et",
"conversion": "Dönüşüm",
@@ -131,8 +132,8 @@
"funnels": "Huniler",
"goal": "Hedef",
"goals": "Hedefler",
"goals-description": "Sayfa görüntüleme ve olaylar için hedeflerinizi takip edin.",
"good": "İyi",
"goals-description": "Sayfa görüntüleme ve olaylar için hedeflerinizi takip edin.",
"greater-than": "Büyüktür",
"greater-than-equals": "Büyük veya eşittir",
"grouped": "Gruplandırılmış",
@@ -140,10 +141,10 @@
"hostname": "Sunucu adı",
"hour": "Saat",
"includes": "İçerir",
"inp": "INP",
"insight": "İçgörü",
"insights": "İçgörüler",
"insights-description": "Segmentleri ve filtreleri kullanarak verilerinizi derinlemesine inceleyin.",
"inp": "INP",
"invalid-url": "Geçersiz URL",
"is": "Eşittir",
"is-false": "Yanlış",
@@ -177,11 +178,11 @@
"manage": "Yönet",
"manager": "Yönetici",
"mask-level": "Maske seviyesi",
"max": "Maks",
"max-duration": "Maksimum süre",
"match": "Eşleşme",
"match-all": "Tümü",
"match-any": "Herhangi",
"max": "Maks",
"max-duration": "Maksimum süre",
"maximize": "Genişlet",
"medium": "Orta",
"member": "Üye",
@@ -201,6 +202,7 @@
"number-of-records": "{x} {x, plural, one {kayıt} other {kayıt}}",
"ok": "TAMAM",
"online": "Çevrimiçi",
"open": "Karışık",
"organic-search": "Organik arama",
"organic-shopping": "Organik alışveriş",
"organic-social": "Organik sosyal",
@@ -212,8 +214,8 @@
"page": "Sayfa",
"page-of": "{total} sayfada {current} ",
"page-views": "Sayfa görünümü",
"pages": "Sayfalar",
"pageTitle": "Sayfa başlığı",
"pages": "Sayfalar",
"paid-ads": "Ücretli reklamlar",
"paid-search": "Ücretli arama",
"paid-shopping": "Ücretli alışveriş",
@@ -225,7 +227,6 @@
"performance": "Performans",
"pixel": "Piksel",
"pixels": "Pikseller",
"play": "Oynat",
"poor": "Kötü",
"powered-by": "Sağlayıcı: {name}",
"preferences": "Tercihler",
@@ -246,16 +247,16 @@
"referrers": "Yönlendirenler",
"refresh": "Yenile",
"regenerate": "Yeniden Oluştur",
"regex-match": "Düzenli ifadeyle eşleşir",
"regex-not-match": "Düzenli ifadeyle eşleşmez",
"region": "Bölge",
"regions": "Bölgeler",
"remaining": "Kalan",
"remove": "Kaldır",
"remove-member": "Üyeyi kaldır",
"play": "Oynat",
"replay": "Tekrar oynatma",
"replay-enabled": "Tekrar oynatma etkin",
"replay-id": "Replay ID",
"replay-code": "Oturum tekrar oynatma kodu",
"replay-enabled": "Tekrar oynatma etkin",
"replays": "Tekrar oynatmalar",
"reports": "Raporlar",
"required": "Zorunlu alan",
@@ -268,21 +269,24 @@
"revenue-description": "Gelirinizi zaman içinde inceleyin.",
"role": "Rol",
"run-query": "Sorgu çalıştır",
"sample-rate": "Örnekleme hızı",
"sample-size": "Örneklem boyutu",
"save": "Kaydet",
"save-cohort": "Kohortu kaydet",
"save-replay": "Tekrarı kaydet",
"save-segment": "Segmenti kaydet",
"sample-rate": "Örnekleme hızı",
"sample-size": "Örneklem boyutu",
"screen": "Ekran",
"screens": "Ekranlar",
"search": "Ara",
"segment": "Segment",
"segments": "Segmentler",
"select": "Seç",
"select-component": "Bileşen seçin",
"select-link": "Bağlantı seç",
"select-pixel": "Piksel seç",
"select-date": "Tarih seç",
"select-filter": "Filtre seç",
"select-role": "Rol seç",
"select-component": "Bileşen seçin",
"select-website": "Web sitesi seç",
"session": "Oturum",
"session-data": "Oturum verisi",
@@ -337,9 +341,15 @@
"unique": "Benzersiz",
"unique-events": "Benzersiz etkinlikler",
"unique-visitors": "Tekil kullanıcı",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Benzersiz müşteriler",
"customers": "Müşteriler",
"orders": "Siparişler",
"saved": "Kaydedildi",
"unknown": "Bilinmeyen",
"untitled": "İsimsiz",
"upgrade": "Yükselt",
"update": "Güncelle",
"url": "URL",
"user": "Kullanıcı",
@@ -379,8 +389,8 @@
"confirm-reset": "{target} istatistiklerini sıfırlamak istediğinizden emin misiniz?",
"delete-team-warning": "Bir takımı silmek tüm takım web sitelerini de silecektir.",
"delete-website-warning": "İlişkili tüm veriler de silinecektir.",
"empty-dashboard": "Gösterge paneliniz boş. İlk bileşeninizi eklemek için Düzenle'ye tıklayın.",
"error": "Bir şeyler ters gitti!",
"empty-dashboard": "Gösterge paneliniz boş. İlk bileşeninizi eklemek için Düzenle'ye tıklayın.",
"event-log": "<b>{event}</b> sayfasında <a>{url}</a>",
"forbidden": "Yasaklandı",
"go-to-settings": "Ayarlara git",
@@ -402,6 +412,7 @@
"reset-website": "Bu websitesini sıfılamak için aşağıdaki kutuya {confirmation} yazın.",
"reset-website-warning": "Bu web sitesi için tüm istatistikler silinecek, ancak izleme kodunuz bozulmadan kalacaktır.",
"saved": "Başarıyla kaydedildi.",
"select-board-entity-first": "Önce bir web sitesi, piksel veya bağlantı seçin.",
"select-component-preview": "Önizleme için bir bileşen seçin",
"select-website-first": "Önce bir web sitesi seçin",
"sever-error": "Sunucu hatası",
@@ -417,6 +428,7 @@
"unauthorized": "Yetkisiz",
"user-deleted": "Kullanıcı silindi.",
"viewed-page": "Görüntülenen sayfa",
"upgrade-required": "Bu özellik {plan} plan aboneliği gerektirir.",
"visitor-log": "Yeni ziyaretçi: <b>{country}</b>, <b>{os}</b>, <b>{device}</b>, <b>{browser}</b>"
}
}
+33 -21
View File
@@ -20,10 +20,8 @@
"all-time": "Barcha vaqtlar",
"analysis": "Tahlil",
"analytics": "Tahlil",
"aov": "AOV",
"application": "Ilova",
"apply": "Qoʻllash",
"arpu": "ARPU",
"attribution": "Atribusiya",
"attribution-description": "Foydalanuvchilar marketingingiz bilan qanday muloqot qilishlarini va konversiyalarni nimalar ragʻbatlantirganini koʻring.",
"audience": "Auditoriya",
@@ -33,6 +31,7 @@
"behavior": "Xulq-atvor",
"block-selector": "Blok tanlash",
"boards": "Taxtalar",
"board-type": "Taxta turi",
"bounce-rate": "Chiqib ketish darajasi",
"breakdown": "Tahlil",
"browser": "Brauzer",
@@ -55,6 +54,8 @@
"confirm": "Tasdiqlash",
"confirm-password": "Parolni tasdiqlash",
"contains": "Oʻz ichiga oladi",
"regex-match": "Muntazam ifodaga mos keladi",
"regex-not-match": "Muntazam ifodaga mos kelmaydi",
"content": "Kontent",
"continue": "Davom etish",
"conversion": "Konversiya",
@@ -131,21 +132,19 @@
"funnels": "Voronkalar",
"goal": "Maqsad",
"goals": "Maqsadlar",
"goals-description": "Sahifa koʻrishlari va hodisalar uchun maqsadlaringizni kuzatib boring.",
"good": "Yaxshi",
"goals-description": "Sahifa koʻrishlari va hodisalar uchun maqsadlaringizni kuzatib boring.",
"greater-than": "Kattaroq",
"greater-than-equals": "Kattaroq yoki teng",
"grouped": "Guruhlangan",
"growth": "O'sish",
"host": "Xost",
"hostname": "Xost nomi",
"hosts": "Xostlar",
"hour": "Soat",
"includes": "Oʻz ichiga oladi",
"inp": "INP",
"insight": "Tushuncha",
"insights": "Tushunchalar",
"insights-description": "Segmentlar va filtrlardan foydalanib ma'lumotlaringizga chuqurroq kiring.",
"inp": "INP",
"invalid-url": "Noto'g'ri URL",
"is": "Teng",
"is-false": "Yolgʻon",
@@ -179,11 +178,11 @@
"manage": "Boshqarish",
"manager": "Menejer",
"mask-level": "Niqob darajasi",
"max": "Maksimal",
"max-duration": "Maksimal davomiylik",
"match": "Moslik",
"match-all": "Barchasi",
"match-any": "Istalgan",
"max": "Maksimal",
"max-duration": "Maksimal davomiylik",
"maximize": "Kattalashtirish",
"medium": "Vosita",
"member": "A'zo",
@@ -203,6 +202,7 @@
"number-of-records": "{x} yozuv",
"ok": "OK",
"online": "Onlayn",
"open": "Aralash",
"organic-search": "Organik qidiruv",
"organic-shopping": "Organik xarid",
"organic-social": "Organik ijtimoiy",
@@ -214,8 +214,8 @@
"page": "Sahifa",
"page-of": "Sahifa {current} dan {total}",
"page-views": "Sahifa koʻrishlari",
"pages": "Sahifalar",
"pageTitle": "Sahifa sarlavhasi",
"pages": "Sahifalar",
"paid-ads": "Pullik reklamalar",
"paid-search": "Pullik qidiruv",
"paid-shopping": "Pullik xarid",
@@ -227,7 +227,6 @@
"performance": "Ishlash",
"pixel": "Piksel",
"pixels": "Piksellar",
"play": "Ijro etish",
"poor": "Yomon",
"powered-by": "{name} tomonidan quvvatlanadi",
"preferences": "Sozlamalar",
@@ -248,16 +247,16 @@
"referrers": "Tavsiya etuvchilar",
"refresh": "Yangilash",
"regenerate": "Qayta yaratish",
"regex-match": "Muntazam ifodaga mos keladi",
"regex-not-match": "Muntazam ifodaga mos kelmaydi",
"region": "Viloyat/Mintaqa",
"regions": "Viloyatlar/Mintaqalar",
"remaining": "Qolgan",
"remove": "Olib tashlash",
"remove-member": "A'zoni olib tashlash",
"play": "Ijro etish",
"replay": "Qayta ijro",
"replay-enabled": "Qayta ijro yoqilgan",
"replay-id": "Replay ID",
"replay-code": "Sessiya takrorlash kodi",
"replay-enabled": "Qayta ijro yoqilgan",
"replays": "Qayta ijrolar",
"reports": "Hisobotlar",
"required": "Majburiy",
@@ -268,24 +267,26 @@
"retention-description": "Foydalanuvchilarning qaytish chastotasini kuzatib, veb-saytingizning jozibadorligini oʻlchang.",
"revenue": "Daromad",
"revenue-description": "Vaqt oʻtishi bilan daromadingizni tekshiring.",
"revenue-property": "Daromad xususiyati",
"role": "Rol",
"run-query": "Soʻrovni ishga tushirish",
"sample-rate": "Namuna olish tezligi",
"sample-size": "Namuna hajmi",
"save": "Saqlash",
"save-cohort": "Kogortani saqlash",
"save-replay": "Takrorlashni saqlash",
"save-segment": "Segmentni saqlash",
"sample-rate": "Namuna olish tezligi",
"sample-size": "Namuna hajmi",
"screen": "Ekran",
"screens": "Ekranlar",
"search": "Qidiruv",
"segment": "Segment",
"segments": "Segmentlar",
"select": "Tanlash",
"select-component": "Komponent tanlash",
"select-link": "Havolani tanlash",
"select-pixel": "Pikselni tanlash",
"select-date": "Sanani tanlash",
"select-filter": "Filtrni tanlash",
"select-role": "Rolni tanlash",
"select-component": "Komponent tanlash",
"select-website": "Veb-saytni tanlash",
"session": "Sessiya",
"session-data": "Sessiya maʼlumotlari",
@@ -340,14 +341,18 @@
"unique": "Noyob",
"unique-events": "Noyob hodisalar",
"unique-visitors": "Noyob tashrif buyuruvchilar",
"aov": "AOV",
"arpu": "ARPU",
"uniqueCustomers": "Noyob mijozlar",
"customers": "Mijozlar",
"orders": "Buyurtmalar",
"saved": "Saqlandi",
"unknown": "Noma'lum",
"untitled": "Sarlavhasiz",
"upgrade": "Yangilash",
"update": "Yangilash",
"url": "URL",
"urls": "URL'lar",
"user": "Foydalanuvchi",
"user-property": "Foydalanuvchi xususiyati",
"username": "Foydalanuvchi nomi",
"users": "Foydalanuvchilar",
"utm": "UTM",
@@ -371,7 +376,12 @@
"website-id": "Veb-sayt ID'si",
"websites": "Veb-saytlar",
"window": "Oyna",
"yesterday": "Kecha"
"yesterday": "Kecha",
"host": "Xost",
"hosts": "Xostlar",
"revenue-property": "Daromad xususiyati",
"urls": "URL'lar",
"user-property": "Foydalanuvchi xususiyati"
},
"message": {
"action-confirmation": "Tasdiqlash uchun pastdagi qutiga **{confirmation}** yozing.",
@@ -384,8 +394,8 @@
"confirm-reset": "**{target}** ni qayta tiklamoqchi ekanligingizga ishonchingiz komilmi?",
"delete-team-warning": "Jamoani oʻchirish, shuningdek, barcha jamoa veb-saytlarini ham oʻchiradi.",
"delete-website-warning": "Barcha veb-sayt ma'lumotlari oʻchiriladi.",
"empty-dashboard": "Sizning boshqaruv panelingiz bo'sh. Birinchi komponentni qo'shish uchun Tahrirlash tugmasini bosing.",
"error": "Nimadir xato ketdi.",
"empty-dashboard": "Sizning boshqaruv panelingiz bo'sh. Birinchi komponentni qo'shish uchun Tahrirlash tugmasini bosing.",
"event-log": "**<a>{url}</a>** da **<b>{event}</b>** hodisasi",
"forbidden": "Taqiqlangan",
"go-to-settings": "Sozlamalarga oʻtish",
@@ -407,6 +417,7 @@
"reset-website": "Bu veb-saytni qayta tiklash uchun tasdiqlash uchun pastdagi qutiga **{confirmation}** yozing.",
"reset-website-warning": "Bu veb-sayt uchun barcha statistik ma'lumotlar oʻchiriladi, lekin sozlamalaringiz saqlanib qoladi.",
"saved": "Saqlandi.",
"select-board-entity-first": "Avval veb-sayt, piksel yoki havolani tanlang.",
"select-component-preview": "Ko'rib chiqish uchun komponent tanlang",
"select-website-first": "Avval veb-sayt tanlang",
"sever-error": "Server xatosi",
@@ -422,6 +433,7 @@
"unauthorized": "Ruxsatsiz",
"user-deleted": "Foydalanuvchi oʻchirildi.",
"viewed-page": "Sahifa koʻrildi",
"upgrade-required": "Bu xususiyat {plan} tarif obunasini talab qiladi.",
"visitor-log": "<b>{os}</b> <b>{device}</b> da <b>{browser}</b> dan foydalanayotgan <b>{country}</b> dan tashrif buyuruvchi",
"visitors-dropped-off": "Tashrif buyuruvchilar tashlab ketishdi"
}
+3
View File
@@ -18,6 +18,9 @@ export function BoardsTable(props: DataTableProps) {
}}
</DataColumn>
<DataColumn id="description" label={t(labels.description)} />
<DataColumn id="type" label={t(labels.boardType)}>
{({ type }: any) => type ? type.charAt(0).toUpperCase() + type.slice(1) : ''}
</DataColumn>
<DataColumn id="created" label={t(labels.created)} width="200px">
{(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn>
@@ -110,8 +110,8 @@ export function BoardEditBody({ requiresBoardWebsite = true }: { requiresBoardWe
const minHeight = (rows.length || 1) * MAX_ROW_HEIGHT + BUTTON_ROW_HEIGHT;
return (
<Box minHeight={`${minHeight}px`}>
<Group groupRef={rowGroupRef} orientation="vertical">
<Box>
<Group style={{ minHeight: `${minHeight}px` }} groupRef={rowGroupRef} orientation="vertical">
{rows.map((row, index) => (
<Fragment key={`${row.id}:${row.size ?? 'auto'}`}>
<Panel
@@ -33,7 +33,7 @@ export function LanguageSetting() {
allowSearch
onSearch={setSearch}
onOpenChange={handleOpen}
listProps={{ style: { maxHeight: 300 } }}
maxHeight={480}
style={{ minWidth: '250px' }}
>
{items.map(item => (
@@ -29,7 +29,7 @@ export function TimezoneSetting() {
allowSearch={true}
onSearch={setSearch}
onOpenChange={handleOpen}
listProps={{ style: { maxHeight: 300 } }}
maxHeight={480}
style={{ minWidth: '250px' }}
>
{items.map((item: any) => (
@@ -1,5 +1,6 @@
import { Column, Grid, Icon, Row, Text } from '@umami/react-zen';
import type { ReactNode } from 'react';
import { differenceInCalendarDays } from 'date-fns';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { Panel } from '@/components/common/Panel';
import { useLocale, useMessages, useResultQuery } from '@/components/hooks';
@@ -45,8 +46,6 @@ export function Retention({ websiteId, days = DAYS, startDate, endDate }: Retent
return arr;
}, []) || [];
const totalDays = rows.length;
return (
<LoadingPanel data={data} isLoading={isLoading} error={error}>
{data && (
@@ -84,6 +83,7 @@ export function Retention({ websiteId, days = DAYS, startDate, endDate }: Retent
))}
</Grid>
{rows.map(({ date, visitors, records }: any, rowIndex: number) => {
const maxDay = differenceInCalendarDays(endDate, new Date(date));
return (
<Grid
key={rowIndex}
@@ -103,10 +103,8 @@ export function Retention({ websiteId, days = DAYS, startDate, endDate }: Retent
</Row>
</Column>
{days.map(day => {
if (totalDays - rowIndex < day) {
return null;
}
const percentage = records.filter(a => a.day === day)[0]?.percentage;
if (day > maxDay) return null;
const percentage = records.find(a => a.day === day)?.percentage;
return (
<Cell key={day}>
{percentage ? `${Number(percentage).toFixed(2)}%` : ''}
@@ -31,7 +31,7 @@ export function WebsiteHeader({
titleHref={allowLink ? renderUrl(`/websites/${website.id}`, false) : undefined}
>
<Row alignItems="center" gap="6" wrap="wrap">
<ActiveUsers websiteId={website.id} />
<ActiveUsers websiteId={website.id} allowLink={allowLink} />
{showActions && (
<LinkButton href={renderUrl(`/websites/${website.id}/settings`, false)}>
@@ -154,10 +154,9 @@ export function CompareTables({ websiteId }: { websiteId: string }) {
<Select
label={t(labels.compare)}
value={view}
defaultValue={view}
onChange={handleChange}
style={{ width: 200 }}
popoverProps={{ style: { width: 200 } }}
maxHeight={480}
listProps={{ style: { width: 200 } }}
>
{items.map(({ id, label }) => (
<ListItem key={id} id={id}>
@@ -0,0 +1,156 @@
'use client';
import { Column, DataColumn, DataTable, Row, Text } from '@umami/react-zen';
import { useMemo } from 'react';
import { Avatar } from '@/components/common/Avatar';
import { DateDistance } from '@/components/common/DateDistance';
import { Empty } from '@/components/common/Empty';
import Link from '@/components/common/Link';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { Pager } from '@/components/common/Pager';
import { useEventDataPivotQuery, useEventDataPropertiesQuery, useMessages, useMobile, useNavigation } from '@/components/hooks';
import type { EventPropertyFilter } from '@/lib/types';
export function EventDataPivotTable({
websiteId,
eventName,
eventFilters = [],
}: {
websiteId: string;
eventName: string;
eventFilters?: EventPropertyFilter[];
}) {
const { t, labels } = useMessages();
const { router, updateParams } = useNavigation();
const { isMobile } = useMobile();
const propertiesQuery = useEventDataPropertiesQuery(websiteId);
const pivotQuery = useEventDataPivotQuery(websiteId, eventName, eventFilters);
const propertyKeys = useMemo(() => {
if (!propertiesQuery.data || !eventName) return [];
const keys = propertiesQuery.data
.filter((e: { eventName: string }) => e.eventName === eventName)
.map((e: { propertyName: string }) => e.propertyName);
return [...new Set<string>(keys)];
}, [propertiesQuery.data, eventName]);
const tableMinWidth = useMemo(() => {
return `${72 + 220 + 180 + propertyKeys.length * 160}px`;
}, [propertyKeys.length]);
const tableData = useMemo(() => {
if (!pivotQuery.data?.data) return [];
return pivotQuery.data.data.map(
(row: { eventId: string; sessionId: string; eventName: string; urlPath: string; createdAt: string; propertyKeys: string[]; propertyValues: string[] }) => {
const flat: Record<string, any> = {
eventId: row.eventId,
sessionId: row.sessionId,
urlPath: row.urlPath,
createdAt: row.createdAt,
};
row.propertyKeys.forEach((key, i) => {
flat[key] = row.propertyValues[i] ?? '';
});
return flat;
},
);
}, [pivotQuery.data]);
const tableQuery = useMemo(
() =>
pivotQuery.data
? { ...pivotQuery.data, data: tableData }
: undefined,
[pivotQuery.data, tableData],
);
const showPager = tableQuery && tableQuery.count > tableQuery.pageSize;
const handlePageChange = (page: number) => {
router.push(updateParams({ page }));
};
const renderTruncatedText = (value: string) => (
<Row overflow="hidden" minWidth="0" width="100%">
<Text truncate title={value} style={{ maxWidth: '100%' }}>
{value}
</Text>
</Row>
);
return (
<Column gap="4" minWidth="0" width="100%" maxWidth="100%">
<LoadingPanel
data={tableQuery?.data}
isLoading={pivotQuery.isLoading}
isFetching={pivotQuery.isFetching}
error={pivotQuery.error}
renderEmpty={() => <Empty />}
>
<Column gap="4" minWidth="0" width="100%" maxWidth="100%">
{isMobile ? (
<DataTable data={tableQuery?.data} style={{ width: '100%' }} displayMode="cards">
<DataColumn id="session" label={t(labels.session)} width="72px">
{(row: any) => (
<Link href={updateParams({ session: row.sessionId })}>
<Avatar seed={row.sessionId} size={32} />
</Link>
)}
</DataColumn>
<DataColumn id="urlPath" label={t(labels.path)} width="220px">
{(row: any) => renderTruncatedText(row.urlPath ?? '')}
</DataColumn>
{propertyKeys.map(key => (
<DataColumn key={key} id={key} label={key} width="160px">
{(row: any) => renderTruncatedText(row[key] ?? '')}
</DataColumn>
))}
<DataColumn id="createdAt" label={t(labels.created)} width="180px">
{(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn>
</DataTable>
) : (
<div style={{ width: '100%', maxWidth: '100%', overflowX: 'auto', overflowY: 'hidden' }}>
<div style={{ width: tableMinWidth, minWidth: tableMinWidth }}>
<DataTable
data={tableQuery?.data}
style={{ width: '100%' }}
displayMode="table"
>
<DataColumn id="session" label={t(labels.session)} width="72px">
{(row: any) => (
<Link href={updateParams({ session: row.sessionId })}>
<Avatar seed={row.sessionId} size={32} />
</Link>
)}
</DataColumn>
<DataColumn id="urlPath" label={t(labels.path)} width="220px">
{(row: any) => renderTruncatedText(row.urlPath ?? '')}
</DataColumn>
{propertyKeys.map(key => (
<DataColumn key={key} id={key} label={key} width="160px">
{(row: any) => renderTruncatedText(row[key] ?? '')}
</DataColumn>
))}
<DataColumn id="createdAt" label={t(labels.created)} width="180px">
{(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn>
</DataTable>
</div>
</div>
)}
{showPager && tableQuery && (
<Row marginTop="6">
<Pager
page={tableQuery.page}
pageSize={tableQuery.pageSize}
count={tableQuery.count}
onPageChange={handlePageChange}
/>
</Row>
)}
</Column>
</LoadingPanel>
</Column>
);
}
@@ -1,30 +1,57 @@
import { Column, Grid, ListItem, Select } from '@umami/react-zen';
'use client';
import { Column, ComboBox, Grid, Label, ListItem, Row, Select } from '@umami/react-zen';
import { useMemo, useState } from 'react';
import { PieChart } from '@/components/charts/PieChart';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import {
useEventDataPropertiesQuery,
useEventDataValuesQuery,
useMessages,
} from '@/components/hooks';
import { ListTable } from '@/components/metrics/ListTable';
import { CHART_COLORS } from '@/lib/constants';
import { Panel } from '@/components/common/Panel';
import { useEventDataPropertiesQuery, useMessages } from '@/components/hooks';
import { DATA_TYPE } from '@/lib/constants';
import type { PropertyFilter } from '@/lib/types';
import { PropertyChart } from '@/components/property-data/PropertyChart';
import { PropertyDateChart } from '@/components/property-data/PropertyDateChart';
import { PropertyFilterBar } from '@/components/property-data/PropertyFilterBar';
import { PropertyFilterButton } from '@/components/property-data/PropertyFilterButton';
import { PropertyNumericChart } from '@/components/property-data/PropertyNumericChart';
import { EventDataPivotTable } from '../event-data/EventDataPivotTable';
export function EventProperties({ websiteId }: { websiteId: string }) {
const [propertyName, setPropertyName] = useState('');
const [eventName, setEventName] = useState('');
const [propertyName, setPropertyName] = useState('');
const [propertyFilters, setPropertyFilters] = useState<PropertyFilter[]>([]);
const { t, labels } = useMessages();
const { data, isLoading, isFetching, error } = useEventDataPropertiesQuery(websiteId);
const events: string[] = data
? data.reduce((arr: string | any[], e: { eventName: any }) => {
return !arr.includes(e.eventName) ? arr.concat(e.eventName) : arr;
}, [])
: [];
const properties: string[] = eventName
? data?.filter(e => e.eventName === eventName).map(e => e.propertyName)
: [];
const eventNames = useMemo<string[]>(() => {
if (!data) return [];
return [...new Set<string>(data.map((e: { eventName: string }) => e.eventName))];
}, [data]);
const properties = useMemo(() => {
if (!data || !eventName) return [];
const seen = new Set<string>();
return data
.filter((field: { eventName: string }) => field.eventName === eventName)
.filter((field: { propertyName: string; dataType: number }) => {
if (seen.has(field.propertyName)) return false;
seen.add(field.propertyName);
return true;
});
}, [data, eventName]);
const selectedProperty = useMemo(() => {
return properties.find(
(field: { propertyName: string; dataType: number }) => field.propertyName === propertyName,
);
}, [properties, propertyName]);
const handleEventChange = (value: string) => {
setEventName(value);
setPropertyName('');
setPropertyFilters([]);
};
return (
<LoadingPanel
@@ -34,94 +61,126 @@ export function EventProperties({ websiteId }: { websiteId: string }) {
error={error}
minHeight="300px"
>
<Column gap="6">
<Column gap="6" minWidth="0">
{data && (
<Grid columns="repeat(auto-fill, minmax(300px, 1fr))" marginBottom="3" gap>
<Select
label={t(labels.event)}
value={eventName}
onChange={setEventName}
placeholder=""
<Grid
columns={{ base: '1fr', md: '1fr auto' }}
gap
alignItems="end"
marginBottom="3"
width="100%"
style={{ minWidth: 0 }}
>
<Grid
columns={{ base: '1fr', md: 'repeat(auto-fill, minmax(300px, 1fr))' }}
gap
width="100%"
style={{ flex: 1, minWidth: 0 }}
>
{events?.map(p => (
<ListItem key={p} id={p}>
{p}
</ListItem>
))}
</Select>
<Select
label={t(labels.property)}
value={propertyName}
onChange={setPropertyName}
isDisabled={!eventName}
placeholder=""
>
{properties?.map(p => (
<ListItem key={p} id={p}>
{p}
</ListItem>
))}
</Select>
<Column gap="1" style={{ minWidth: 0 }}>
<Label>{t(labels.event)}</Label>
<Select
value={eventName}
onChange={handleEventChange}
placeholder={t(labels.selectEvent)}
maxHeight={480}
>
{eventNames.map(name => (
<ListItem key={name} id={name}>
{name}
</ListItem>
))}
</Select>
</Column>
<Column gap="1" style={{ minWidth: 0 }}>
<Label>{t(labels.property)}</Label>
<ComboBox
inputValue={propertyName}
onInputChange={setPropertyName}
isDisabled={!eventName}
allowsCustomValue
allowsEmptyCollection
>
{properties.map((field: { propertyName: string }) => (
<ListItem key={field.propertyName} id={field.propertyName}>
{field.propertyName}
</ListItem>
))}
</ComboBox>
</Column>
</Grid>
{eventName && (
<Row
width={{ base: '100%', md: 'auto' }}
marginTop={{ base: '2', md: '0' }}
style={{ minWidth: 0 }}
>
<PropertyFilterButton
source="event"
websiteId={websiteId}
eventName={eventName}
filters={propertyFilters}
onApply={setPropertyFilters}
/>
</Row>
)}
</Grid>
)}
{eventName && (
<PropertyFilterBar filters={propertyFilters} onChange={setPropertyFilters} />
)}
{eventName && propertyName && (
<EventValues websiteId={websiteId} eventName={eventName} propertyName={propertyName} />
<Column border="bottom" paddingBottom="6">
{(selectedProperty?.dataType === DATA_TYPE.string ||
selectedProperty?.dataType === DATA_TYPE.boolean) && (
<PropertyChart
source="event"
websiteId={websiteId}
eventName={eventName}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{selectedProperty?.dataType === DATA_TYPE.number && (
<PropertyNumericChart
source="event"
websiteId={websiteId}
eventName={eventName}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{selectedProperty?.dataType === DATA_TYPE.date && (
<PropertyDateChart
source="event"
websiteId={websiteId}
eventName={eventName}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{selectedProperty?.dataType === DATA_TYPE.array && (
<PropertyChart
source="event"
websiteId={websiteId}
eventName={eventName}
propertyName={propertyName}
propertyFilters={propertyFilters}
seriesType="array"
/>
)}
</Column>
)}
{eventName && (
<Panel minWidth="0" width="100%">
<EventDataPivotTable
websiteId={websiteId}
eventName={eventName}
eventFilters={propertyFilters}
/>
</Panel>
)}
</Column>
</LoadingPanel>
);
}
const EventValues = ({ websiteId, eventName, propertyName }) => {
const {
data: values,
isLoading,
isFetching,
error,
} = useEventDataValuesQuery(websiteId, eventName, propertyName);
const propertySum = useMemo(() => {
return values?.reduce((sum, { total }) => sum + total, 0) ?? 0;
}, [values]);
const chartData = useMemo(() => {
if (!propertyName || !values) return null;
return {
labels: values.map(({ value }) => value),
datasets: [
{
data: values.map(({ total }) => total),
backgroundColor: CHART_COLORS,
borderWidth: 0,
},
],
};
}, [propertyName, values]);
const tableData = useMemo(() => {
if (!propertyName || !values || propertySum === 0) return [];
return values.map(({ value, total }) => ({
label: value,
count: total,
percent: 100 * (total / propertySum),
}));
}, [propertyName, values, propertySum]);
return (
<LoadingPanel
isLoading={isLoading}
isFetching={isFetching}
data={values}
error={error}
minHeight="300px"
gap="6"
>
{values && (
<Grid columns="1fr 1fr" gap>
<ListTable title={propertyName} data={tableData} />
<PieChart type="doughnut" chartData={chartData} />
</Grid>
)}
</LoadingPanel>
);
};
@@ -87,17 +87,21 @@ export function EventsPage({ websiteId }) {
})}
</MetricsBar>
</LoadingPanel>
<Panel>
<Tabs selectedKey={tab} onSelectionChange={key => handleSelect(key)}>
<Panel minWidth="0" width="100%" style={{ overflow: 'hidden' }}>
<Tabs
selectedKey={tab}
onSelectionChange={key => handleSelect(key)}
style={{ minWidth: 0, width: '100%' }}
>
<TabList>
<Tab id="chart">{t(labels.chart)}</Tab>
<Tab id="activity">{t(labels.activity)}</Tab>
<Tab id="properties">{t(labels.properties)}</Tab>
</TabList>
<TabPanel id="activity">
<TabPanel id="activity" style={{ minWidth: 0, width: '100%' }}>
<EventsDataTable websiteId={websiteId} />
</TabPanel>
<TabPanel id="chart">
<TabPanel id="chart" style={{ minWidth: 0, width: '100%' }}>
<Column gap="6">
<Column border="bottom" paddingBottom="6">
<EventsChart websiteId={websiteId} limit={50} />
@@ -111,7 +115,7 @@ export function EventsPage({ websiteId }) {
/>
</Column>
</TabPanel>
<TabPanel id="properties">
<TabPanel id="properties" style={{ minWidth: 0, width: '100%', overflow: 'hidden' }}>
<EventProperties websiteId={websiteId} />
</TabPanel>
</Tabs>
@@ -1,7 +1,7 @@
import { Column, Heading, Row, SearchField, Text } from '@umami/react-zen';
import Link from '@/components/common/Link';
import { useMemo, useState } from 'react';
import { FixedSizeList } from 'react-window';
import { List, type RowComponentProps } from 'react-window';
import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal';
import { useFormat } from '@/components//hooks/useFormat';
import { Avatar } from '@/components/common/Avatar';
@@ -121,7 +121,7 @@ export function RealtimeLog({ data }: { data: any }) {
}
};
const TableRow = ({ index, style }) => {
const TableRow = ({ index, style, logs }: RowComponentProps<{ logs: any[] }>) => {
const row = logs[index];
return (
<Row alignItems="center" style={style} gap>
@@ -195,9 +195,14 @@ export function RealtimeLog({ data }: { data: any }) {
<Column>
{logs?.length === 0 && <Empty />}
{logs?.length > 0 && (
<FixedSizeList width="100%" height={500} itemCount={logs.length} itemSize={50}>
{TableRow}
</FixedSizeList>
<List
rowComponent={TableRow}
rowCount={logs.length}
rowHeight={50}
rowProps={{ logs }}
defaultHeight={500}
style={{ width: '100%' }}
/>
)}
</Column>
<SessionModal websiteId={website.id} />
@@ -0,0 +1,143 @@
'use client';
import { Column, DataColumn, DataTable, Row, Text } from '@umami/react-zen';
import { useMemo } from 'react';
import { Avatar } from '@/components/common/Avatar';
import { DateDistance } from '@/components/common/DateDistance';
import { Empty } from '@/components/common/Empty';
import Link from '@/components/common/Link';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { Pager } from '@/components/common/Pager';
import {
useMessages,
useMobile,
useNavigation,
useSessionDataPivotQuery,
} from '@/components/hooks';
import type { PropertyFilter } from '@/lib/types';
export function SessionDataPivotTable({
websiteId,
propertyName,
propertyKeys: providedPropertyKeys,
propertyFilters = [],
}: {
websiteId: string;
propertyName: string;
propertyKeys?: string[];
propertyFilters?: PropertyFilter[];
}) {
const { t, labels } = useMessages();
const { router, updateParams } = useNavigation();
const { isMobile } = useMobile();
const pivotQuery = useSessionDataPivotQuery(websiteId, propertyName, propertyFilters);
const propertyKeys = useMemo(() => {
if (providedPropertyKeys) return providedPropertyKeys;
return [];
}, [providedPropertyKeys]);
const tableMinWidth = useMemo(() => `${72 + 220 + 180 + propertyKeys.length * 160}px`, [propertyKeys.length]);
const tableData = useMemo(() => {
if (!pivotQuery.data?.data) return [];
return pivotQuery.data.data.map(
(row: {
sessionId: string;
distinctId: string;
createdAt: string;
propertyKeys: string[];
propertyValues: string[];
}) => {
const flat: Record<string, any> = {
sessionId: row.sessionId,
distinctId: row.distinctId,
createdAt: row.createdAt,
};
row.propertyKeys.forEach((key, i) => {
flat[key] = row.propertyValues[i] ?? '';
});
return flat;
},
);
}, [pivotQuery.data]);
const tableQuery = useMemo(
() => (pivotQuery.data ? { ...pivotQuery.data, data: tableData } : undefined),
[pivotQuery.data, tableData],
);
const showPager = tableQuery && tableQuery.count > tableQuery.pageSize;
const handlePageChange = (page: number) => {
router.push(updateParams({ page }));
};
const renderTruncatedText = (value: string) => (
<Row overflow="hidden" minWidth="0" width="100%">
<Text truncate title={value} style={{ maxWidth: '100%' }}>
{value}
</Text>
</Row>
);
const renderTable = (displayMode: 'cards' | 'table') => (
<DataTable data={tableQuery?.data} style={{ width: '100%' }} displayMode={displayMode}>
<DataColumn id="session" label={t(labels.session)} width="72px">
{(row: any) => (
<Link href={updateParams({ session: row.sessionId })}>
<Avatar seed={row.sessionId} size={32} />
</Link>
)}
</DataColumn>
{propertyKeys.map(key => (
<DataColumn key={key} id={key} label={key} width="160px">
{(row: any) => renderTruncatedText(row[key] ?? '')}
</DataColumn>
))}
<DataColumn id="distinctId" label="Distinct ID" width="220px">
{(row: any) => renderTruncatedText(row.distinctId || '')}
</DataColumn>
<DataColumn id="createdAt" label={t(labels.created)} width="180px">
{(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn>
</DataTable>
);
return (
<Column gap="4" minWidth="0" width="100%" maxWidth="100%">
<LoadingPanel
data={tableQuery?.data}
isLoading={pivotQuery.isLoading}
isFetching={pivotQuery.isFetching}
error={pivotQuery.error}
renderEmpty={() => <Empty />}
>
<Column gap="4" minWidth="0" width="100%" maxWidth="100%">
{isMobile ? (
renderTable('cards')
) : (
<div style={{ width: '100%', maxWidth: '100%', overflowX: 'auto', overflowY: 'hidden' }}>
<div style={{ width: tableMinWidth, minWidth: tableMinWidth }}>
{renderTable('table')}
</div>
</div>
)}
{showPager && tableQuery && (
<Row marginTop="6">
<Pager
page={tableQuery.page}
pageSize={tableQuery.pageSize}
count={tableQuery.count}
onPageChange={handlePageChange}
/>
</Row>
)}
</Column>
</LoadingPanel>
</Column>
);
}
@@ -0,0 +1,136 @@
'use client';
import { DistributionBarChart } from '@/components/charts/DistributionBarChart';
import { Empty } from '@/components/common/Empty';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { useMessages, useMobile, useSessionDataActivityStatsQuery } from '@/components/hooks';
import { formatLongNumber } from '@/lib/format';
import type { PropertyFilter } from '@/lib/types';
import { Column, DataColumn, DataTable, Grid, Row, Text } from '@umami/react-zen';
import { useMemo } from 'react';
export function SessionPropertyChart({
websiteId,
propertyName,
propertyFilters = [],
}: {
websiteId: string;
propertyName: string;
propertyFilters?: PropertyFilter[];
}) {
const statsQuery = useSessionDataActivityStatsQuery(websiteId, propertyName, propertyFilters);
const rows = statsQuery.data ?? [];
const { t, labels } = useMessages();
const { isPhone } = useMobile();
const activeTable = useMemo(() => rows.filter(row => row.activity > 0).slice(0, 10), [rows]);
const chartData = useMemo(
() =>
activeTable.map(row => ({
label: row.label,
values: {
sessions: row.sessions,
visits: row.visits,
views: row.views,
events: row.events,
},
})),
[activeTable],
);
return (
<LoadingPanel isLoading={statsQuery.isLoading} error={statsQuery.error} minHeight="300px">
<Column gap="6">
<Column minHeight="320px">
{chartData.length ? (
<Column gap="3">
<Text weight="bold">{t(labels.activityByProperty)}</Text>
<DistributionBarChart
labels={chartData.map(row => row.label)}
datasets={[
{
label: t(labels.visitors),
values: chartData.map(row => row.values.sessions),
backgroundColor: 'rgba(59, 130, 246, 0.80)',
},
{
label: t(labels.visits),
values: chartData.map(row => row.values.visits),
backgroundColor: 'rgba(16, 185, 129, 0.80)',
},
{
label: t(labels.views),
values: chartData.map(row => row.values.views),
backgroundColor: 'rgba(245, 158, 11, 0.80)',
},
{
label: t(labels.events),
values: chartData.map(row => row.values.events),
backgroundColor: 'rgba(244, 114, 182, 0.80)',
},
]}
stacked={true}
/>
</Column>
) : (
<Empty />
)}
</Column>
<Column>
<Grid columns="1fr" gap padding="2" alignItems="start">
<Column gap padding="2">
{activeTable.length === 0 ? (
<Empty />
) : isPhone ? (
<Column minWidth="0" width="100%">
<DataTable data={activeTable} style={{ width: '100%' }}>
<DataColumn id="label" label={propertyName} width="1fr" align="start">
{row => (
<Row overflow="hidden" minWidth="0" width="100%">
<Text truncate style={{ maxWidth: '100%', width: '100%' }}>
{row.label}
</Text>
</Row>
)}
</DataColumn>
</DataTable>
</Column>
) : (
<Column overflow="auto" minHeight="0">
<Column style={{ minWidth: '700px' }}>
<DataTable data={activeTable}>
<DataColumn
id="label"
label={propertyName}
width="minmax(220px, 2fr)"
align="start"
>
{row => (
<Row overflow="hidden">
<Text truncate style={{ maxWidth: '320px' }}>
{row.label}
</Text>
</Row>
)}
</DataColumn>
<DataColumn id="sessions" label={t(labels.visitors)} align="end" width="90px">
{row => formatLongNumber(row.sessions)}
</DataColumn>
<DataColumn id="visits" label={t(labels.visits)} align="end" width="90px">
{row => formatLongNumber(row.visits)}
</DataColumn>
<DataColumn id="views" label={t(labels.views)} align="end" width="90px">
{row => formatLongNumber(row.views)}
</DataColumn>
<DataColumn id="events" label={t(labels.events)} align="end" width="90px">
{row => formatLongNumber(row.events)}
</DataColumn>
</DataTable>
</Column>
</Column>
)}
</Column>
</Grid>
</Column>
</Column>
</LoadingPanel>
);
}
@@ -1,21 +1,58 @@
import { Column, Grid, ListItem, Select } from '@umami/react-zen';
import { Column, ComboBox, Grid, Label, ListItem, Row } from '@umami/react-zen';
import { useMemo, useState } from 'react';
import { PieChart } from '@/components/charts/PieChart';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import {
useMessages,
useSessionDataPropertiesQuery,
useSessionDataValuesQuery,
} from '@/components/hooks';
import { ListTable } from '@/components/metrics/ListTable';
import { CHART_COLORS } from '@/lib/constants';
import { useMessages, usePropertyFieldsQuery, useSessionDataPropertiesQuery } from '@/components/hooks';
import { DATA_TYPE } from '@/lib/constants';
import type { PropertyFilter } from '@/lib/types';
import { PropertyChart } from '@/components/property-data/PropertyChart';
import { PropertyDateChart } from '@/components/property-data/PropertyDateChart';
import { PropertyFilterBar } from '@/components/property-data/PropertyFilterBar';
import { PropertyFilterButton } from '@/components/property-data/PropertyFilterButton';
import { PropertyNumericChart } from '@/components/property-data/PropertyNumericChart';
import { Panel } from '@/components/common/Panel';
import { SessionDataPivotTable } from '../session-data/SessionDataPivotTable';
import { SessionPropertyChart } from '../session-data/SessionPropertyChart';
export function SessionProperties({ websiteId }: { websiteId: string }) {
const [propertyName, setPropertyName] = useState('');
const [propertyFilters, setPropertyFilters] = useState<PropertyFilter[]>([]);
const { t, labels } = useMessages();
const { data, isLoading, isFetching, error } = useSessionDataPropertiesQuery(websiteId);
const { data, isLoading, isFetching, error } = usePropertyFieldsQuery('session', websiteId);
const { data: scopedData } = useSessionDataPropertiesQuery(
websiteId,
propertyName ? { selectedPropertyName: propertyName, propertyFilters } : undefined,
{ enabled: !!propertyName },
);
const properties: string[] = data?.map(e => e.propertyName);
const properties = useMemo(() => {
if (!data) return [];
const seen = new Set<string>();
return data.filter((field: { propertyName: string; dataType: number }) => {
if (seen.has(field.propertyName)) return false;
seen.add(field.propertyName);
return true;
});
}, [data]);
const selectedProperty = useMemo(
() => properties.find((field: { propertyName: string }) => field.propertyName === propertyName),
[properties, propertyName],
);
const scopedProperties = useMemo(() => {
if (!scopedData) return [];
const seen = new Set<string>();
return scopedData.filter((field: { propertyName: string }) => {
if (seen.has(field.propertyName)) return false;
seen.add(field.propertyName);
return true;
});
}, [scopedData]);
const scopedPropertyKeys = useMemo(
() => scopedProperties.map((field: { propertyName: string }) => field.propertyName),
[scopedProperties],
);
return (
<LoadingPanel
@@ -25,73 +62,107 @@ export function SessionProperties({ websiteId }: { websiteId: string }) {
error={error}
minHeight="300px"
>
<Column gap="6">
<Column gap="6" minWidth="0">
{data && (
<Grid columns="repeat(auto-fill, minmax(300px, 1fr))" gap>
<Select
label={t(labels.event)}
value={propertyName}
onChange={setPropertyName}
placeholder=""
<Grid
columns={{ base: '1fr', md: '1fr auto' }}
gap
alignItems="end"
marginBottom="3"
width="100%"
style={{ minWidth: 0 }}
>
<Grid
columns={{ base: '1fr', md: 'repeat(auto-fill, minmax(300px, 1fr))' }}
gap
width="100%"
style={{ flex: 1, minWidth: 0 }}
>
{properties?.map(p => (
<ListItem key={p} id={p}>
{p}
</ListItem>
))}
</Select>
<Column gap="1" style={{ minWidth: 0 }}>
<Label>{t(labels.property)}</Label>
<ComboBox
inputValue={propertyName}
onInputChange={setPropertyName}
allowsCustomValue
allowsEmptyCollection
>
{properties.map((field: { propertyName: string }) => (
<ListItem key={field.propertyName} id={field.propertyName}>
{field.propertyName}
</ListItem>
))}
</ComboBox>
</Column>
</Grid>
{propertyName && (
<Row
width={{ base: '100%', md: 'auto' }}
marginTop={{ base: '2', md: '0' }}
style={{ minWidth: 0 }}
>
<PropertyFilterButton
source="session"
websiteId={websiteId}
fields={scopedProperties}
filters={propertyFilters}
onApply={setPropertyFilters}
/>
</Row>
)}
</Grid>
)}
{propertyName && <SessionValues websiteId={websiteId} propertyName={propertyName} />}
{propertyName && <PropertyFilterBar filters={propertyFilters} onChange={setPropertyFilters} />}
{propertyName && selectedProperty?.dataType === DATA_TYPE.number && (
<PropertyNumericChart
source="session"
websiteId={websiteId}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{propertyName && selectedProperty?.dataType === DATA_TYPE.date && (
<PropertyDateChart
source="session"
websiteId={websiteId}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{propertyName && selectedProperty?.dataType === DATA_TYPE.string && (
<SessionPropertyChart
websiteId={websiteId}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{propertyName && selectedProperty?.dataType === DATA_TYPE.boolean && (
<PropertyChart
source="session"
websiteId={websiteId}
propertyName={propertyName}
propertyFilters={propertyFilters}
/>
)}
{propertyName && selectedProperty?.dataType === DATA_TYPE.array && (
<PropertyChart
source="session"
websiteId={websiteId}
propertyName={propertyName}
propertyFilters={propertyFilters}
seriesType="array"
/>
)}
{propertyName && (
<Panel minWidth="0" width="100%">
<SessionDataPivotTable
websiteId={websiteId}
propertyName={propertyName}
propertyKeys={scopedPropertyKeys}
propertyFilters={propertyFilters}
/>
</Panel>
)}
</Column>
</LoadingPanel>
);
}
const SessionValues = ({ websiteId, propertyName }) => {
const { data, isLoading, isFetching, error } = useSessionDataValuesQuery(websiteId, propertyName);
const propertySum = useMemo(() => {
return data?.reduce((sum, { total }) => sum + total, 0) ?? 0;
}, [data]);
const chartData = useMemo(() => {
if (!propertyName || !data) return null;
return {
labels: data.map(({ value }) => value),
datasets: [
{
data: data.map(({ total }) => total),
backgroundColor: CHART_COLORS,
borderWidth: 0,
},
],
};
}, [propertyName, data]);
const tableData = useMemo(() => {
if (!propertyName || !data || propertySum === 0) return [];
return data.map(({ value, total }) => ({
label: value,
count: total,
percent: 100 * (total / propertySum),
}));
}, [propertyName, data, propertySum]);
return (
<LoadingPanel
isLoading={isLoading}
isFetching={isFetching}
data={data}
error={error}
minHeight="300px"
>
{data && (
<Grid columns="1fr 1fr" gap>
<ListTable title={propertyName} data={tableData} />
<PieChart type="doughnut" chartData={chartData} />
</Grid>
)}
</LoadingPanel>
);
};
@@ -24,16 +24,20 @@ export function SessionsPage({ websiteId }) {
<Column gap="3">
<WebsiteControls websiteId={websiteId} />
<SessionModal websiteId={websiteId} />
<Panel>
<Tabs selectedKey={tab} onSelectionChange={handleSelect}>
<Panel minWidth="0" width="100%" style={{ overflow: 'hidden' }}>
<Tabs
selectedKey={tab}
onSelectionChange={handleSelect}
style={{ minWidth: 0, width: '100%' }}
>
<TabList>
<Tab id="activity">{t(labels.activity)}</Tab>
<Tab id="properties">{t(labels.properties)}</Tab>
</TabList>
<TabPanel id="activity">
<TabPanel id="activity" style={{ minWidth: 0, width: '100%' }}>
<SessionsDataTable websiteId={websiteId} />
</TabPanel>
<TabPanel id="properties">
<TabPanel id="properties" style={{ minWidth: 0, width: '100%', overflow: 'hidden' }}>
<SessionProperties websiteId={websiteId} />
</TabPanel>
</Tabs>
+2 -2
View File
@@ -2,7 +2,7 @@ import { z } from 'zod';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json } from '@/lib/response';
import { pagingParams } from '@/lib/schema';
import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma';
import { getAllUserWebsitesIncludingTeamAccess, getUserWebsites } from '@/queries/prisma';
export async function GET(request: Request) {
const schema = z.object({
@@ -19,7 +19,7 @@ export async function GET(request: Request) {
const filters = await getQueryFilters(query);
if (query.includeTeams) {
return json(await getAllUserWebsitesIncludingTeamOwner(auth.user.id, filters));
return json(await getAllUserWebsitesIncludingTeamAccess(auth.user.id, filters));
}
return json(await getUserWebsites(auth.user.id, filters));
+2 -2
View File
@@ -2,7 +2,7 @@ import { z } from 'zod';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { pagingParams, searchParams } from '@/lib/schema';
import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma/website';
import { getAllUserWebsitesIncludingTeamAccess, getUserWebsites } from '@/queries/prisma/website';
export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const schema = z.object({
@@ -26,7 +26,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ user
const filters = await getQueryFilters(query);
if (query.includeTeams) {
return json(await getAllUserWebsitesIncludingTeamOwner(userId, filters));
return json(await getAllUserWebsitesIncludingTeamAccess(userId, filters));
}
return json(await getUserWebsites(userId, filters));
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataArraySeries } from '@/queries/sql/events/getEventDataArraySeries';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const data = await getEventDataArraySeries(websiteId, eventName, propertyName, filters, eventFilters);
return json(data);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataDateSeries } from '@/queries/sql/events/getEventDataDateSeries';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const data = await getEventDataDateSeries(websiteId, eventName, propertyName, filters, eventFilters);
return json(data);
}
@@ -0,0 +1,42 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataNumericSeries } from '@/queries/sql/events/getEventDataNumericSeries';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
propertyName: z.string(),
metric: z.enum(['sum', 'avg', 'count']).default('sum'),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, propertyName, metric, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const data = await getEventDataNumericSeries(websiteId, eventName, propertyName, metric, filters, eventFilters);
return json(data);
}
@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataNumericStats } from '@/queries/sql/events/getEventDataNumericStats';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
propertyName: z.string(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const data = await getEventDataNumericStats(websiteId, eventName, propertyName, filters, eventFilters);
return json(data);
}
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataPropertySeries } from '@/queries/sql/events/getEventDataPropertySeries';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const data = await getEventDataPropertySeries(websiteId, eventName, propertyName, filters, eventFilters);
return json(data);
}
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parseEventPropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, pagingParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getEventDataPivot } from '@/queries/sql/events/getEventDataPivot';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
eventName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
...pagingParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { eventName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const eventFilters = parseEventPropertyFilters(query);
const result = await getEventDataPivot(websiteId, eventName, filters, eventFilters);
return json(result);
}
@@ -14,6 +14,7 @@ export async function GET(
endAt: z.coerce.number().int(),
event: z.string(),
propertyName: z.string(),
dataType: z.coerce.number().int().optional(),
...filterParams,
});
@@ -29,12 +30,13 @@ export async function GET(
return unauthorized();
}
const { propertyName } = query;
const { event: eventName, propertyName, dataType } = query;
const filters = await getQueryFilters(query, websiteId);
const data = await getEventDataValues(websiteId, {
const data = await getEventDataValues(websiteId, eventName, {
...filters,
propertyName,
dataType,
});
return json(data);
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, pagingParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataPivot } from '@/queries/sql/sessions/getSessionDataPivot';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
...pagingParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const result = await getSessionDataPivot(websiteId, propertyName, filters, propertyFilters);
return json(result);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataArraySeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataArraySeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataDateSeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataDateSeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataNumericSeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
metric: z.enum(['sum', 'avg', 'count']).default('sum'),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, metric, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataNumericSeries(websiteId, propertyName, metric, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataNumericStats } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataNumericStats(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -1,4 +1,5 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams } from '@/lib/schema';
@@ -12,6 +13,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
selectedPropertyName: z.string().optional(),
...filterParams,
});
@@ -27,9 +29,16 @@ export async function GET(
return unauthorized();
}
const filters = await getQueryFilters(query, websiteId);
const { selectedPropertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataProperties(websiteId, filters);
const data = await getSessionDataProperties(
websiteId,
filters,
propertyFilters,
selectedPropertyName,
);
return json(data);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataPropertySeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataPropertySeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataActivityStats } from '@/queries/sql/sessions/getSessionDataActivityStats';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const result = await getSessionDataActivityStats(websiteId, propertyName, filters, propertyFilters);
return json(result);
}
@@ -13,6 +13,7 @@ export async function GET(
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string().optional(),
dataType: z.coerce.number().int().optional(),
...filterParams,
});
@@ -28,12 +29,13 @@ export async function GET(
return unauthorized();
}
const { propertyName } = query;
const { propertyName, dataType } = query;
const filters = await getQueryFilters(query, websiteId);
const data = await getSessionDataValues(websiteId, {
...filters,
propertyName,
dataType,
});
return json(data);
+2 -2
View File
@@ -7,7 +7,7 @@ import { json, unauthorized } from '@/lib/response';
import { pagingParams, searchParams } from '@/lib/schema';
import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions';
import { createShare, createWebsite, getWebsiteCount } from '@/queries/prisma';
import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma/website';
import { getAllUserWebsitesIncludingTeamAccess, getUserWebsites } from '@/queries/prisma/website';
const CLOUD_WEBSITE_LIMIT = 3;
@@ -29,7 +29,7 @@ export async function GET(request: Request) {
const filters = await getQueryFilters(query);
if (query.includeTeams) {
return json(await getAllUserWebsitesIncludingTeamOwner(userId, filters));
return json(await getAllUserWebsitesIncludingTeamAccess(userId, filters));
}
return json(await getUserWebsites(userId, filters));
@@ -0,0 +1,172 @@
'use client';
import { useTheme } from '@umami/react-zen';
import { memo, useCallback, useMemo, useState } from 'react';
import { Chart } from '@/components/charts/Chart';
import { ChartTooltip } from '@/components/charts/ChartTooltip';
import { renderNumberLabels } from '@/lib/charts';
import { getThemeColors } from '@/lib/colors';
import { formatLongNumber } from '@/lib/format';
interface DistributionDatum {
label: string;
count: number;
}
interface DistributionDataset {
label: string;
values: number[];
backgroundColor: string;
borderColor?: string;
}
interface TooltipState {
title: string;
color?: string;
value: string;
}
export interface DistributionBarChartProps {
data?: DistributionDatum[];
labels?: string[];
datasets?: DistributionDataset[];
height?: string;
backgroundColor?: string;
borderColor?: string;
stacked?: boolean;
horizontal?: boolean;
}
function DistributionBarChartComponent({
data,
labels,
datasets,
height = '320px',
backgroundColor = 'rgba(59, 130, 246, 0.75)',
borderColor = 'rgba(59, 130, 246, 0.95)',
stacked = false,
horizontal = true,
}: DistributionBarChartProps) {
const [tooltip, setTooltip] = useState<TooltipState | null>(null);
const { theme } = useTheme();
const { colors } = useMemo(() => getThemeColors(theme), [theme]);
const chartData = useMemo(() => {
if (datasets?.length && labels?.length) {
return {
labels,
datasets: datasets.map(dataset => ({
label: dataset.label,
data: dataset.values,
backgroundColor: dataset.backgroundColor,
borderColor: dataset.borderColor || dataset.backgroundColor,
borderWidth: 1,
})),
};
}
return {
labels: (data || []).map(item => item.label),
datasets: [
{
label: '',
data: (data || []).map(item => item.count),
backgroundColor,
borderColor,
borderWidth: 1,
},
],
};
}, [data, labels, datasets, backgroundColor, borderColor]);
const chartOptions = useMemo(
() => ({
indexAxis: horizontal ? ('y' as const) : ('x' as const),
scales: {
x: {
type: horizontal ? ('linear' as const) : ('category' as const),
min: horizontal ? 0 : undefined,
beginAtZero: horizontal ? true : undefined,
stacked,
grid: {
display: horizontal ? true : false,
color: colors.chart.line,
},
border: {
color: colors.chart.line,
},
ticks: {
color: colors.chart.text,
autoSkip: horizontal ? undefined : true,
maxRotation: horizontal ? undefined : 0,
callback: horizontal
? (tickValue: string | number) => renderNumberLabels(String(tickValue))
: (tickValue: string | number) => chartData.labels?.[Number(tickValue)] || '',
},
},
y: {
type: horizontal ? ('category' as const) : ('linear' as const),
min: horizontal ? undefined : 0,
beginAtZero: horizontal ? undefined : true,
stacked,
grid: {
display: horizontal ? false : true,
color: colors.chart.line,
},
border: {
color: colors.chart.line,
},
ticks: {
color: colors.chart.text,
callback: horizontal
? (tickValue: string | number) => chartData.labels?.[Number(tickValue)] || ''
: (tickValue: string | number) => renderNumberLabels(String(tickValue)),
},
},
},
}),
[chartData.labels, colors, horizontal, stacked],
);
const handleTooltip = useCallback(({ tooltip }: { tooltip: any }) => {
const { opacity, labelColors, dataPoints } = tooltip;
const point = dataPoints?.[0];
const nextTooltip = opacity
? {
title: (point?.label ?? '').toString(),
color: labelColors?.[0]?.backgroundColor,
value: `${formatLongNumber(
Number(horizontal ? point?.raw?.x ?? point?.raw ?? 0 : point?.raw?.y ?? point?.raw ?? 0),
)}${point?.dataset?.label ? ` ${point.dataset.label}` : ''}`,
}
: null;
setTooltip(prev => {
if (
prev?.title === nextTooltip?.title &&
prev?.color === nextTooltip?.color &&
prev?.value === nextTooltip?.value
) {
return prev;
}
return nextTooltip;
});
}, [horizontal]);
return (
<>
<Chart
type="bar"
chartData={chartData}
chartOptions={chartOptions}
onTooltip={handleTooltip}
height={height}
/>
{tooltip && <ChartTooltip {...tooltip} />}
</>
);
}
export const DistributionBarChart = memo(DistributionBarChartComponent);
DistributionBarChart.displayName = 'DistributionBarChart';
+2 -2
View File
@@ -1,3 +1,3 @@
import { type AnimatedComponent, animated } from '@react-spring/web';
import { motion } from 'motion/react';
export const AnimatedDiv: AnimatedComponent<any> = animated.div;
export const AnimatedDiv = motion.div;
+2 -1
View File
@@ -41,7 +41,7 @@ export function DataGrid({
const { data, error, isLoading, isFetching } = query;
const { router, updateParams, query: queryParams } = useNavigation();
const [search, setSearch] = useState(queryParams?.search || data?.search || '');
const showPager = allowPaging && data && data.count > data.pageSize;
const showPager = allowPaging && data && (data.count > data.pageSize || data.isCapped);
const { isMobile } = useMobile();
const displayMode = isMobile ? 'cards' : undefined;
@@ -95,6 +95,7 @@ export function DataGrid({
page={data.page}
pageSize={data.pageSize}
count={data.count}
isCapped={data.isCapped}
onPageChange={handlePageChange}
/>
</Row>
+6 -3
View File
@@ -6,11 +6,12 @@ export interface PagerProps {
page: string | number;
pageSize: string | number;
count: string | number;
isCapped?: boolean;
onPageChange: (nextPage: number) => void;
className?: string;
}
export function Pager({ page, pageSize, count, onPageChange }: PagerProps) {
export function Pager({ page, pageSize, count, isCapped, onPageChange }: PagerProps) {
const { t, labels } = useMessages();
const maxPage = pageSize && count ? Math.ceil(+count / +pageSize) : 0;
const lastPage = page === maxPage;
@@ -28,13 +29,15 @@ export function Pager({ page, pageSize, count, onPageChange }: PagerProps) {
}
};
if (maxPage === 1) {
if (maxPage === 1 && !isCapped) {
return null;
}
const displayCount = isCapped ? `10,000+` : (+count).toLocaleString();
return (
<Row alignItems="center" justifyContent="space-between" gap="3" flexGrow={1}>
<Text>{t(labels.numberOfRecords, { x: count.toLocaleString() })}</Text>
<Text>{t(labels.numberOfRecords, { x: displayCount })}</Text>
<Row alignItems="center" justifyContent="flex-end" gap="3">
<Text>
{t(labels.pageOf, {
+10 -2
View File
@@ -17,10 +17,9 @@ export * from './queries/useBoardsQuery';
export * from './queries/useDashboardQuery';
export * from './queries/useDateRangeQuery';
export * from './queries/useDeleteQuery';
export * from './queries/useEventDataEventsQuery';
export * from './queries/useEventDataPivotQuery';
export * from './queries/useEventDataPropertiesQuery';
export * from './queries/useEventDataQuery';
export * from './queries/useEventDataValuesQuery';
export * from './queries/useLinkQuery';
export * from './queries/useLinkSharesQuery';
export * from './queries/useLinksQuery';
@@ -28,6 +27,13 @@ export * from './queries/useLoginQuery';
export * from './queries/usePixelQuery';
export * from './queries/usePixelSharesQuery';
export * from './queries/usePixelsQuery';
export * from './queries/usePropertyArraySeriesQuery';
export * from './queries/usePropertyDateSeriesQuery';
export * from './queries/usePropertyFieldsQuery';
export * from './queries/usePropertyNumericSeriesQuery';
export * from './queries/usePropertyNumericStatsQuery';
export * from './queries/usePropertySeriesQuery';
export * from './queries/usePropertyValuesQuery';
export * from './queries/useRealtimeQuery';
export * from './queries/useReplayQuery';
export * from './queries/useReplaySavedQuery';
@@ -39,7 +45,9 @@ export * from './queries/useRevenueSessionsQuery';
export * from './queries/useSavedReplaysQuery';
export * from './queries/useSessionActivityQuery';
export * from './queries/useSessionDataPropertiesQuery';
export * from './queries/useSessionDataPivotQuery';
export * from './queries/useSessionDataQuery';
export * from './queries/useSessionDataActivityStatsQuery';
export * from './queries/useSessionDataValuesQuery';
export * from './queries/useSessionReplaysQuery';
export * from './queries/useShareTokenQuery';
@@ -1,7 +1,7 @@
import type { ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
export function useActyiveUsersQuery(websiteId: string, options?: ReactQueryOptions) {
export function useActiveUsersQuery(websiteId: string, options?: ReactQueryOptions) {
const { get, useQuery } = useApi();
return useQuery<any>({
queryKey: ['websites:active', websiteId],
@@ -1,27 +0,0 @@
import type { ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useEventDataEventsQuery(websiteId: string, options?: ReactQueryOptions) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const filters = useFilterParameters();
return useQuery({
queryKey: [
'websites:event-data:events',
{ websiteId, startAt, endAt, unit, timezone, ...filters },
],
queryFn: () =>
get(`/websites/${websiteId}/event-data/events`, {
startAt,
endAt,
unit,
timezone,
...filters,
}),
enabled: !!websiteId,
...options,
});
}
@@ -0,0 +1,37 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import { serializeEventPropertyFilters } from '@/lib/params';
import type { EventPropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useEventDataPivotQuery(
websiteId: string,
eventName: string,
eventFilters: EventPropertyFilter[] = [],
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters();
return useQuery({
queryKey: [
'websites:event-data-pivot',
{ websiteId, eventName, eventFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(`/websites/${websiteId}/event-data-pivot`, {
eventName,
startAt,
endAt,
unit,
timezone,
...serializeEventPropertyFilters(eventFilters),
...params,
maxResults: MAX_PAGING_RESULTS,
}),
enabled: !!(websiteId && eventName),
...options,
});
}
@@ -6,7 +6,7 @@ import { useFilterParameters } from '../useFilterParameters';
export function useEventDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const filters = useFilterParameters();
const filters = useFilterParameters({ includePagination: false });
return useQuery<any>({
queryKey: [
@@ -1,34 +0,0 @@
import type { ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useEventDataValuesQuery(
websiteId: string,
event: string,
propertyName: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const filters = useFilterParameters();
return useQuery<any>({
queryKey: [
'websites:event-data:values',
{ websiteId, startAt, endAt, unit, timezone, ...filters, event, propertyName },
],
queryFn: () =>
get(`/websites/${websiteId}/event-data/values`, {
startAt,
endAt,
unit,
timezone,
...filters,
event,
propertyName,
}),
enabled: !!(websiteId && propertyName),
...options,
});
}
@@ -26,7 +26,7 @@ export function useEventStatsQuery(
) {
const { get, useQuery } = useApi();
const { startAt, endAt } = useDateParameters();
const filters = useFilterParameters();
const filters = useFilterParameters({ includePagination: false });
return useQuery<EventStatsApiResponse, Error, EventStatsData>({
queryKey: ['websites:events:stats', { websiteId, startAt, endAt, ...filters }],
@@ -0,0 +1,44 @@
import { serializePropertyFilters } from '@/lib/params';
import type { EventDataSeriesPoint, PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertyArraySeriesQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<EventDataSeriesPoint[]>({
queryKey: [
`websites:${source}-data:array-series`,
{ websiteId, propertyName, eventName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data-pivot/array-series`
: `/websites/${websiteId}/session-data/array-series`,
{
...(source === 'event' ? { eventName } : {}),
propertyName,
startAt,
endAt,
unit,
timezone,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,43 @@
import { serializePropertyFilters } from '@/lib/params';
import type { EventDataDateSeriesPoint, PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertyDateSeriesQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<EventDataDateSeriesPoint[]>({
queryKey: [
`websites:${source}-data:date-series`,
{ websiteId, propertyName, eventName, propertyFilters, startAt, endAt, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data-pivot/date-series`
: `/websites/${websiteId}/session-data/date-series`,
{
...(source === 'event' ? { eventName } : {}),
propertyName,
startAt,
endAt,
timezone,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,40 @@
import type { ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export type PropertyDataSource = 'event' | 'session';
export function usePropertyFieldsQuery(
source: PropertyDataSource,
websiteId: string,
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<any>({
queryKey: [
`websites:${source}-data:fields`,
{ websiteId, eventName, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data/fields`
: `/websites/${websiteId}/session-data/properties`,
{
...(source === 'event' ? { event: eventName } : {}),
startAt,
endAt,
unit,
timezone,
...params,
},
),
enabled: !!(websiteId && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,46 @@
import { serializePropertyFilters } from '@/lib/params';
import type { PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertyNumericSeriesQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
metric: 'sum' | 'avg' | 'count',
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<any>({
queryKey: [
`websites:${source}-data:numeric-series`,
{ websiteId, propertyName, metric, eventName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data-pivot/numeric-series`
: `/websites/${websiteId}/session-data/numeric-series`,
{
...(source === 'event' ? { eventName } : {}),
propertyName,
metric,
startAt,
endAt,
unit,
timezone,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,43 @@
import { serializePropertyFilters } from '@/lib/params';
import type { EventDataNumericStats, PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertyNumericStatsQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<EventDataNumericStats>({
queryKey: [
`websites:${source}-data:numeric-stats`,
{ websiteId, propertyName, eventName, propertyFilters, startAt, endAt, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data-pivot/numeric-stats`
: `/websites/${websiteId}/session-data/numeric-stats`,
{
...(source === 'event' ? { eventName } : {}),
propertyName,
startAt,
endAt,
timezone,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,44 @@
import { serializePropertyFilters } from '@/lib/params';
import type { EventDataSeriesPoint, PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertySeriesQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<EventDataSeriesPoint[]>({
queryKey: [
`websites:${source}-data:property-series`,
{ websiteId, propertyName, eventName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data-pivot/property-series`
: `/websites/${websiteId}/session-data/property-series`,
{
...(source === 'event' ? { eventName } : {}),
propertyName,
startAt,
endAt,
unit,
timezone,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -0,0 +1,46 @@
import { serializePropertyFilters } from '@/lib/params';
import type { PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
import type { PropertyDataSource } from './usePropertyFieldsQuery';
export function usePropertyValuesQuery(
source: PropertyDataSource,
websiteId: string,
propertyName: string,
dataType?: number,
propertyFilters: PropertyFilter[] = [],
eventName?: string,
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery<any>({
queryKey: [
`websites:${source}-data:values`,
{ websiteId, propertyName, dataType, eventName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(
source === 'event'
? `/websites/${websiteId}/event-data/values`
: `/websites/${websiteId}/session-data/values`,
{
...(source === 'event' ? { event: eventName } : {}),
startAt,
endAt,
unit,
timezone,
propertyName,
dataType,
...serializePropertyFilters(propertyFilters),
...params,
},
),
enabled: !!(websiteId && propertyName && (source === 'session' || eventName)),
...options,
});
}
@@ -1,3 +1,4 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
@@ -24,7 +25,7 @@ export function useReplaysQuery(websiteId: string, params?: Record<string, strin
...filters,
...pageParams,
...params,
pageSize: 20,
maxResults: MAX_PAGING_RESULTS,
});
},
});
@@ -11,7 +11,7 @@ export function useResultQuery<T = any>(
const { websiteId, ...parameters } = params;
const { post, useQuery } = useApi();
const { startDate, endDate, timezone, unit } = useDateParameters();
const filters = useFilterParameters();
const filters = useFilterParameters({ includePagination: false });
return useQuery<T>({
queryKey: [
@@ -1,3 +1,4 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
@@ -29,7 +30,7 @@ export function useRevenueSessionsQuery(
...filters,
...pageParams,
...params,
pageSize: 20,
maxResults: MAX_PAGING_RESULTS,
});
},
});
@@ -11,7 +11,6 @@ export function useSavedReplaysQuery(websiteId: string) {
queryFn: pageParams => {
return get(`/websites/${websiteId}/replays/saved`, {
...pageParams,
pageSize: 20,
});
},
});
@@ -0,0 +1,35 @@
import { serializePropertyFilters } from '@/lib/params';
import type { PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useSessionDataActivityStatsQuery(
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters({ includePagination: false });
return useQuery({
queryKey: [
'websites:session-data:activity-stats',
{ websiteId, propertyName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(`/websites/${websiteId}/session-data/stats`, {
startAt,
endAt,
unit,
timezone,
propertyName,
...serializePropertyFilters(propertyFilters),
...params,
}),
enabled: !!(websiteId && propertyName),
...options,
});
}
@@ -0,0 +1,37 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import { serializePropertyFilters } from '@/lib/params';
import type { PropertyFilter, ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useSessionDataPivotQuery(
websiteId: string,
propertyName: string,
propertyFilters: PropertyFilter[] = [],
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const params = useFilterParameters();
return useQuery({
queryKey: [
'websites:session-data-pivot',
{ websiteId, propertyName, propertyFilters, startAt, endAt, unit, timezone, ...params },
],
queryFn: () =>
get(`/websites/${websiteId}/session-data-pivot`, {
startAt,
endAt,
unit,
timezone,
propertyName,
...serializePropertyFilters(propertyFilters),
...params,
maxResults: MAX_PAGING_RESULTS,
}),
enabled: !!(websiteId && propertyName),
...options,
});
}
@@ -1,17 +1,36 @@
import type { ReactQueryOptions } from '@/lib/types';
import { serializePropertyFilters } from '@/lib/params';
import type { PropertyFilter } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
export function useSessionDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
export function useSessionDataPropertiesQuery(
websiteId: string,
params?: {
selectedPropertyName?: string;
propertyFilters?: PropertyFilter[];
},
options?: ReactQueryOptions,
) {
const { get, useQuery } = useApi();
const { startAt, endAt, unit, timezone } = useDateParameters();
const filters = useFilterParameters();
const filters = useFilterParameters({ includePagination: false });
const { selectedPropertyName, propertyFilters = [] } = params || {};
return useQuery<any>({
queryKey: [
'websites:session-data:properties',
{ websiteId, startAt, endAt, unit, timezone, ...filters },
{
websiteId,
selectedPropertyName,
propertyFilters,
startAt,
endAt,
unit,
timezone,
...filters,
},
],
queryFn: () =>
get(`/websites/${websiteId}/session-data/properties`, {
@@ -19,6 +38,8 @@ export function useSessionDataPropertiesQuery(websiteId: string, options?: React
endAt,
unit,
timezone,
selectedPropertyName,
...serializePropertyFilters(propertyFilters),
...filters,
}),
enabled: !!websiteId,
@@ -1,3 +1,4 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import type { ReactQueryOptions } from '@/lib/types';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
@@ -32,6 +33,7 @@ export function useWebsiteEventsQuery(
...filters,
...pageParams,
eventType: EVENT_TYPES[params.view],
maxResults: MAX_PAGING_RESULTS,
}),
enabled: !!websiteId,
...options,
@@ -1,3 +1,4 @@
import { MAX_PAGING_RESULTS } from '@/lib/constants';
import { useApi } from '../useApi';
import { useDateParameters } from '../useDateParameters';
import { useFilterParameters } from '../useFilterParameters';
@@ -27,7 +28,7 @@ export function useWebsiteSessionsQuery(
...filters,
...pageParams,
...params,
pageSize: 20,
maxResults: MAX_PAGING_RESULTS,
});
},
});
+11 -6
View File
@@ -2,7 +2,7 @@ import { useMemo } from 'react';
import { FILTER_COLUMNS } from '@/lib/constants';
import { useNavigation } from './useNavigation';
export function useFilterParameters() {
export function useFilterParameters({ includePagination = true }: { includePagination?: boolean } = {}) {
const { query } = useNavigation();
return useMemo(() => {
@@ -15,15 +15,20 @@ export function useFilterParameters() {
}
}
return {
const params = {
...filterParams,
search: query.search,
segment: query.segment,
cohort: query.cohort,
excludeBounce: query.excludeBounce,
match: query.match,
page: query.page,
pageSize: query.pageSize,
};
}, [query]);
} as Record<string, any>;
if (includePagination) {
params.page = query.page;
params.pageSize = query.pageSize;
}
return params;
}, [query, includePagination]);
}
+5 -5
View File
@@ -1,4 +1,4 @@
import { formatInTimeZone, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';
import { formatInTimeZone, fromZonedTime, toZonedTime } from 'date-fns-tz';
import { TIMEZONE_CONFIG, TIMEZONE_LEGACY } from '@/lib/constants';
import { getTimezone } from '@/lib/date';
import { setItem } from '@/lib/storage';
@@ -61,19 +61,19 @@ export function useTimezone() {
};
const toUtc = (date: Date | string | number) => {
return zonedTimeToUtc(date, timezone);
return fromZonedTime(date, timezone);
};
const fromUtc = (date: Date | string | number) => {
return utcToZonedTime(date, timezone);
return toZonedTime(date, timezone);
};
const localToUtc = (date: Date | string | number) => {
return zonedTimeToUtc(date, localTimeZone);
return fromZonedTime(date, localTimeZone);
};
const localFromUtc = (date: Date | string | number) => {
return utcToZonedTime(date, localTimeZone);
return toZonedTime(date, localTimeZone);
};
const canonicalizeTimezone = (timezone: string): string => {
+1 -1
View File
@@ -72,12 +72,12 @@ export function BoardSelect({
...buttonProps?.style,
},
}}
maxHeight={480}
listProps={{
...listProps,
renderEmptyState:
listProps?.renderEmptyState || (() => <Empty message={t(messages.noResultsFound)} />),
style: {
maxHeight: 'calc(42vh - 65px)',
width: 280,
...listProps?.style,
},
Loaded 100 of 159 files, more files were not shown because too many files have changed in this diff. Show more